0

我正在尝试使用 glDrawArrays 和 GL_POINTS 用 OpenGL 绘制一个圆圈。我的圆圈绘制正确,但每个点都有一个白色边框(见截图)。

截屏

这是代码:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);

Color* color = (Color*)colors;

glEnableClientState(GL_VERTEX_ARRAY);
pointSize *= this->GetScale();

glPointSize(pointSize);
glColor4f(color->r/255.0f, color->g/255.0f, color->b/255.0f, 1.0f);

glVertexPointer(2, GL_FLOAT, 0, verts);
glDrawArrays(GL_POINTS, 0, count);
glDisableClientState(GL_VERTEX_ARRAY);

我认为,混合模式有问题,但我找不到正确的模式。有什么建议么?

4

2 回答 2

0

我相信 GL_POINT_SMOOTH 旨在与饱和度混合 glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE) 一起使用,因为 alpha 被计算为精灵重叠的像素的一部分。深度缓冲区也可能会干扰渲染。

对于更准确的圆圈,我建议使用三角形条,甚至是单个纹理或(如果使用着色器,在片段着色器中隐式着色)四边形。

于 2013-08-26T13:35:05.260 回答
0

有趣的是,我昨天实际上解释了这一点(尽管GL_POLYGON_SMOOTH改用了)。然而,问题是一样的。

GL_LINE_SMOOTHGL_POLYGON_SMOOTH并且GL_POINT_SMOOTH所有人都遭受了一个导致这些混合伪影的主要问题。当您使用这些抗锯齿技术进行绘制时,锯齿边缘会与帧缓冲区中的现有像素混合在一起。这会产生一种依赖于顺序的情况,只能通过从后到前对基元进行排序并由于过度绘制而对性能造成潜在的严重影响来解决。

当您看到这些白色像素时,真正发生的是混叠边缘正在与您的颜色缓冲区中唯一的东西混合,直到那时(清晰的颜色)。

如果你真的坚持在这种情况下使用点平滑,你应该将所有点绘制两次。为获得最佳效果,您可能需要颠倒在第一遍中绘制它们的顺序并使用 禁用深度写入glDepthMask (GL_FALSE),然后在第二遍中重新启用深度写入。显然,从性能的角度来看,这会很糟糕,但这些非全场景抗锯齿技术一开始就远非理想。

于 2013-08-26T18:00:27.640 回答