Directx教程(27) 简单的光照模型(6)
???? 從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
??? {
??? D3DXVECTOR4 lightPosition[NUM_LIGHTS]; //光源位置
??? D3DXVECTOR4 lightColor[NUM_LIGHTS];?? //光源顏色
??? D3DXVECTOR4 globalAmbient[NUM_LIGHTS]; //光源的環境光反射系數
??? D3DXVECTOR4 cameraPosition; //攝像機的位置
??? D3DXVECTOR4 Ke[NUM_LIGHTS];? //材質的自發光
??? D3DXVECTOR4 Ka[NUM_LIGHTS];? //材質的環境光系數
??? D3DXVECTOR4 Kd[NUM_LIGHTS];? //材質的漫反射系數
??? D3DXVECTOR4 Ks[NUM_LIGHTS];? //材質的高光系數
??? D3DXVECTOR3 lightDirection[NUM_LIGHTS]; //平行光方向
??? float shininess[NUM_LIGHTS]; //高光指數
???? };
???? 3、同樣,light.ps中的材質光源常量緩沖也要做相應的改變,然后在生成光照顏色時,我們通過一個for循環來累加每個光源的貢獻。
???? 程序執行后的效果如下,我們可以看到cube的右側面也有了不錯的光照效果。
完整的代碼請參考:
工程文件myTutorialD3D11_20
代碼下載:
http://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip
posted on 2019-05-06 08:30 NET未來之路 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/lonelyxmas/p/10817604.html
總結
以上是生活随笔為你收集整理的Directx教程(27) 简单的光照模型(6)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java并发编程之线程池及示例
- 下一篇: Directx11教程(14) D3D1