我到处都看过,找不到有效的答案。

我试图通过将"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

谢谢你的帮助

最佳答案

第一条规则:COLOROP与COLORARG一起使用,ALPHAOP与ALPHAARG一起使用,请不要混合使用。

在固定功能管道中不可能将颜色信息输入到alpha通道中。我能想到的最接近的方法是准备孔纹理,以使信息驻留在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);

但是,如今这已经过时了。使用着色器! :)

关于c++ - DirectX中的Alpha mask ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8045414/

10-11 22:43
查看更多