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没有GL_POINT_SMOOTH定义,而ES 1.0有。这意味着我之前用来画圆的代码不再起作用了:
glEnable(GL_POINT_SMOOTH);
glPointSize(radius*2);
glDrawArrays(GL_POINTS,0,nPoints);
在ES 2.0中是否有相应的东西,也许是适用于定点着色器的某些东西,或者我必须为每个圆使用多边形?
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
函数比这个还要快,因为它被优化为长度计算并且可能直接在硬件上实现。
答案是——是的,你必须使用多边形(例如纹理四边形)来获得平滑的点。