注:这里讲的纹理指的是贴在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
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!