我一直在尝试制作蠕虫风格的可破坏地形,到目前为止它一直很顺利......
我操纵了它,以便下面的图像被遮盖在“巧克力”纹理上。
然而,正如在快照1中可以看到的,CircleMask的“边缘”仍然是可见的(彼此重叠)。我很确定它与别名有关,因为蒙版图像在被应用之前被拉伸(那个,并且SquareMask.png没有这个问题)。这是我的问题。
我的屏蔽代码如下:
void MaskedSprite::draw(Point pos)
{
glEnable(GL_BLEND);
// Our masks should NOT affect the buffers color, only alpha.
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
glBlendFunc(GL_ONE_MINUS_DST_ALPHA,GL_DST_ALPHA);
// Draw all holes in the texture first.
for (unsigned i = 0; i < masks.size(); i++)
if (masks.at(i).mask) masks.at(i).mask->draw(masks.at(i).pos, masks.at(i).size);
// But our image SHOULD affect the buffers color.
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
// Now draw the actual sprite.
Sprite::draw(pos);
glDisable(GL_BLEND);
}
draw()函数将带有纹理的四边形绘制到屏幕上。它没有混合功能。
答案 0 :(得分:1)
如果您反转蒙版图像上的Alpha通道,以便圆圈内部的alpha为0.0,则可以使用以下混合模式:
glClearColor(0,0,0,1);
// ...
glBlendFunc(GL_DST_ALPHA, GL_ZERO);
这意味着,当屏幕被清除时,每个像素将被设置为alpha 1.0。每次启用混合渲染蒙版时,它会将蒙版的alpha值与该像素的当前alpha相乘,因此alpha值永远不会增加。
请注意,使用此技术,将忽略精灵纹理中的任何Alpha通道。此外,如果要在地形之前渲染背景,则需要在渲染最终精灵图像之前更改混合函数。像glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA)
这样的东西可行。
另一种解决方案是使用混合模式,但将遮罩纹理的插值模式设置为最近邻居,以确保从遮罩中采样的每个值都是0.0或1.0:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
我的最后一点建议是:关于可破坏的2D地形的困难部分是没有让它正确渲染,它正在与它进行碰撞检测。如果你没有考虑过你打算如何解决它,你可能想要。