DirectX中的Alpha掩码

时间:2011-11-08 02:54:19

标签: c++ directx

我到处寻找,但我找不到有效的答案。

我正在尝试在纹理中创建一个洞,让"sheet.png"为纹理,"hole.png"为alpha蒙版。这是一张带有黑色圆圈的白色图片,这是我希望工作表有一个洞的位置。

我该怎么做?这是我到目前为止所做的,但它所做的只是将两个纹理绘制在彼此之上

md3dDev->SetTexture(0, gTexture);
md3dDev->SetTexture(1, holeTexture);

md3dDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
md3dDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);  

md3dDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
md3dDev->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);

md3dDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE );
md3dDev->SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
md3dDev->SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );

md3dDev->SetRenderState( D3DRS_ALPHABLENDENABLE, true);
md3dDev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);//alpha
md3dDev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);//alpha

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

第一条规则:COLOROP与COLORARG合作,ALPHAOP与ALPHAARG合作,不要混用它们。

无法将颜色信息转换为固定功能管道中的alphachannel。我能想到的最接近的方法是准备孔纹理,以便信息驻留在alpha通道中。然后你可以使用这样的东西:

  // multiply colorchannel from colortexture with diffuse lighting
  d3dSetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE);   
  d3dSetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  d3dSetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
  // ignore alpha from colortexture
  d3dSetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1); 
  d3dSetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_CURRENT);

  // ignoring colorchannel from alphatexture
  d3dSetTextureStageState(1, D3DTSS_COLOROP,   D3DTOP_SELECTARG1); 
  d3dSetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
  // get alpha from alphatexture
  d3dSetTextureStageState(1, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1); 
  d3dSetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

现在这已经过时了。使用着色器! :)

答案 1 :(得分:0)

如果您正在编写自己的阴影,只需将alpha值相乘即可。

Output = tex2d(Texture[0], uv)
Output.A *= tex2d(Texture[1], uv).A

如果您正在使用固定管道/模拟它,那么我不确定抱歉。