zoukankan      html  css  js  c++  java
  • Directx11教程37 纹理映射(7)

        本章是在教程35、36的基础上来实现一个光照纹理结合的程序,就是把场景中旋转的cube加上纹理。

       lighttex.vs中顶点的结构现在为:

    struct VertexInputType
    {
        float4 position : POSITION;
        float3 normal : NORMAL;
        float2 tex : TEXCOORD0; //纹理坐标
        float4 Kd : DIFFUSE;
        float4 Ks: SPECULAR;
    };

    //纹理坐标
    output.tex = input.tex
    ;

    纹理坐标不做任何变化,只是单纯的从vs输出到ps中。

    lighttex.ps中,现在多了2个变量:

    Texture2D shaderTexture;
    SamplerState SampleType;

    分别表示纹理和纹理采样状态。

        纹理的颜色可以用hlsl函数float4 textureColor = shaderTexture.Sample(SampleType, input.tex);计算得到,最后我们把光照计算得到颜色和纹理采样的颜色用模式调制的方式(就是相乘)调和在一起,得到最终颜色。 finalcolor = finalcolor * textureColor;

      

        现在对CubeModelClass类做一些变化:

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

        定义一个私有成员变量TextureClass* m_Texture;用它来读取纹理,产生需要的纹理资源视图数据。在初始化函数中,我们装入纹理数据:

    bool CubeModelClass::Initialize(ID3D11Device* device, char* modelFilename,WCHAR* textureFilename)
        {
        bool result;

        // 装入模型数据,
        result = LoadModel(modelFilename);
        if(!result)
            {
            return false;
            }

        // 装入纹理数据.
        result = LoadTexture(device, textureFilename);
        if(!result)
            {
            return false;
            }


        // 初始化顶点缓冲和顶点索引缓冲.
        result = InitializeBuffers(device);
        if(!result)
            {
            return false;
            }

        return true;
        }

        接下来,我们就是新写一个LightTexShaderClass,用来处理纹理光照混合的shader处理,这个类和LightShaderClass的区别是多了一个采样状态的变量。

    //采样状态
    ID3D11SamplerState* m_sampleState
    ;

    这个状态设置后,会被传入ps中

    //设置采样状态
    deviceContext->PSSetSamplers(0, 1, &m_sampleState);

    程序运行后界面如下:

    image

    完整的代码请参考:

    工程文件myTutorialD3D11_30

    代码下载:

    https://files.cnblogs.com/mikewolf2002/d3d1127-28.zip

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

     

  • 相关阅读:
    二十三、java连接oracle数据库操作:jdbc
    四、正则表达式使用
    Linux常用命令大全
    消息队列的常见问题
    JVM:带你查看常见的问题,以及分析处方法
    JVM监控与调优
    缓存总结2
    缓存总结1
    消息队列mq总结
    Java集合Map基本方法
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2445978.html
Copyright © 2011-2022 走看看