edwardwewe | 2007-05-18 17:20 | 第08章 使用多重纹理 ***p149-151 哪些应用到多重纹理? 黑暗映射、发光映射、细节映射。
多次渲染(Mulitpass Rendering) 多重纹理(mulitexturing):在一次渲染中访问到2张或更多纹理。
颜色操作时通过D3DTSS_COLOROP来设置的。大致代码如下: m_pd3dDevice->SetRenderState(0, D3DTSS_COLORARG1, arg); m_pd3dDevice->SetRenderState(0, D3DTSS_COLORARG2, arg); m_pd3dDevice->SetRenderState(0, D3DTSS_COLOROP, op);
其中可用的op参数,位于D3DTEXTUREOP枚举中: typedef enum D3DTEXTUREOP { D3DTOP_DISABLE = 1, D3DTOP_SELECTARG1 = 2, D3DTOP_SELECTARG2 = 3, D3DTOP_MODULATE = 4, D3DTOP_MODULATE2X = 5, D3DTOP_MODULATE4X = 6, D3DTOP_ADD = 7, D3DTOP_ADDSIGNED = 8, D3DTOP_ADDSIGNED2X = 9, D3DTOP_SUBTRACT = 10, D3DTOP_ADDSMOOTH = 11, D3DTOP_BLENDDIFFUSEALPHA = 12, D3DTOP_BLENDTEXTUREALPHA = 13, D3DTOP_BLENDFACTORALPHA = 14, D3DTOP_BLENDTEXTUREALPHAPM = 15, D3DTOP_BLENDCURRENTALPHA = 16, D3DTOP_PREMODULATE = 17, D3DTOP_MODULATEALPHA_ADDCOLOR = 18, D3DTOP_MODULATECOLOR_ADDALPHA = 19, D3DTOP_MODULATEINVALPHA_ADDCOLOR = 20, D3DTOP_MODULATEINVCOLOR_ADDALPHA = 21, D3DTOP_BUMPENVMAP = 22, D3DTOP_BUMPENVMAPLUMINANCE = 23, D3DTOP_DOTPRODUCT3 = 24, D3DTOP_MULTIPLYADD = 25, D3DTOP_LERP = 26, D3DTOP_FORCE_DWORD = 0x7fffffff, } D3DTEXTUREOP, *LPD3DTEXTUREOP;
D3DTOP_DISABLE:无效 D3DTOP_SELECTARG1:第1个被选择的参数
D3DTOP_SELECTARG2:第2个被选择的参数
D3DTOP_MODULATE 将参数的每个成分相乘
D3DTOP_MODULATE2X 将参数的每个成分相乘,并将乘积左移1位(等同于乘以2的效果)以使其变得更亮
D3DTOP_MODULATE4X 将参数的每个成分相乘,并将乘积左移2位(等同于乘以4的效果)以使其变得更亮
D3DTOP_ADD Add the components of the arguments.
D3DTOP_ADDSIGNED Add the components of the arguments with a - 0.5 bias, making the effective range of values from - 0.5 through 0.5.
D3DTOP_ADDSIGNED2X Add the components of the arguments with a - 0.5 bias, and shift the products to the left 1 bit.
D3DTOP_SUBTRACT Subtract the components of the second argument from those of the first argument.
D3DTOP_ADDSMOOTH Add the first and second arguments; then subtract their product from the sum.
D3DTOP_BLENDDIFFUSEALPHA 使用由每个顶点计算而得的alpha插值来线性混合本纹理阶段。
D3DTOP_BLENDTEXTUREALPHA 使用本阶段纹理中的alpha来线性混合本纹理阶段。
D3DTOP_BLENDFACTORALPHA 使用通过D3DRS_TEXTUREFACTOR 渲染状态设置的alpha标量来线性混合本纹理阶段。
D3DTOP_BLENDTEXTUREALPHAPM 使用一个预乘alpha来线性混合本纹理阶段。
D3DTOP_BLENDCURRENTALPHA 使用来自上一纹理阶段的alpha来线性混合本纹理阶段。
D3DTOP_PREMODULATE D3DTOP_PREMODULATE is set in stage n. The output of stage n is arg1. Additionally, if there is a texture in stage n + 1, any D3DTA_CURRENT in stage n + 1 is premultiplied by texture in stage n + 1. D3DTOP_MODULATEALPHA_ADDCOLOR D3DTSS_COLOROP 参数,使用第1个参数alpha来调制第2个参数的颜色,然后将结果加上第1个参数。Result = Arg1RGB+ Arg1Alpha* Arg2RGB
D3DTOP_MODULATECOLOR_ADDALPHA Modulate the arguments; then add the alpha of the first argument. This operation is supported only for color operations (D3DTSS_COLOROP).
D3DTOP_MODULATEINVALPHA_ADDCOLOR Similar to D3DTOP_MODULATEALPHA_ADDCOLOR, but use the inverse of the alpha of the first argument. This operation is supported only for color operations (D3DTSS_COLOROP).
D3DTOP_MODULATEINVCOLOR_ADDALPHA Similar to D3DTOP_MODULATECOLOR_ADDALPHA, but use the inverse of the color of the first argument. This operation is supported only for color operations (D3DTSS_COLOROP).
D3DTOP_BUMPENVMAP Perform per-pixel bump mapping, using the environment map in the next texture stage, without luminance. This operation is supported only for color operations (D3DTSS_COLOROP). D3DTOP_BUMPENVMAPLUMINANCE Perform per-pixel bump mapping, using the environment map in the next texture stage, with luminance. This operation is supported only for color operations (D3DTSS_COLOROP). D3DTOP_DOTPRODUCT3 Modulate the components of each argument as signed components, add their products; then replicate the sum to all color channels, including alpha. This operation is supported for color and alpha operations.
In DirectX 6 and DirectX 7, multitexture operations the above inputs are all shifted down by half (y = x - 0.5) before use to simulate signed data, and the scalar result is automatically clamped to positive values and replicated to all three output channels. Also, note that as a color operation this does not updated the alpha it just updates the RGB components. However, in DirectX 8.1 shaders you can specify that the output be routed to the .rgb or the .a components or both (the default). You can also specify a separate scalar operation on the alpha channel. D3DTOP_MULTIPLYADD 完成一个累积乘法(multiply-accumulate)操作。它取2个参数相乘,然后将乘积加上另一个输入/源参数,最后将和作为结果。 Result = Arg0+ Arg1* Arg2 SRGBA = Arg1 + Arg2 * Arg3 D3DTOP_LERP 根据第1个源参数指定的比例计算第2、3个源参书的线性插值。 Result = (Arg0)*Arg1 +(1-Arg0)*Arg2 SRGBA = (Arg1) * Arg2 + (1- Arg1) * Arg3. D3DTOP_FORCE_DWORD Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.
每种颜色操作可接受最多3个颜色参数:D3DTSS_COLORARG0、D3DTSS_COLORARG1、D3DTSS_COLORARG2,可以将这些颜色参数设为以下值: D3DTA_DIFFUSE,使用漫反射颜色,这种颜色是在使用Gouraud着色时,对顶点成分中的漫反射颜色作插值计算而得的; D3DTA_SPECULAR,使用镜面反射颜色,这种颜色是在使用Gouraud着色时,对顶点成分中的镜面反射颜色作插值计算而得的; D3DTA_TFACTOR,使用纹理系数,可事先通过渲染状态D3DRS_TEXTUREFACTOR调用SetRenderState()来设置的纹理系数; D3DTA_TEXTURE,使用本文里阶段的纹理颜色; D3DTA_CURRENT,使用上一个混合阶段的结果; D3DTA_TEMP,使用一个用于读/写的临时寄存器颜色; D3DTA_ALPHAREPLICATE,复制alpha信息; D3DTA_COMPLEMENT,对颜色参数取反。
8.2.1 黑暗映射(Darkl Mapping)p134 逐顶点(per-vertex)计算方式的缺点:参与计算和实际计算的是三角形的每个顶点,而不是对每个像素进行的渲染。这导致如果顶点未受到光照,或受到很少光照(比如光源在三角形中央或靠近中央时,整个三角形只有非常少的光亮,并且它的中央会有一个亮点),则无法计算出正确的三角形面的颜色。
将2张纹理的颜色相乘称为:“光照映射(light mapping)”,由于这种技术经常被用于使一张纹理变暗,所以也称“黑暗映射”。 实例代码: m_pd3dDevice->SetTexture(0, m_pWallTexture); m_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE); //将D3DTA_TEXTURE作为D3DTSS_COLORARG1的值 m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pd3dDevice->SetTexture(1, m_pEnvTexture); m_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0); m_pd3dDevice->SetTextureStageState (1, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState (1, D3DTSS_ COLORARG2, D3DTA_CURRENT); m_pd3dDevice->SetTextureStageState (1, D3DTSS_COLOROP, D3DTOP_MODULATE); 第1个阶段(阶段0)的默认操作是D3DTOP_MODULATE;其他纹理阶段的默认操作是D3DTOP_DISABLE。
下面的代码和上面的效果相同,通过多次渲染技术: //Set texture for the cube m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); m_pd3dDevice->SetTextureStageState (D3DRS_ALPHABLENDENABLE, FALSE); m_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); m_pd3dDevice->SetTexture(0, m_pWallTexture); //draw polygon //Set darkmap m_pd3dDevice->SetTextureStageState (D3DRS_ALPHABLENDENABLE, TRUE); m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ ZERO); m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR); m_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); m_pd3dDevice->SetTexture(1, m_pEnvTexture); //draw polygon
其中alpha混合公式: FinalColor = SourcePixelColor * 0.0 + DestPixelColor * SourcePixelColor
8.2.3 混合纹理和材质漫反射颜色p138 基础贴图+漫反射插值 实例代码: m_pd3dDevice->SetTexture(0, m_pWallTexture); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_ADD);
在固定功能的流水线中,有3种获取漫反射颜色的途径,即从以下途径获取: 材质:D3DMCS_MATERIAL 漫反射顶点颜色:D3DMCS_COLOR1 镜面反射顶点颜色:D3DMCS_COLOR2
从何处获取漫反射颜色取决于SetRenderState()函数中的D3DRS_DIFFUSEMATERIALSOURCE参数: SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL) 默认颜色源为漫反射顶点颜色:D3DMCS_COLOR1。如果还未选择颜色,则默认颜色为不透明的白色。
8.2.4 混合黑暗贴图和材质漫反射颜色p140 (基础贴图*光的颜色)*黑暗贴图 实例代码: m_pd3dDevice->SetTexture(0, m_pWallTexture); m_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_MODULATE); //相乘 如果没有光照,则纹理颜色会乘以0,因此便看不到墙壁纹理了,只能看到第二张纹理。 m_pd3dDevice->SetTexture(1, m_pEnvTexture); m_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0); m_pd3dDevice->SetTextureStageState (1, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState (1, D3DTSS_ COLORARG2, D3DTA_CURRENT); m_pd3dDevice->SetTextureStageState (1, D3DTSS_COLOROP, D3DTOP_MODULATE); 如果第1张纹理是不可见的,则第1阶段的值0与第2阶段的颜色相乘,还是0(黑色)。当你处于一个真正漆黑的地方时,由于光线微弱,你是无法看到周围物体的颜色的,因此以上代码对于模拟这种情况很有用。
使用多次渲染技来实现相同的效果: //Set texture for the cube m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_MODULATE); m_pd3dDevice->SetTextureStageState (D3DRS_ALPHABLENDENABLE, FALSE); m_pd3dDevice->SetTexture(0, m_pWallTexture); //draw polygon //Set darkmap m_pd3dDevice->SetTextureStageState (D3DRS_ALPHABLENDENABLE, TRUE); m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ ZERO); m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR); m_pd3dDevice->SetTexture(1, m_pEnvTexture); //draw polygon
其中alpha混合公式: FinalColor = SourcePixelColor * 0.0 + DestPixelColor * SourcePixelColor
8.2.5 发光映射(Glow Mapping)p140 发光映射与黑暗映射正好相反。它对于创建具有独立于基础贴图的发光部分的物体很有用,比如发光二极管、按钮、建筑物内的灯光、太空船上的灯光等。发光映射仅影响基础贴图上的发光区域,而不应影响到其余部分。因此需要对发光效果做加法。 m_pd3dDevice->SetTexture(0, m_pWallTexture); m_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); //Set Glow Mapping m_pd3dDevice->SetTexture(1, m_pEnvTexture); m_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0); m_pd3dDevice->SetTextureStageState (1, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState (1, D3DTSS_ COLORARG2, D3DTOP_SELECTARG1); m_pd3dDevice->SetTextureStageState (1, D3DTSS_COLOROP, D3DTOP_ADD);
使用多次渲染技来实现相同的效果: //Set texture for the cube m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_ SELECTARG1); m_pd3dDevice->SetTextureStageState (D3DRS_ALPHABLENDENABLE, FALSE); m_pd3dDevice->SetTexture(0, m_pWallTexture); //draw polygon //Set darkmap m_pd3dDevice->SetTextureStageState (D3DRS_ALPHABLENDENABLE, TRUE); m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ ONE); m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); m_pd3dDevice->SetTexture(1, m_pEnvTexture); //draw polygon
其中alpha混合公式: FinalColor = SourcePixelColor * 1.0 + DestPixelColor * 1.0
8.2.6 细节映射(Detail Mapping)p142 基础贴图(或是第一张纹理)的颜色未经修改便作为第二个纹理阶段中的第二个参数。然后通过D3DTOP_ADDSIGNED将灰色的细节纹理与基础贴图相加。这个操作本质上是做一个加法,只是使用了有符号的颜色值(-127~128)来代替平时使用的无符号值(0~255)。在ADDSIGNED两张纹理是,-127为黑色,128为白色。它将参数的每个成分相加后,再加上-0.5的偏移量,从而使有效值域变为-0.5~0.5。 在细节贴图中较亮的灰色图素将使基础贴图变得更亮,而较暗的灰色图素则会使基础贴图变暗。细节贴图将会使箱面呈现出一张粗糙的表面,从而使之看上去更为真实。 通过以下代码来使用细节映射: m_pd3dDevice->SetTexture(0, m_pWallTexture); m_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); //Set Detail Map m_pd3dDevice->SetTexture(1, m_pDetailTexture); m_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0); m_pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT); m_pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADDSIGNED);
通过多次渲染也可以实现同样的效果,如下所示: m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); m_pd3dDevice->SetTextureStageState(D3DRS_ALPHABLENDENABLE, FALSE); m_pd3dDevice->SetTexture(0, m_pWallTexture); //draw polygon //set darkmap m_pd3dDevice->SetTextureStageState(D3DRS_ALPHABLENDENABLE, TRUE); m_pd3dDevice->SetTextureStageState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR); m_pd3dDevice->SetTextureStageState(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR); m_pd3dDevice->SetTexture(1, m_pDetailTexture); //draw polygon
其中alpha混合公式如下所示: FinalColor = SourcePixelColor * DestPixelColor + DestPixelColor * SourcePixelColor
纹理阶段操作会导致对所有颜色操作及以下内容作线性混合: 1、迭代的漫反射alpha 2、当前迭代的纹理alpha 3、alpha标量(用D3DRS_TFACTOR设置) 4、预乘(pre-multiplied)的纹理alpha 5、前一阶段计算出的alpha
alpha操作时通过D3DTSS_ALPHAOP来设置的。大致代码如下: m_pd3dDevice->SetRenderState(1, D3DTSS_ALPHAARG1, arg); m_pd3dDevice->SetRenderState(1, D3DTSS_ALPHAARG2, arg); m_pd3dDevice->SetRenderState(1, D3DTSS_ALPHAOP, op);
其中可用的op参数: D3DTOP_DISABLE:无效 D3DTOP_SELECTARG1:第1个被选择的参数
D3DTOP_SELECTARG2:第2个被选择的参数
D3DTOP_MODULATE 将参数的每个成分相乘
D3DTOP_MODULATE2X 将参数的每个成分相乘,并将乘积左移1位(等同于乘以2的效果)以使其变得更亮
D3DTOP_MODULATE4X 将参数的每个成分相乘,并将乘积左移2位(等同于乘以4的效果)以使其变得更亮
D3DTOP_ADD Add the components of the arguments.
D3DTOP_ADDSIGNED Add the components of the arguments with a - 0.5 bias, making the effective range of values from - 0.5 through 0.5.
D3DTOP_ADDSIGNED2X Add the components of the arguments with a - 0.5 bias, and shift the products to the left 1 bit.
D3DTOP_SUBTRACT Subtract the components of the second argument from those of the first argument.
D3DTOP_MULTIPLYADD 完成一个累积乘法(multiply-accumulate)操作。它取2个参数相乘,然后将乘积加上另一个输入/源参数,最后将和作为结果。 Result = Arg0+ Arg1* Arg2 SRGBA = Arg1 + Arg2 * Arg3 D3DTOP_LERP 根据第1个源参数指定的比例计算第2、3个源参书的线性插值。 Result = (Arg0)*Arg1 +(1-Arg0)*Arg2 SRGBA = (Arg1) * Arg2 + (1- Arg1) * Arg3. 每种alpha操作可接受最多3个颜色参数:D3DTSS_ALPHAARG0、D3DTSS_ALPHAARG1、D3DTSS_ALPHAARG2,可以将这些颜色参数设为以下值: D3DTA_DIFFUSE,使用漫反射颜色,这种颜色是在使用Gouraud着色时,对顶点成分中的漫反射颜色作插值计算而得的; D3DTA_SPECULAR,使用镜面反射颜色,这种颜色是在使用Gouraud着色时,对顶点成分中的镜面反射颜色作插值计算而得的; D3DTA_TFACTOR,使用纹理系数,可事先通过渲染状态D3DRS_TEXTUREFACTOR调用SetRenderState()来设置的纹理系数; D3DTA_TEXTURE,使用本文里阶段的纹理颜色; D3DTA_CURRENT,使用上一个混合阶段的结果; D3DTA_TEMP,使用一个用于读/写的临时寄存器颜色; D3DTA_COMPLEMENT,对alpha参数取反。
alpha值可以存储在顶点、材质、纹理贴图中,alpha值0表示完全透明,1表示不透明,其余0~1之间的值表示不同程度的半透明。 在固定功能的流水线中,有3种获取alpha的途径: 从纹理中获取alpha值: D3DTA_TEXTURE 从材质颜色中获取alpha值:D3DMCS_MATERIAL、D3DTA_DIFFUSE 从漫反射顶点颜色中获取alpha值:D3DMCS_COLOR1、D3DTA_DIFFUSE
从何处获取alpha值取决于SetRenderState()函数中的D3DRS_DIFFUSEMATERIALSOURCE参数:
如果要从一张纹理中获取alpha值,应将D3DTA_TEXTURE作为作为alpha参数: m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
使用材质颜色中的alpha值,应将D3DTA_DIFFUSE作为alpha参数,并确保已设置了D3DRS_DIFFUSEMATERIALSOURCE= D3DMCS_MATERIAL: m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL); m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
如果要使用来自于顶点颜色中的alpha值,应将D3DTA_DIFFUSE作为alpha参数,并确保D3DRS_DIFFUSEMATERIALSOURCE= D3DMCS_COLOR1(这是默认值): m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1); m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
如果未用SetRenderState()设置D3DMCS_x参数,则从默认来源获取漫反射颜色。
alpha调制 将绿色的环境光与材质alpha相调制,可以模拟夜视镜观察的效果: D3DCOLOR d3dclrAmbientLightColor = D3DRGBA(0.0f, 1.0f, 0.0f, 1.0f); m_pd3dDevice->SetRenderState(D3DRS_AMBIENT, d3dclrAmbientLightColor);
可以使用以下代码来调制环境光与纹理颜色: m_pd3dDevice->SetTexture (0, D3DTextr_GetSurface(“Wall.bmp”)); // 基础贴图*漫反射颜色 m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_MODULATE); // alpha值*漫反射颜色 m_pd3dDevice->SetTextureStageState (0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); m_pd3dDevice->SetTextureStageState (0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); 这个过程可描述为:基础贴图∞漫反射插值∞alpha∞漫反射插值
//用ConfirmDevice()检查3D硬件对多纹理的支持情况: if(pCaps->MaxSimultaneousTextures<2) return E_FAIL;
//检查各项显卡能力: if(0 == (pCaps->DestBlendCaps & D3DBLENDCAPS_INVSRCCOLOR)) && //alpha blending (0 == (pCaps->SrcBlendCaps & D3DBLENDCAPS_SRCCOLOR)) && (0 == (pCaps->TextureOpCaps & D3DTEXOPCAPS_ADDSIGNED)) && //texture blending (0 == (pCaps->TextureOpCaps & D3DTEXOPCAPS_MODULATE)) && (0 == (pCaps->TextureOpCaps & D3DTEXOPCAPS_ MODULATE2X)) && (0 == (pCaps->TextureOpCaps & D3DTEXOPCAPS_ MODULATE4X)) && (0 == (pCaps->TextureOpCaps & D3DTEXOPCAPS_ADD)) && (0 == (pCaps->TextureAddressCaps & D3DTADDRESSCAPS_CLAMP)) && (0 == (pCaps->TextureAddressCaps & D3DTADDRESSCAPS_BORDER)) && (0 == (pCaps->TextureAddressCaps & D3DTADDRESSCAPS_MIRRORONCE)) ) return E_FAIL;
D3DPOOL_MANAGED | |