使用GL_POINT_SMOOTH实现ES 1.0圆形的OpenGL ES 2.0等效方法?

6

OpenGL ES 2.0没有GL_POINT_SMOOTH定义,而ES 1.0有。这意味着我之前用来画圆的代码不再起作用了:

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

在ES 2.0中是否有相应的东西,也许是适用于定点着色器的某些东西,或者我必须为每个圆使用多边形?


可能是[OpenGL ES 2.0与iPhone:GL_POINT_SMOOTH在ES 2.0中绘制正方形但在ES 1.0中有效]的重复问题。(https://dev59.com/RFrUa4cB1Zd3GeqPm8Ak) - Kornel Kisielewicz
3
那个问题的答案涉及到OpenGL ES 1.0,而不是ES 2.0。 - KomodoDave
请注意,不要重复提出同一个问题。 - Kornel Kisielewicz
2个回答

8
您可以使用点精灵来模拟这个效果。只需启用点精灵,您就可以获得一个特殊变量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函数比这个还要快,因为它被优化为长度计算并且可能直接在硬件上实现。


谢谢你,Christian :) 这是目前为止的最后一个问题! - KomodoDave

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接