使用GL_POINT_SMOOTH的ESGL圈的OpenGL ES 2.0等效?

时间:2011-08-29 23:15:59

标签: opengl-es-2.0 geometry

OpenGL ES 2.0没有ES 1.0所做的GL_POINT_SMOOTH定义。这意味着我用来绘制圆圈的代码不再有效:

glEnable(GL_POINT_SMOOTH);
glPointSize(radius*2);
glDrawArrays(GL_POINTS,0,nPoints);

在ES 2.0中是否存在等效物,或许在顶点着色器中有什么东西,或者我必须为每个圆使用多边形?

2 个答案:

答案 0 :(得分:6)

您可以使用点精灵来模拟它。只需启用点精灵,您就可以获得一个可以在片段着色器中读取的特殊变量gl_PointCoord。这将为您提供当前点的平方中片段的坐标。您可以使用它们来读取包含圆形的纹理(不在圆圈中的像素的颜色为0)然后丢弃每个纹理值为0的片段:

if(texture2d(circle, gl_PointCoord).r < 0.1)
   discard;

编辑或者你可以在没有纹理的情况下,通过交换纹理访问延迟来计算复杂性并仅评估圆等式:

if(length(gl_PointCoord-vec2(0.5)) > 0.5)
    discard;

可以通过删除平方根(在length函数中使用)并与平方半径进行比较来进一步优化:

vec2 pt = gl_PointCoord - vec2(0.5);
if(pt.x*pt.x+pt.y*pt.y > 0.25)
    discard;

但也许内置length函数甚至比这更快,针对长度计算进行了优化,可能直接在硬件中实现。

答案 1 :(得分:0)

答案是 - 是的,你必须使用多边形(例如纹理四边形)来获得平滑点。