• 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

  • 相关阅读:
    MySQL 学习(六) InnoDB事务及MVCC
    MySQL学习(二) 存储过程
    一个二级缓存实例 (多级缓存)
    MySQL 学习(五) InnoDB架构
    验证POST接口是否可跨域(自用小工具,自用测试页面)
    用WindowsAppSDK(WASDK)优雅的开发上位机应用
    用PC windows作为Mac macos的扩展屏
    第一次使用webpack
    前端代码压缩工具closesure compiler
    JS代码操作CSS样式文件
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2435291.html
Copyright © 2020-2023  润新知