• 热门专题

Directx教程11(26) 简单的光照模型(5)

作者:迈克老狼2012  发布日期:2012-04-10 11:48:04
Tag标签:Directx11  光照模型  
  •     在前面的工程中,我们都是在vs中实现顶点光照计算,然后再把顶点颜色传到ps中。本章中我们尝试fragment光照(或者说叫ps光照),在vs中,我们把顶点在世界坐标系中的法向和位置都直接传输到ps中。


    // 世界坐标系中的顶点法向. 
        float3 N = mul(input.normal, (float3x3)worldMatrix); 
        output.worldnormal= N; 
        
        //世界坐标系顶点位置 
        worldPosition = mul(input.position, worldMatrix); 
        output.worldposition =  worldPosition;
    
    

         vs光照和ps光照的区别到底是什么呢?

     

         其实很简单,对于vs光照来说,我们在vs中对每个顶点计算出了颜色,然后gpu的固定管线,会在ps之前,根据顶点颜色值,实施双线性差值,计算得出每个pixel的颜色。而对于ps光照,则是会差值每个顶点位置和方向,从而每个pixel都有一个自己相对应的位置和法向,而光照的计算则是在ps中完成。

         所以,使用ps光照,它的颜色过度会更柔和,没有vs光照那样的粗糙感。

        

         现在我们的ps函数如下:
     

    float4 LightPixelShader(PixelInputType input) : SV_TARGET 
    {
    
      float3 P = input.worldposition.xyz; 
      
      float3 N = normalize(input.worldnormal);
    
         //自发射颜色 
        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;
    
         float4 finalcolor = emissive + ambient + diffuse + specular;
    
    
      return finalcolor; 
        
    } 
    
    
    

       另外lightShaderClass中,我们还要把以前设置的vs材质光照常量缓冲,改成设置ps光照常量常量缓冲。

    // 设置光照材质常量缓冲.
    deviceContext->PSSetConstantBuffers(bufferNumber, 1, &m_lightmaterialBuffer);

     

       其它的代码几乎不用改变,程序执行后的效果如下:

     

    image

     

    完整的代码请参考:

    工程文件myTutorialD3D11_18

    代码下载:


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