從mytutoriald3d11_15到mytutoriald3d11_19的工程中,我們都只有乙個光源,光源的位置在lightclass中我設定為m_position = d3dxvector4(5.0, 5.0, -3.0,1.0),所以我們渲染的cube,在前面,右側,上面都沒有問題,但是,我們通過a鍵移動攝像機後,會發現右側的面沒有光照效果。這是因為右側面的法向是-x方向,漫反射光和高光都為0,所以效果很差。
現在我們將在場景中增加第二個光源,位置放在setlightposition(-8.0, -4.0, 5.0,1.0);,**的主要改動如下:
1、除了攝像機位置外,材質光源等其它屬性設定,都放在lightshaderclass類中,我們可以看到render和setshaderparameters兩個函式的引數變少了很多。
bool render(id3d11devicecontext* , int , d3dxmatrix , d3dxmatrix , d3dxmatrix , d3dxvector4);
bool setshaderparameters(id3d11devicecontext* , d3dxmatrix , d3dxmatrix , d3dxmatrix, d3dxvector4);
2、在common.h中定義乙個巨集表示光源的數量。
#define num_lights 2
現在,lightshaderclass中材質光源結構變成了:
struct lightmaterialbuffertype
;3、同樣,light.ps中的材質光源常量緩衝也要做相應的改變,然後在生成光照顏色時,我們通過乙個for迴圈來累加每個光源的貢獻。
程式執行後的效果如下,我們可以看到cube的右側面也有了不錯的光照效果。
完整的**請參考:
工程檔案mytutoriald3d11_20
Directx教程 24 簡單的光照模型 3
在工程mytutoriald3d11 17中,我們重新定義我們的cube頂點法向,每個三角形面的頂點法向都是和這個三角形的面法向是一致的。如下圖所示 在該工程中,我們還修改了cubemodelclass檔案,從乙個cube.txt檔案中讀cube頂點位置 法向 紋理座標。cube.txt的格式為 v...
Directx11教程 20 乙個簡單的水面
nnd,以前發的這篇教程怎麼沒有了?是我自己誤刪除了,還是被系統刪除了?找不到存稿了,沒有心情再寫一遍了。簡單說一下,本篇教程就是實現乙個水面的動畫,主要是利用動態頂點緩衝,在每一幀都改變頂點的值,從而實現水面的動畫。主要參考的是 introduction to 3d game programmin...
Directx11教程 20 乙個簡單的水面
nnd,以前發的這篇教程怎麼沒有了?是我自己誤刪除了,還是被系統刪除了?找不到存稿了,沒有心情再寫一遍了。簡單說一下,本篇教程就是實現乙個水面的動畫,主要是利用動態頂點緩衝,在每一幀都改變頂點的值,從而實現水面的動畫。主要參考的是 introduction to 3d game programmin...