我正在尝试使用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);
我认为,混合模式有问题,但我找不到合适的模式。有什么建议吗?
答案 0 :(得分:0)
我相信GL_POINT_SMOOTH旨在与饱和度混合glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE)一起使用,因为alpha被计算为精灵重叠的像素的一部分。深度缓冲区也可能会干扰渲染。
对于更准确的圆圈,我建议使用三角形条带,甚至是单个纹理或(如果使用着色器,在片段着色器中隐式着色)四边形。
答案 1 :(得分:0)
有趣,我实际上explained this yesterday(虽然使用GL_POLYGON_SMOOTH
代替)。然而,问题是一样的。
GL_LINE_SMOOTH
,GL_POLYGON_SMOOTH
和GL_POINT_SMOOTH
都会遇到造成这些混合工件的一个主要问题。使用这些抗锯齿技术绘制时,锯齿边缘与帧缓冲区中的现有像素混合在一起。这会创建一个依赖于顺序的情况,只能通过从前到后对基元进行排序并因过度绘制而导致潜在严重的性能影响来解决。
当你看到这些白色像素时,真正发生的是混叠边缘与颜色缓冲区中唯一的东西混合,直到那个时候(清晰的颜色)。
如果你真的坚持在这种情况下使用点平滑,你应该两次绘制所有点。为了获得最佳结果,您可能希望在第一次传递时反转绘制它们的顺序,并使用glDepthMask (GL_FALSE)
禁用深度写入,然后在第二次传递时重新启用深度写入。显然,从性能的角度来看,这会很糟糕,但这些非完整的抗锯齿技术从一开始就不太理想。