原文:Directx教程(27) 简单的光照模型(6)

     从myTutorialD3D11_15到myTutorialD3D11_19的工程中,我们都只有一个光源,光源的位置在LightClass中我设置为m_position = D3DXVECTOR4(5.0, 5.0, -3.0,1.0),所以我们渲染的cube,在前面,右侧,上面都没有问题,但是,我们通过A键移动摄像机后,会发现右侧的面没有光照效果。这是因为右侧面的法向是-x方向,漫反射光和高光都为0,所以效果很差。

现在我们将在场景中增加第二个光源,位置放在SetLightPosition(-8.0, -4.0, 5.0,1.0);,代码的主要改动如下:

     1、除了摄像机位置外,材质光源等其它属性设置,都放在LightShaderClass类中,我们可以看到Render和SetShaderParameters两个函数的参数变少了很多。

bool Render(ID3D11DeviceContext* , int , D3DXMATRIX , D3DXMATRIX , D3DXMATRIX , D3DXVECTOR4);
bool SetShaderParameters(ID3D11DeviceContext* , D3DXMATRIX , D3DXMATRIX , D3DXMATRIX, D3DXVECTOR4);
    

    2、在common.h中定义一个宏表示光源的数量。

#define NUM_LIGHTS 2

 

      现在,LightShaderClass中材质光源结构变成了:

struct  LightMaterialBufferType
    {
    D3DXVECTOR4 lightPosition[NUM_LIGHTS]; //光源位置
    D3DXVECTOR4 lightColor[NUM_LIGHTS];   //光源颜色
    D3DXVECTOR4 globalAmbient[NUM_LIGHTS]; //光源的环境光反射系数
    D3DXVECTOR4 cameraPosition; //摄像机的位置
    D3DXVECTOR4 Ke[NUM_LIGHTS];  //材质的自发光
    D3DXVECTOR4 Ka[NUM_LIGHTS];  //材质的环境光系数
    D3DXVECTOR4 Kd[NUM_LIGHTS];  //材质的漫反射系数
    D3DXVECTOR4 Ks[NUM_LIGHTS];  //材质的高光系数
    D3DXVECTOR3 lightDirection[NUM_LIGHTS]; //平行光方向
    float shininess[NUM_LIGHTS]; //高光指数
     };

     3、同样,light.ps中的材质光源常量缓冲也要做相应的改变,然后在生成光照颜色时,我们通过一个for循环来累加每个光源的贡献。

     程序执行后的效果如下,我们可以看到cube的右侧面也有了不错的光照效果。

完整的代码请参考:

工程文件myTutorialD3D11_20

代码下载:

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

最新文章

  1. POJ2794 Double Patience[离散概率 状压DP]
  2. C# Marshal.GetActiveObject() 遭遇 HRESULT:0x800401E3 (MK_E_UNAVAILABLE))
  3. 不可或缺 Windows Native (15) - C++: 命名空间
  4. ZooKeeper----Java实例文档
  5. 线性布局通过适配器可以动态加载view
  6. AndroidStudio开发出现Warning:Gradle version 2.10 is required. Current version is 2.8. If u
  7. 栅格数据处理 RasterDataset RasterLayer Raster RasterBandCollection
  8. Win7下判断当前进程是否以管理员身份运行
  9. 【Django】如何按天 小时等查询统计?
  10. jquery easy ui 1.3.4 事件与方法的使用(3)
  11. ajax请求成功后打开新窗口地址
  12. iOS - MVVM 架构模式
  13. java根据sessionid获取session
  14. 【高斯消元】BZOJ 1770: [Usaco2009 Nov]lights 燈
  15. Android - 向服务器发送数据(GET).
  16. Send竞争对手:百度云一小时,QQ超大附件最多支持2G,邮件附件20M到50M不等(附国外所有storage列表)——痛点是,最大传输2G,最大容量只有3G(和微云不是一回事),转存到微云文件不能超过1G
  17. 图论+dp poj 1112 Team Them Up!
  18. Ubuntu抛弃了Untiy转向Gnome,美化之路怎么办?不用怕咱一步一步大变身!
  19. 简易发号SQL,可用于生成指定前缀自增序列,如订单号,生成优惠券码等
  20. js时间过滤方法

热门文章

  1. Spring注解驱动开发(二)-----生命周期、属性赋值
  2. Echarts在Vue中的使用
  3. springmvc 串口读写 基于win7使用txrx netbeans jdk1.8 maven的
  4. Vue. 之 替换 左上角 title标签处的图标
  5. js之简单工厂模式
  6. python在WIN下CMD运行中文乱码及python 2.x python 3.x编码问题
  7. ECS应用管理最佳实践
  8. JNI初级:android studio生成so文件详细过程
  9. LintCode_453 将二叉树拆成链表
  10. Springmvc使用阿里巴巴的fastjson传输到前台中文乱码的解决方案,他娘的大家都少制造垃圾,学习过程将会多么快乐