如何在Android中使用OpenGL绘制一个光滑的圆圈?

我正在学习Android上的OpenGL API。 我刚画了一个圆。 以下是我使用的代码。

public class MyGLBall { private int points=360; private float vertices[]={0.0f,0.0f,0.0f}; private FloatBuffer vertBuff; //centre of circle public MyGLBall(){ vertices=new float[(points+1)*3]; for(int i=3;i<(points+1)*3;i+=3){ double rad=(i*360/points*3)*(3.14/180); vertices[i]=(float)Math.cos(rad); vertices[i+1]=(float) Math.sin(rad); vertices[i+2]=0; } ByteBuffer bBuff=ByteBuffer.allocateDirect(vertices.length*4); bBuff.order(ByteOrder.nativeOrder()); vertBuff=bBuff.asFloatBuffer(); vertBuff.put(vertices); vertBuff.position(0); } public void draw(GL10 gl){ gl.glPushMatrix(); gl.glTranslatef(0, 0, 0); // gl.glScalef(size, size, 1.0f); gl.glColor4f(1.0f,1.0f,1.0f, 1.0f); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, points/2); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glPopMatrix(); } } 

它实际上是从这里直接采取圆看起来不错。 但是现在我想要使这个圆的边界平滑。 我需要对代码做些什么改变? 或者我需要使用其他技术来绘制圆圈?

谢谢。

使用基于多边形的graphics时,唯一的select就是进一步细分。 720个三角形将会产生一个平滑的圆圈,但1440会给你一个更平滑的圆圈,但是2880 …

使用多边形创建的完美圆将需要无限多的无限小的多边形部分(换句话说,理论上这是不可能的)。 然而,实际上,如果细分了足够多的时间,可能会达到多边形部分的长度等于或小于一个像素的点,这意味着,为了您的帧缓冲区,您已经实现了一个“完美”的圆。

另一种select当然是作弊:渲染一个垂直于相机的平面四边形,并用一个球体的图像进行纹理化。 2个三角形,1个足够分辨率的纹理:光滑的圆形,以及让GPU不用担心的顶点。

如果你想用OpenGL做vectorgraphics,你应该在着色器中做。 例如

 gl_FragColor = ( length(gl_FragCoord.xy) < 0.5 ) ? vec4(1,1,1,1) : vec4(0,0,0,1); 

你可以做一些“超级取样”来使其平滑,或者分析计算像素的面积,这个面积与圆圈重叠。

BTW。 那里也有OpenVG API。