D3D中的纹理映射

注:这里讲的纹理指的是贴在3D物体表面的一层像素,并不涉及问题的其他用途。

在篇文档《D3D中的光照》中,我们为每个顶点指定了材质(漫反射材质和高光材质)。

在这里,我们放弃顶点材质的做法,使用纹理作为物体的材质(即对应的漫反射纹理贴图,高光纹理贴图)。

在程序中使用纹理,可以大致分为两个阶段。第一阶段,从硬盘中读取文件(C++程序),第二阶段在着色器程序中使用纹理进行一系列计算。

一、

1)从硬盘中创建漫反射,高光纹理图。

ID3D10ShaderResourceView* mDiffuseMapRV;
ID3D10ShaderResourceView* mSpecMapRV;
D3DX10CreateShaderResourceViewFromFile(md3dDevice, 
        L"WoodCrate01.dds", 0, 0, &mDiffuseMapRV, 0 );
D3DX10CreateShaderResourceViewFromFile(md3dDevice, 
        L"defaultspec.dds", 0, 0, &mSpecMapRV, 0 );

2)将纹理资源视图与效果文件中的纹理变量关联起来

//guan lian 
mfxDiffuseMapVar = mFX->GetVariableByName("gDiffuseMap")->AsShaderResource();
mfxSpecMapVar    = mFX->GetVariableByName("gSpecMap")->AsShaderResource();
//geng xin
mfxDiffuseMapVar->SetResource(mDiffuseMapRV);
mfxSpecMapVar->SetResource(mSpecMapRV);

二、

1)效果文件中的纹理变量

Texture2D gDiffuseMap;
Texture2D gScepMap;

2)纹理采样器,用于处理分辨率不同的纹理。

SamplerState gTriLinearSam
{
    Filter = MIN_MAG_MIP_LINEAR;//这只是一个例子
//可选的寻址模式
//    AddressU = MIRROR;
//    AddressV = MIRROR;
};

3)像素着色器中纹理的处理过程

(注意:纹理实际上可以在任何着色器中使用,不只是像素着色器。另外,顶点中的纹理坐标进入像素着色器前要先经过纹理坐标变换)

vOut.texC  = mul(float4(vIn.texC, 0.0f, 1.0f), gTexMtx);
//不做复杂处理,直接转换输出

在像素着色器中:

//使用对应的纹理采样器和纹理坐标,Sample输出
float4 diffuse = gDiffuseMap.Sample( gTriLinearSam, pIn.texC );
float4 spec    = gSpecMap.Sample( gTriLinearSam, pIn.texC );

//光照处理..

原文链接: https://www.cnblogs.com/CAION/archive/2013/02/22/2922593.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/78675

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午6:38
下一篇 2023年2月9日 下午6:38

相关推荐