android - 如何在 OpenGL ES 2.0 Android 中绘制基本圆

标签 android opengl-es opengl-es-2.0

我是新来的 OpenGL ES 2,我已经阅读了很多关于如何在 Android 上的 OpenGL ES 2 中绘制圆圈的主题。基于Drawing Shapesthis code found on gamedev.net ,我会画三角形和正方形,但我还是不会画圆。我现在有三种画圆的方法:

  1. 在圆中生成顶点并使用 glDrawArray( GL_LINES, ... )。根据您生成的顶点数量,这将产生漂亮而清晰的结果。
  2. 使用预先生成的圆形纹理(具有 alpha 透明度)并将其映射到四边形上。这将产生非常平滑的图形并允许“粗”圆,但它不会那么灵活:即使使用 mipmapping,您也会希望纹理与渲染四边形的大小大致相同。
  3. 使用 fragment 着色器。

但是我该如何实现它们呢?

最佳答案

我绝对不推荐通过几何渲染一个圆。它有两个主要缺点:

  1. 它很慢。如果您想获得可接受的精度,则需要大量顶点,并且需要在着色器中处理这些顶点中的任何一个。对于真正的圆,您需要的顶点数与圆的像素数一样多。
  2. 它不是很灵活。拥有不同的圈子、设计和整理它们是很难掌握的。

还有另一种方法,我个人在每个图形 API 中都使用它。渲染至少一个三角形或一个正方形/四边形,并使用 fragment 着色器仅使不需要的(基于方程式)像素可见。这很容易理解。它灵活且快速。它需要混合,但这并不难开始工作。

步骤:

用数据初始化你的缓冲区。如果您使用的是正方形几何体,则需要一个用于顶点的顶点缓冲区,一个用于索引的索引缓冲区,以及一个用于纹理坐标的 textureCoord 缓冲区。 对于正方形,我建议使用 -1.0 作为最低纹理坐标,1.0 作为最高纹理坐标,因为这样您就可以使用单位圆方程。

在你的 fragment 着色器中,使用这样的东西:

if ((textureCoord.x * textureCoord.x) + (textureCoord.y * textureCoord.y) <= 1.0)
{
    // Render colored and desired transparency
}
else
{
    // Render with 0.0 in alpha channel
}

虽然 (textureCoord.x * textureCoord.x) + (textureCoord.y * textureCoord.y) <= 1.0 是不等式,因为你需要一个圆,你必须渲染该范围内的每个像素,而不仅仅是边界.您可以更改它,以便它为您提供所需的输出。

就是这样。实现起来不是很复杂,所以我在这里不提供任何基本的渲染代码。您需要的一切都发生在 fragment 着色器中。

关于android - 如何在 OpenGL ES 2.0 Android 中绘制基本圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18140117/

相关文章:

全屏 Android Studio

android - NavigationView 中从右到左的菜单项 Android

java - GLSurfaceView 交换正在绘制的 2D 位图

android - 即使应用程序关闭(滑动/滑动)也会收到 GCM 通知

android - 我可以在 PhoneGap 中使用 Telegram API 源的 Java 库来同时为 Android 和 iOS 开发吗?

c++ - 使用客户端顶点数组在没有 VBO 的情况下在 opengl 3.1+ 中呈现

java - Android OpenGL 点数组

c++ - glGetUniformLocation 为第一个以外的采样器返回 -1?

ios - 在 iOS5 的 xcode 4 中将 openGL ES 1.1 设置为默认值

opengl-es - 阴影映射 - 与光正交的薄壁上的伪影