1. 程式人生 > >Directx教程(25) 簡單的光照模型(4)

Directx教程(25) 簡單的光照模型(4)

wol images none 修改 www tdi borde 簡單 block

原文:Directx教程(25) 簡單的光照模型(4)

     在本篇日誌中,我們嘗試用不帶衰減的點光源來計算漫反射顏色。

    前面的三個工程,我們都用的是方向光源(directional light),它的特點是沒有光源位置或者說光源位置位於無窮遠處,且光線在各個方向都是平行的,所以在工程myTutorialD3D11_17中,我們看到的程序界面上,cube每個面上的顏色都是一樣的[因為diffuse光占顏色的大部分]。

    方向光原理可用以下圖表示:

技術分享圖片

     現在我們嘗試點光源,點光源原理如下:

技術分享圖片

    因為計算漫反射時候,每個頂點的漫反射顏色都和到光源位置向量有關,所以我們可以修改light.vs如下:

   //自發射顏色
    float4 emissive = Ke;
   
    //計算環境光
    float4 ambient = Ka * globalAmbient;
   
    //計算漫反射光
    //用LightDirection就是純平行光
    //光源位置減頂點位置,是不考慮衰減的點光源

     float3 L = normalize(lightPosition.xyz - P);
     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)