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

  • 相关阅读:
    分布式系统与机器学习相关笔记
    天坑:OpenGL制作游戏引擎备忘记录
    2016ACM-ICPC 大连站、青岛站、China-Final 赛后总结(无删版)by wanglangzhe || wmzksana
    CF 609E, 树链剖分
    CF 609F,线段树上二分 + set维护
    CF 540E, 树状数组
    hdu 5726, 2016多校1
    hdu5836, 2016CCPC网络赛
    SYSU-10,URAL 1675,容斥原理
    动态规划基础篇 from 51nod
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2430955.html
Copyright © 2011-2022 走看看