注:这里讲的纹理指的是贴在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 );
//光照处理..