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

Kom*_*ave 6 geometry opengl-es-2.0

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

glEnable(GL_POINT_SMOOTH);
glPointSize(radius*2);
glDrawArrays(GL_POINTS,0,nPoints);
Run Code Online (Sandbox Code Playgroud)

在ES 2.0中是否存在等价物,也许在顶点着色器中有所改变,或者我必须为每个圆使用多边形?

Chr*_*ica 7

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

if(texture2d(circle, gl_PointCoord).r < 0.1)
   discard;
Run Code Online (Sandbox Code Playgroud)

编辑:或者你可以没有纹理,通过交换纹理访问延迟计算复杂性,只是评估圆方程:

if(length(gl_PointCoord-vec2(0.5)) > 0.5)
    discard;
Run Code Online (Sandbox Code Playgroud)

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

vec2 pt = gl_PointCoord - vec2(0.5);
if(pt.x*pt.x+pt.y*pt.y > 0.25)
    discard;
Run Code Online (Sandbox Code Playgroud)

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