在工程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中赋值。
程序执行后的效果如下:
不过可能是我的cubeModelClass中物体的法向定义问题,cube的后、左、下面都没能显示出来。在下一篇日志中,我会重新定义CubeModelClass中的顶点法向。
完整的代码请参考:
工程文件myTutorialD3D11_16
代码下载:
https://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip