https://github.com/liyonghelpme/softRenderEngine.git php
一 soft rendering engine 介紹java
如今遊戲在屏幕上渲染模型和圖像,是經過opengl 或者directx api, 將頂點, 法向量以及紋理座標,紋理圖片數據提交給gpu來渲染的.git
早期pc 經過 cpu 計算, 直接在屏幕上繪製像素點來顯示3d對象.github
實現cpu 上的3d 算法, 投影像素點到屏幕上,則是 屬於soft rendering 軟件渲染 方法.算法
一般的3d 建模軟件都實現有軟件渲染算法.
typescript
二:基本原理api
首先在內存中 渲染出每一個像素, 接着將這片內存數據 傳入到 gpu中, 在屏幕上顯示出來.app
cocos2dx 中 CCSprite 是一個能夠在屏幕上顯示的對象.post
CCTexture2D 對應gpu中的資源,能夠將 內存中生成的紋理數據 傳給CCTexture2D 經過CCTexture2D 傳入到 gpu中.
kazmath 庫能夠幫助來作3d 矩陣計算.
渲染一個3d 對象基本流程是:
使用modelview 矩陣變換對象, 使用projection 矩陣計算出定點在屏幕上的位置.
根據須要繪製的對象 採用不一樣的算法,進行像素點的填充.
二 繪製點
對定點作 兩個矩陣變換以後, 獲得的就是定點在屏幕上的位置, 直接根據這個位置修改對應 像素點的值便可.
三 繪製線
採用中點遞歸算法繪製 線, 取線段中點, 分別遞歸繪製 兩個子線段便可.
四 填充三角面片 以及z buffer 算法
採用掃面線算法繪製三角面片 逐行在屏幕上繪製便可.
五 光照 shade 着色
flat shading
gouraud shading
擁有了掃描線算法以後, 能夠在着色階段, 進行像素點的光照顏色插值, 便可繪製每一個像素的光照顏色.
六 紋理貼圖
相似於光照着色. 這裏建模時給每一個定點肯定紋理座標. 接着程序中加載紋理圖片, 在着色階段,對每一個像素點 插值計算紋理座標, 接着查詢 加載的紋理圖片對應點的顏色, 着色便可.
須要注意的是 blender 中模型的紋理座標 和圖片像素數據的座標的Y 軸方向是相反的.
七 shadowMap 陰影貼圖
http://fabiensanglard.net/shadowmapping/index.php
shadowMap 算法基本原理 須要一個 從光源角度 獲取場景的一個深度紋理,對於點光源,須要作一個cube map 6個方向, 對於方向光源只須要一個深度緩衝。
首先對場景中的 對象渲染到光源深度緩衝中。
接着從正常攝像機位置渲染對象。 渲染每一個像素的時候,根據像素的世界座標,計算像素對應的 光源深度貼圖中的 紋理座標, 比較 轉化後的深度和 光源貼圖中的深度,若是大於則 表示像素在陰影中,這時候能夠調低像素顏色便可。