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