• 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

  • 相关阅读:
    强迫症
    bzoj1758 [Wc2010]重建计划
    bzoj1070 [SCOI2007]修车
    bzoj3675 [Apio2014]序列分割
    bzoj1010 [HNOI2008]玩具装箱toy
    bzoj3697 采药人的路径
    bzoj2152 聪聪可可
    bzoj2599 [IOI2011]Race
    Ubuntu 18.04 LTS 下 GTK3 安装与编译
    启动或重启 dnsmasq 提示端口 53 被占用的解决方案
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2430955.html
Copyright © 2020-2023  润新知