C++ DirectX中的Alpha掩码

C++ DirectX中的Alpha掩码,c++,directx,C++,Directx,我到处都找遍了,找不到有效的答案 我试图在纹理上打一个洞,通过使用“sheet.png”作为纹理,“hole.png”作为alpha遮罩。这是一张带黑色圆圈的白色图片,这是我想要的有一个洞的位置 我该怎么做?这是我到目前为止所做的,但它所做的只是将两种纹理相互叠加 md3dDev->SetTexture(0, gTexture); md3dDev->SetTexture(1, holeTexture); md3dDev->SetTextureStageState(0, D3D

我到处都找遍了,找不到有效的答案

我试图在纹理上打一个洞,通过使用
“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

感谢您的帮助

如果您正在编写自己的着色器,只需将字母相乘即可

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

如果您使用的是固定管道/模拟,那么我不确定是否抱歉。

第一条规则:COLOROP与COLORARG搭配,ALPHAOP与ALPHAARG搭配,不要混用它们

不可能将颜色信息输入固定功能管道中的alphachannel。我能想到的最近的方法是准备孔纹理,以便信息驻留在alphachannel中。然后,您可以使用如下内容:

  // 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++,但它更多的是它所教的东西的着色器。