2

我是在 android 中打开 gl 的新手,我需要在我的 GLSurfaceView 中绘制一些文本。我只找到了一种解决方案 - 使用文本创建位图并将其显示为纹理(例如,像这样;http ://giantandroid.blogspot.ru/2011/03/draw-text-in-opengl-es.html )。我试图这样做,但它对我不起作用。这段代码中的纹理数组是什么?有没有更简单的方法来显示文本?

4

1 回答 1

1

openGL 本身并没有提供任何“更简单”的方式来呈现文本——它甚至不“知道”字形在位图或轮廓字体集中的表示方式。

使用其他库“知道”如何处理不同的字体集以及如何将它们光栅化以直接让它们绘制到 openGL 纹理中似乎并不复杂,以至于任何其他方法都可能声称要容易得多。

您可能想看看这两个(请参阅:在 OpenGL ES 中绘制文本)文章here on stackoverflow 以及链接页面,以了解可用于选择最适合您的方法的其他方法的概述。

关于您链接的代码示例中关于纹理数组的第二个问题,该数组仅用于满足调用的 API 要求,glGenTextures()因为它需要一个数组作为第二个参数。

事实上,这一行只分配了一个纹理 ID:

gl.glGenTextures(1, textures, 0);

看一下规范(参见:http ://docs.oracle.com/javame/config/cldc/opt-pkgs/api/jb/jsr239/javax/microedition/khronos/opengles/GL10.html )事实证明在纹理数组的索引 0 处仅分配了一个纹理 ID。

那么为什么是一个(伪)数组呢?

java方法看似复杂的签名

public void glGenTextures(int n, int[] textures, int offset)

是因为 java 中没有指针,而被包装的 C 函数需要一个指针作为它的第二个参数:

void glGenTextures(GLsizei n, GLuint *textures);

与在 C 代码中分配单个纹理一样,可以通过以下方式完成:

  GLuint texture_id;
  glGenTextures (1, &texture_id);

不需要仅返回单个纹理 id 的特殊函数,因此只有一个glGenTextures()函数可用。

为了允许可以使用指针算术完成的分配,例如:

  GLuint textures[10];
  glGenTextures (3, textures + 5);

在 C 中,java 包装器允许第三个参数指定分配纹理 id 的起始索引。

java中相应的方法调用如下所示:

   int[] textures = new int[10];
   glGenTextures (3, textures, 5);

因此,Java 包装器中多了一个参数,并且即使只需要一个 id,也需要使用数组。

于 2013-04-07T23:22:13.577 回答