Directx教程(25) 簡單的光照模型(4)
在本篇日誌中,我們嘗試用不帶衰減的點光源來計算漫反射顏色。
前面的三個工程,我們都用的是方向光源(directional light),它的特點是沒有光源位置或者說光源位置位於無窮遠處,且光線在各個方向都是平行的,所以在工程myTutorialD3D11_17中,我們看到的程序界面上,cube每個面上的顏色都是一樣的[因為diffuse光占顏色的大部分]。
方向光原理可用以下圖表示:
現在我們嘗試點光源,點光源原理如下:
因為計算漫反射時候,每個頂點的漫反射顏色都和到光源位置向量有關,所以我們可以修改light.vs如下:
//自發射顏色
float4 emissive = Ke;
//計算環境光
float4 ambient = Ka * globalAmbient;
//計算漫反射光
//用LightDirection就是純平行光
//光源位置減頂點位置,是不考慮衰減的點光源
float diffuseLight = max(dot(N, L), 0);
float4 diffuse = Kd * lightColor * diffuseLight;
//計算高光
float3 V = normalize(cameraPosition.xyz - P);
float3 H = normalize(L + V);
float specularLight = pow(max(dot(N, H), 0), shininess);
if ( diffuseLight <= 0)
specularLight = 0;
float4 specular = Ks * lightColor * specularLight;
output.color = emissive + ambient + diffuse + specular;
註意L的計算,我們這兒取歸一化的光源頂點->光源向量。
程序的最終效果如下,看以看出比前一個工程中的方向光的效果要好一些:
完整的代碼請參考:
工程文件myTutorialD3D11_18
代碼下載:
http://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip
Directx教程(25) 簡單的光照模型(4)