2013-11-24 80 views
1

我一直在努力使蠕虫风格破坏地形,到目前为止它已经做得较好......混淆问题与SDL + OpenGL的屏蔽

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); 
} 

拉伸()函数绘制四其上具有纹理到屏幕上。它没有混合功能。

回答

1

如果你控制反转掩模图像,以使圆形的内部有阿尔法0.0,你可以用下面的混合模式Alpha通道:

glClearColor(0,0,0,1); 
// ... 
glBlendFunc(GL_DST_ALPHA, GL_ZERO); 

这意味着,当屏幕被清除,每个像素将被设置为alpha 1.0。每次启用混合渲染蒙版时,它都会将蒙版的Alpha值与该像素上的当前Alpha值相乘,因此Alpha值永远不会增加。

请注意,使用这种技术,sprite纹理中的任何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地形的难点在于无法正确渲染它,它正在使用它进行碰撞检测。如果你没有考虑过你打算如何解决它,你可能会想。

+0

嘿!你做到了!我做了第二个选择(将我的纹理插值从GL_LINEAR改为GL_NEAREST),并解决了问题。 你不用担心,我已经得到了碰撞部分。谢谢! – Milun

+1

@ user3011203而不是用答案更新问题,而是接受由bcrist给出的答案。 – Joetjah

+0

@Joetjah呃。我的错。对不起,我是新手(如你所见)。 – Milun