如何使用iPhone OpenGL ES绘制消除锯齿的圆圈

时间:2010-08-31 13:49:23

标签: iphone c opengl-es

我知道在OpenGL ES中绘制一个简单的圆圈有三种主要方式,如iPhone所提供的。它们都基于一个简单的算法(VBO版本如下)。

void circleBufferData(GLenum target, float radius, GLsizei count, GLenum usage) {
  const int segments = count - 2;

  const float coefficient = 2.0f * (float) M_PI / segments;

  float *vertices = new float[2 * (segments + 2)];

  vertices[0] = 0;
  vertices[1] = 0;
  for (int i = 0; i <= segments; ++i) {
    float radians = i * coefficient;
    float j = radius * cosf(radians);
    float k = radius * sinf(radians);
    vertices[(i + 1) * 2] = j;
    vertices[(i + 1) * 2 + 1] = k;
  }

  glBufferData(target, sizeof(float) * 2 * (segments + 2), vertices, usage);
  glVertexPointer(2, GL_FLOAT, 0, 0);

  delete[] vertices;
}

我所知道的绘制简单圆的三种方法是使用应用程序所拥有的顶点数组中的glDrawArray;从顶点缓冲区使用glDrawArray;并在初始化时绘制纹理并在请求渲染时绘制纹理。我知道的前两种方法相当不错(尽管我无法使用抗锯齿工作)。最后一个选项涉及哪些代码(我对整个OpenGL很新,所以详细解释会非常有帮助)?哪个最有效?

1 个答案:

答案 0 :(得分:1)

iOS OpenGL ES中的抗锯齿功能受到严重限制。您将无法使用传统方法绘制抗锯齿圆圈。

但是,如果您绘制的圆圈不是那么大并且已经填充,您可以查看使用GL_POINT_SMOOTH。这就是我用于游戏的Pizarro,它涉及很多圈子。以下是我在iOS上绘制抗锯齿圈的经验的详细说明:

http://sveinbjorn.org/drawing_antialiased_circles_opengl_iphone