3.1.1 允许多个纹理回忆一下,纹理是用IDirect3DDevice9::SetTexture方法设置,而采样器状态(sampler state)是用IDirect3DDevice9::SetSamplerState方法设置,原型如下: HRESULT IDirect3DDevice9::SetTexture(
DWORD Stage, // specifies the texture stage index
IDirect3DBaseTexture9 *pTexture ); HRESULT IDirect3DDevice9::SetSamplerState(
DWORD Sampler, // specifies the sampler stage index
D3DSAMPLERSTATETYPE Type,
DWORD Value ); 注意:一个特定的采样器阶段索引i与第i个纹理阶段(texture stage)相关联。也就是说,第i个采样器阶段指定了第i集(set)纹理的采样器状态。 纹理/采样器阶段索引标识了我们希望设置的纹理/采样器的纹理/采样器阶段。因此,我们可以允许多个纹理并通过使用不同的阶段索引设置其相应的采样器状态。在本书前面的部分中,我们总是指定0,来指示第一个阶段,因为我们一次仅使用一个纹理。所以例如,假设我们要允许三个纹理,我们像这样使用阶段0,1和2: // Set first texture and corresponding sampler states. Device->SetTexture(
0, Tex1); Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
// Set second texture and corresponding sampler states. Device->SetTexture(
1, Tex2); Device->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
// Set third texture and corresponding sampler states. Device->SetTexture(
2, Tex3); Device->SetSamplerState(2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(2, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); 这段代码允许Tex1, Tex2和Tex3,并设置每个纹理的过滤模式。 3.1.2 多纹理坐标回忆一下第六章,对于每个3D三角形,我们要在纹理上定义一个相应的三角形以映射到该3D三角形。我们通过对每个顶点增加纹理坐标完成这一点。因此,构成一个三角形的每三个顶点定义了一个在纹理上的对应的三角形。 因为我们现在需要使用多个纹理,对于每三个顶点定义的一个三角形,我们需要在每个被允许的纹理上定义一个相应的三角形。我们做这件事通过增加额外的纹理坐标的集合到每个顶点——每个顶点一集,而且相应地,每个允许的纹理。举个例子,如果我们混合三个纹理到一起,那么每个顶点必须有三集纹理坐标以索引到三个允许纹理。因此,一个三纹理的多纹理化顶点结构看起来可能像这样: struct MultiTexVertex {
MultiTexVertex(float x, float y, float z,
float u0, float v0,
float u1, float v1,
float u2, float v2)
{
_x =
x;
_y = y; _z = z;
_u0 = u0;
_v0 = v0;
_u1 = u1;
_v1 = v1;
_u2 = u2;
_v2 = v2;
}
float _x, _y, _z;
float _u0, _v0; // Texture coordinates for texture at stage 0.
float _u1, _v1; // Texture coordinates for texture at stage 1.
float _u2, _v2; // Texture coordinates for texture at stage 2.
static const DWORD FVF; }; const DWORD MultiTexVertex::FVF = D3DFVF_XYZ | D3DFVF_TEX3; 注意,指定自由顶点格式标记D3DFVF_TEX3表明顶点结构包含三集纹理坐标。固定功能管线支持最多八集纹理坐标。要使用多于八集,你必须使用顶点声明和可编程顶点管线。 注意:在较新的像素着色器版本中,我们可以使用一集纹理坐标以索引到多个纹理,并因此消除了对多个纹理坐标的需要。当然这得假设每个纹理阶段使用相同的纹理坐标。如果每个阶段的纹理坐标不同,则我们仍然需要多纹理坐标。 |