zoukankan      html  css  js  c++  java
  • Directx教程(23) 简单的光照模型(2)

       在工程myTutorialD3D11_16中,我在文件light.vs中定义了一个材质光源属性常量缓冲

    //const buffer最好为4 float的倍数,否则创建const buffer会fail
    cbuffer LightMaterialBuffer
    {
        float4 lightPosition; //光源位置
        float4 lightColor;  //光源颜色
        float4 globalAmbient; //光源的环境光反射系数
        float4 cameraPosition; //摄像机的位置
        float4 Ke;  //材质的自发光
        float4 Ka;  //材质的环境光系数
        float4 Kd;  //材质的漫反射系数
        float4 Ks;  //材质的高光系数
        float3 lightDirection; //平行光方向
        float shininess; //高光指数
       
    };

        通过定义这个const buffer,我们可以在lightShaderClass中,来设置顶点材质和光源的各种属性。

    同时,我也修改了lightShaderClass类中的Render和SetShaderParameters函数接口,以便传入各种参数。

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

        现在来看,这两个函数参数很多,非常丑陋,在后面的工程中,我会只传入摄像机位置,其它的参数都是直接在colorShaderClass中赋值。

        程序执行后的效果如下:

    image

         不过可能是我的cubeModelClass中物体的法向定义问题,cube的后、左、下面都没能显示出来。在下一篇日志中,我会重新定义CubeModelClass中的顶点法向。

    image

    完整的代码请参考:

    工程文件myTutorialD3D11_16

    代码下载:

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

     

  • 相关阅读:
    linux下批量转换文件
    linux的最简socket编程
    war包部署到tomcat
    linux 重命名文件和文件夹
    Thread类的常用方法
    java.lang.Integer.MAX_VALUE;这是什么意思?
    java中 在一个异常处理中什么语句块是可多个的
    oracle条件参数中 IN函数中的值最大只能为1000个
    oracle判断一个字段为空
    javascript 六种数据类型
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2430885.html
Copyright © 2011-2022 走看看