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

 

 

posted on   迈克老狼2012  阅读(1577)  评论(1编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程

导航

< 2012年4月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12
点击右上角即可分享
微信分享提示