Directx11教程(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类也要发生一些变化。

完整的代码请参考:

工程文件myTutorialD3D11_23

代码下载:

稍后提供…

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

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

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

    工程 myTutorialD3D11_25的效果如下:

 

完整的代码请参考:

工程文件myTutorialD3D11_24、 myTutorialD3D11_25

代码下载:

稍后提供…

时间: 2024-07-31 08:01:33

Directx11教程(29) 简单的光照模型(8)的相关文章

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

     现在我们新建一个工程myTutorialD3D_23,在这个工程中,对前面一章的代码进行一些整理: 1.我们在顶点属性中增加材质的的漫反射系数和高光系数,前面我们放在一个光照材质结构中,这样我们能够比较灵活的定义不同顶点的材质属性,当然这也增加了顶点缓冲的大小. struct VertexType { D3DXVECTOR3 position; D3DXVECTOR3 normal; //法向 D3DXVECTOR4 Kd; //材质漫反射系数 D3DXVECTOR4 Ks; //材质

Directx教程(22) 简单的光照模型(1)

     在前面的教程中,我们在顶点属性中直接给顶点赋颜色,这样生成的三维物体缺乏真实感,如下图中两个立方体,左边的是通过光照生成物体表面颜色的,右边的则是直接给顶点赋颜色值.      首先,我们学习一下最简单的phong光照模型:       在phong光照模型中,物体表面的颜色由自发射光(emissive).环境光(ambient).漫反射光(diffuse)以及镜面高光(specular)四部分组成,每一部分又是通过物体表面的材质属性和光照属性一起来决定.用公式来表示就是:     

Directx11教程(54) 简单的基于GS的billboard实现

    本章我们用一个billboard的实现来学习D3D11中的GS.     在VS shader中,我们输入的是顶点位置及顶点属性,输出的也是顶点位置及顶点属性.在GS shader中,我们输入的是体元(primitive,可以是点,线,三角形等等,凡是D3D11中允许的体元都可以使用), 输出顶点.顶点属性,以及体元信息.     如下面两个图,左边对一个三角形做vs操作,则会对三个顶点v1,v2,v3分别执行顶点操作,右图对三角形做gs操作,则整个三角形做为输入,输出则为一个四面体(增

Directx教程(26) 简单的光照模型(5)

    在前面的工程中,我们都是在vs中实现顶点光照计算,然后再把顶点颜色传到ps中.本章中我们尝试fragment光照(或者说叫ps光照),在vs中,我们把顶点在世界坐标系中的法向和位置都直接传输到ps中.     // 世界坐标系中的顶点法向.     float3 N = mul(input.normal, (float3x3)worldMatrix);     output.worldnormal= N;         //世界坐标系顶点位置     worldPosition = m

Directx11教程(51) 简单的billboard

       billboard称作公告板,通常用一个quad(四边形)表示[有的billboard用两个正交的quad表示],它的特点就是始终面向摄像机的方向.在大规模场景渲染中,可以公告板上贴一个纹理,比如树,这样在比较远的场景中,可以用它表示模型数据,从而减少场景中的顶点数量.            假定xz平面是大地,y轴是向上的方向,则billboard和y轴的方向一致,随着摄像机位置的改变,billboard必须改变自己的世界坐标,始终朝向摄像机.       在billboard类

Directx教程(28) 简单的光照模型(7)

       现实生活中的点光源都是随着距离衰减的,比如一个电灯泡在近处会照的很亮,远处光线就很弱.本节中我们在前面光公式的基础上,再给漫反射和高光加上一个衰减因子.       光源随着距离衰减并不是纯线性的,常用的公式是: d 是光源到着色点的距离. kC, kL, 和 kQ 分别是常量.线性以及二次衰减系数. 现在在light.ps中,计算光照的代码变成了:   for ( i = 0; i < NUM_LIGHTS; i++)   {     //自发射颜色     emissive =

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

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

Directx教程(25) 简单的光照模型(4)

     在本篇日志中,我们尝试用不带衰减的点光源来计算漫反射颜色.     前面的三个工程,我们都用的是方向光源(directional light),它的特点是没有光源位置或者说光源位置位于无穷远处,且光线在各个方向都是平行的,所以在工程myTutorialD3D11_17中,我们看到的程序界面上,cube每个面上的颜色都是一样的[因为diffuse光占颜色的大部分].     方向光原理可用以下图表示:      现在我们尝试点光源,点光源原理如下:     因为计算漫反射时候,每个顶点的

Directx教程(24) 简单的光照模型(3)

     在工程myTutorialD3D11_17中,我们重新定义我们的cube顶点法向,每个三角形面的顶点法向都是和这个三角形的面法向是一致的.如下图所示:     在该工程中,我们还修改了CubeModelClass文件,从一个cube.txt文件中读cube顶点位置.法向.纹理坐标.     cube.txt的格式为: Vertex Count: 36 Data: -1.0  1.0 -1.0 0.0 0.0  0.0  0.0 -1.0      数据行前三个数据为顶点位置,接着两个数