• 热门专题

Directx11教程(25) 简单的光照模型(4)

作者:迈克老狼2012  发布日期:2012-04-10 11:42:29
Tag标签:Directx11  光照模型  
  •      在本篇日志中,我们尝试用不带衰减的点光源来计算漫反射颜色。

     

        前面的三个工程,我们都用的是方向光源(directional light),它的特点是没有光源位置或者说光源位置位于无穷远处,且光线在各个方向都是平行的,所以在工程myTutorialD3D11_17中,我们看到的程序界面上,cube每个面上的颜色都是一样的[因为diffuse光占颜色的大部分]。

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

    image

         现在我们尝试点光源,点光源原理如下:

    image

        因为计算漫反射时候,每个顶点的漫反射颜色都和到光源位置向量有关,所以我们可以修改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的计算,我们这儿取归一化的光源顶点->光源向量。

    程序的最终效果如下,看以看出比前一个工程中的方向光的效果要好一些:

     

    image

    完整的代码请参考:

    工程文件myTutorialD3D11_18

    代码下载:


    http://down1.it165.net/pro/201204/0410myTutorialD3D11.zip
About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规