cocos2dx 實現軟渲染引擎 soft rendering engine

http://blogs.msdn.com/b/davrous/archive/2013/06/13/tutorial-series-learning-how-to-write-a-3d-soft-engine-from-scratch-in-c-typescript-or-javascript.aspxjavascript


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


https://github.com/liyonghelpme/softRenderEngine/tree/shadowMap


shadowMap 算法基本原理 須要一個 從光源角度 獲取場景的一個深度紋理,對於點光源,須要作一個cube  map 6個方向, 對於方向光源只須要一個深度緩衝。

首先對場景中的 對象渲染到光源深度緩衝中。

接着從正常攝像機位置渲染對象。 渲染每一個像素的時候,根據像素的世界座標,計算像素對應的 光源深度貼圖中的 紋理座標, 比較 轉化後的深度和 光源貼圖中的深度,若是大於則 表示像素在陰影中,這時候能夠調低像素顏色便可。

相關文章
相關標籤/搜索