17

我刚刚开始使用 OpenGL ES 2.0,我想做的是创建一些简单的 2D 输出。给定 480x800 的分辨率,如何绘制背景纹理?

[我的开发环境是 Java / Android,所以直接相关的例子最好,但其他语言也可以。]

4

2 回答 2

32

即使您使用的是 Android,我也创建了一个 iPhone 示例应用程序,它对传入的视频帧执行此操作。您可以从此处下载此示例的代码。我有一篇关于这个应用程序的文章,它使用实时视频进行基于颜色的对象跟踪,你可以在这里阅读。

在这个应用程序中,我绘制了两个三角形来生成一个矩形,然后使用以下坐标对其进行纹理处理:

   static const GLfloat squareVertices[] = {
        -1.0f, -1.0f,
        1.0f, -1.0f,
        -1.0f,  1.0f,
        1.0f,  1.0f,
    };

    static const GLfloat textureVertices[] = {
        1.0f, 1.0f,
        1.0f, 0.0f,
        0.0f,  1.0f,
        0.0f,  0.0f,
    };

要将视频帧作为纹理传递,我使用了一个带有以下顶点着色器的简单程序:

attribute vec4 position;
attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;

void main()
{
    gl_Position = position;
    textureCoordinate = inputTextureCoordinate.xy;
}

和以下片段着色器:

varying highp vec2 textureCoordinate;

uniform sampler2D videoFrame;

void main()
{
    gl_FragColor = texture2D(videoFrame, textureCoordinate);
}

绘图是使用正确程序的简单问题:

glUseProgram(directDisplayProgram);

设置纹理统一:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, videoFrameTexture);

glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);   

设置属性:

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, textureVertices);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);

然后绘制三角形:

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
于 2010-11-19T17:49:37.760 回答
15

您并没有真正绘制背景,而是绘制了一个矩形(或者,更准确地说:两个三角形形成一个矩形)并为其设置纹理。这与在屏幕上绘制任何其他对象完全没有区别。

有很多地方展示了这是如何完成的,甚至可能有一个 android 示例项目展示了这一点。

棘手的部分是让一些东西显示在其他东西的前面或后面。为此,您需要设置深度缓冲区并启用深度测试 (glEnable(GL_DEPTH_TEST))。并且您的顶点需要具有 Z 坐标(并告诉 glDrawElements 您的顶点由三个值组成,而不是两个)。

如果您不这样做,对象将按照调用 glDrawElements() 函数的顺序呈现(这意味着无论您最后绘制的哪个最终都会遮盖其余部分)。

我的建议是在你掌握它之前不要有背景图片或做任何花哨的事情。OpenGL ES 2.0 的学习曲线有点陡峭,ES 1.x 上的教程并不能真正帮助 3D 工作,因为它们可以使用 gluPerspective 等辅助函数,而 2.0 则没有。首先在什么都没有的背景上创建一个三角形。接下来,把它做成一个正方形。然后,如果你想花哨,添加纹理。玩位置。看看当你改变顶点的 Z 值时会发生什么。(提示:不是很多,如果你没有启用深度测试。即使那样,如果你没有透视投影,物体不会越远越小,所以它仍然看起来好像什么都没有发生)

几天后,它就不再那么令人沮丧了,你终于“明白了”,主要是。

于 2010-12-10T14:57:30.283 回答