Directx教程(29) 简单的光照模型(8)

     现在我们新建一个工程myTutorialD3D_23,在这个工程中,对前面一章的代码进行一些整理:

1、我们在顶点属性中增加材质的的漫反射系数和高光系数,前面我们放在一个光照材质结构中,这样我们能够比较灵活的定义不同顶点的材质属性,当然这也增加了顶点缓冲的大小。

struct VertexType
{
D3DXVECTOR3 position;
D3DXVECTOR3 normal; //法向
D3DXVECTOR4 Kd; //材质漫反射系数
D3DXVECTOR4 Ks; //材质的高光系数
};


2、在common.h定义三个结构,分别表示光照、材质和摄像机,它们分别和ps中三个常量缓冲相对应。

common.h

struct LightBufferType
{
D3DXVECTOR4 lightPosition[NUM_LIGHTS]; //光源位置
D3DXVECTOR4 lightColor[NUM_LIGHTS]; //光源颜色
D3DXVECTOR4 globalAmbient[NUM_LIGHTS]; //光源的环境光反射系数
D3DXVECTOR4 attenuation[NUM_LIGHTS]; //衰减系数,x,y,z对应常量,线性和二次系数
D3DXVECTOR4 spotlight[NUM_LIGHTS]; //对于spotlight,x,y分别存储内和外角cos值
D3DXVECTOR3 lightDirection[NUM_LIGHTS]; //平行光方向
float shininess[NUM_LIGHTS]; //高光指数

};

struct MaterialBufferType
{
D3DXVECTOR4 Ke; //材质的自发光
D3DXVECTOR4 Ka; //材质的环境光系数
};

struct CameraBufferType
{
D3DXVECTOR4 cameraPosition; //摄像机的位置
};

相应的light.ps以及各个model类也要发生一些变化。

程序执行后的最终效果如下:

image

完整的代码请参考:

工程文件myTutorialD3D11_23

代码下载:

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

 

     接下来的myTutorialD3D11_24、myTutorialD3D11_25分别是简单地形和简单水面的光照版本。代码是myTutorialD3D11_23和myTutorialD3D11_13、myTutorialD3D11_14的组合。

    在这两个工程中,我在GraphicsClass的Render函数中增加dt,以便动态改变光源位置。

myTutorialD3D11_24的程序执行效果如下,因为有2个光源,且都有spot效果,一个光源位置还会一直转动,所以可以看到明暗的变化:

image

工程 myTutorialD3D11_25的效果如下:

image

 

完整的代码请参考:

工程文件myTutorialD3D11_24、 myTutorialD3D11_25

代码下载:

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

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

编辑推荐:
· 基于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
点击右上角即可分享
微信分享提示