Directx教程(27) 简单的光照模型(6)-阿里云开发者社区

开发者社区> 云计算> 正文

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

简介: 从myTutorialD3D11_15到myTutorialD3D11_19的工程中,我们都只有一个光源,光源的位置在LightClass中我设置为m_position = D3DXVECTOR4(5.0, 5.0, -3.0,1.0),所以我们渲染的cube,在前面,右侧,上面都没有问题,但是,我们通过A键移动摄像机后,会发现右侧的面没有光照效果。

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

image

现在我们将在场景中增加第二个光源,位置放在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的右侧面也有了不错的光照效果。

image

image

完整的代码请参考:

工程文件myTutorialD3D11_20

代码下载:

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

其他文章