OpenGL ES iPhone - 绘制抗锯齿线

qua*_*ano 37 iphone opengl-es line antialiasing

通常,你会使用类似的东西:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);

glLineWidth(2.0f);

glVertexPointer(2, GL_FLOAT, 0, points);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_LINE_STRIP, 0, num_points);

glDisableClientState(GL_VERTEX_ARRAY);
Run Code Online (Sandbox Code Playgroud)

它在iPhone模拟器中看起来不错,但在iPhone上,线条变得非常薄,没有任何抗锯齿.

你如何在iPhone上获得AA?

qua*_*ano 59

使用不透明度为0的顶点可以非常便宜地实现抗锯齿效果.这是一个图像示例来解释:

替代文字

与AA比较:

替代文字

你可以在这里阅读一篇关于此的论文:

http://research.microsoft.com/en-us/um/people/hoppe/overdraw.pdf

你可以这样做:

// Colors is a pointer to unsigned bytes (4 per color).
// Should alternate in opacity.
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);
glEnableClientState(GL_COLOR_ARRAY);

// points is a pointer to floats (2 per vertex)
glVertexPointer(2, GL_FLOAT, 0, points);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_TRIANGLE_STRIP, 0, points_count);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
Run Code Online (Sandbox Code Playgroud)

  • 是否有任何可比较的(但更简单的)用于绘制抗锯齿线 - 可用于绘制方程式的那种线等.换句话说,对于绘图,使用GL_LINE_STRIP而不是GL_TRIANGLE_STRIP.我所画的一切似乎都是像素化的.我正在探索使用GL_POINT_SPRITE_OES(根据Apple的GLPaint示例代码),但这意味着为每个像素位置创建点......或者看起来如此.我想让OpenGL-ES为我做补间. (5认同)
  • 哇!简单,清晰,完美的方法和描述.太好了! (2认同)

Ber*_*lor 25

iOS 4.0开始,你有一个简单的解决方案,现在可以使用Antialiasing为整个OpenGL ES场景添加几行代码.(而且几乎没有性能损失,至少在SGX GPU上).

有关代码,请阅读以下Apple Dev-Forum主题.还有一些示例图片在我的博客上找我的样子.

  • 感谢发布这个:我几乎开始根据SO上这个问题的旧答案写一些严重的神秘代码. (2认同)
  • 您的Apple dev论坛帖子的链接不再有效:我收到了错误页面. (2认同)

wes*_*der 6

使用http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/作为起点,我得到了抗锯齿像这样的行: 替代文字

它们并不完美,也不像我用Core Graphics绘制的那样漂亮,但它们非常好.我实际上绘制了两次相同的线(顶点) - 一次具有更大的纹理和颜色,然后具有更小的纹理和半透明的白色.

当线条重叠太紧并且alphas开始累积时会出现伪影.