我到处寻找,但我找不到有效的答案。
我正在尝试在纹理中创建一个洞,让"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
感谢您的帮助
答案 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
如果您正在使用固定管道/模拟它,那么我不确定抱歉。