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

//光照处理..
posted on 2013-02-22 17:14  曾健  阅读(1268)  评论(0编辑  收藏  举报