SDL + OpenGL屏蔽的别名问题

时间:2013-11-24 00:33:13

标签: opengl textures sdl masking blending

我一直在尝试制作蠕虫风格的可破坏地形,到目前为止它一直很顺利......

Snapshot1

我操纵了它,以便下面的图像被遮盖在“巧克力”纹理上。

CircleMask.png

然而,正如在快照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()函数将带有纹理的四边形绘制到屏幕上。它没有混合功能。

1 个答案:

答案 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地形的困难部分是没有让它正确渲染,它正在与它进行碰撞检测。如果你没有考虑过你打算如何解决它,你可能想要。