• 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

  • 相关阅读:
    Silverlight第三方控件收集
    我们三十以后才明白
    修复编译Silverlight&quot;不能找到AppManifest.xaml&rdquo;的错误
    Android消息通知
    理解和认识udev
    QT进度条
    WARNING: Application does not specify an API level requirement!
    Linux设备驱动中的异步通知与异步I/O
    Qtopia2.2.0 的配置和交叉编译
    Android Menus
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2430955.html
Copyright © 2020-2023  润新知