我是新手在Android中打开gl我需要在我的GLSurfaceView中绘制一些文本。我发现只有一个解决方案 - 用文本创建位图并将其显示为纹理(例如,像http://giantandroid.blogspot.ru/2011/03/draw-text-in-opengl-es.html)。我试着这样做,但它对我不起作用。这段代码中的纹理数组是什么?有没有更简单的方式来显示文字?
答案 0 :(得分:1)
openGL本身并不提供任何“更简单”的渲染文本方式 - 它甚至不会“知道”关于字形在位图或轮廓字体集中的表示方式。
使用一些其他库“知道”如何处理不同的字体集以及如何光栅化它们直接让它们绘制成openGL纹理看起来并不复杂,任何其他方法都可能声称要容易得多。
您可能希望在stackoverflow以及链接页面中查看这两个(请参阅:Draw text in OpenGL ES)文章,以了解可用于选择最适合您的方法的其他方法
关于您链接的代码示例中关于纹理数组的第二个问题,数组仅用于满足对glGenTextures()
的调用的API要求,因为它期望数组为第二个论点。
实际上,在这一行中只分配了一个纹理id:
gl.glGenTextures(1, textures, 0);
看一下规范(参见:http://docs.oracle.com/javame/config/cldc/opt-pkgs/api/jb/jsr239/javax/microedition/khronos/opengles/GL10.html),结果发现在纹理数组中只有一个纹理id分配存储在索引0处。
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);
因此,即使只需要一个id,java包装器中还有一个参数和使用数组的要求。