代碼地址:https://github.com/sdlwlxf1/tinyEngine
終於實現了自己的軟渲染器,圖形學的學習暫時告一段落。代碼參考知乎上的韋易笑大神的回答,自己加入了很多功能包括:
- 將原來的Gouraud着色改為phong着色
- 加入一個平行光和4個點光源,物體材質
- 背面剔除
- 利用libpng讀取外部紋理
- 實現雙線性紋理濾波和mipmap
- 完整實現3D裁剪算法
- 簡單的投影
- 利用sdl2實現了mac、ios、windows多平台支持
- 3D漫游和object簡單封裝
知乎我的回答鏈接
工程目錄:
- external:依賴庫文件
- project:多平台項目工程以及跟平台相關代碼
- resources:核心代碼和資源
依賴庫:
跨平台的多媒體開發函數庫,非常好用,cocos2dx也使用到了它哦
版本是SDL2-2.0.5,我已經交叉編譯成了靜態庫,可以直接使用
跨平台的png格式讀取處理庫,如果靜態庫有問題,可以下載源代碼下載地址,自行編譯
多平台支持:
目前支持mac、ios、windows三個平台,android就暫時不弄了,過程太繁瑣。
(windows的release好像有問題)
下面是重點!!
想要通過該工程學習光柵化渲染的同學,請務必備好以下兩本書籍:
- 《3D數學基礎:圖形與游戲開發》(建議認真看完)
- 《3D游戲編程大師技巧》上下冊
還有其他一些其他資料可以輔助理解
《[計算機圖形學].(美國)Peter.Shirley》
learnopengl-cn一個學習opengl的網站,講解光影部分挺好
代碼簡介
tiny3D.h
核心的數學算法和光柵化渲染實現,掌握了它可以說你就徹底弄明白了光柵化渲染
數學部分,全部是重點,特別是矩陣操作等,透視矩陣和旋轉矩陣,是重中之重。
光柵化部分,為了實現phong光照加入了重心坐標計算,可能還有更好的實現方法,有能力的同學可以重構之。
main.c
非核心代碼,包括sdl和紋理處理,有能力的同學可以自己實現並移植到任何平台
關於學習方法
因為我也是通過參考大神韋易笑的代碼來學習圖形學的。這里我可以提供一些我的學習經驗
首先要端正自己的學習態度,不要認為軟渲染有多難,看整個實現也不過1000行左右代碼,當然也不要被這微小的代碼量所迷惑,量少就意味每一行代碼每一個函數都潛藏着巨大的知識量。如果有不明白的,一定要查閱上面提到的兩本書,比如透視和旋轉的算法公式,最好都要弄明白推導過程。然后自己實現一遍代碼,通過實踐加深對原理的理解。
數學部分在於理解,光柵化部分在於實現
請認真實現自己的光柵化部分,每個人的實現方法都不同,也許你的實現會更高效
個人認為軟渲染是學習圖形學的一個關鍵點。
等你也實現了自己的軟渲染引擎,再看unity3D和shader,就會有一種醍醐灌頂的感覺,甚至可以自行腦補其實現方法呢
下面是截圖: