zoukankan      html  css  js  c++  java
  • Directx教程(25) 简单的光照模型(4)

         在本篇日志中,我们尝试用不带衰减的点光源来计算漫反射颜色。

        前面的三个工程,我们都用的是方向光源(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

    代码下载:

    https://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip

  • 相关阅读:
    OCA读书笔记(11)
    shell命令--rev
    OCA读书笔记(10)
    shell命令--cut
    OCA读书笔记(9)
    shell命令--tail
    天气的研究
    网络知识汇总(2)
    shell命令--head
    OCM读书笔记(2)
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2430955.html
Copyright © 2011-2022 走看看