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中是否存在等效物,或许在顶点着色器中有什么东西,或者我必须为每个圆使用多边形?
答案 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)
答案是 - 是的,你必须使用多边形(例如纹理四边形)来获得平滑点。