如何绘制纹理中的OpenGL ES 2.0的2D背景?
-
26-09-2019 - |
题
我刚开始接触的OpenGL ES 2.0,我想要做的就是创建一些简单的2D输出。鉴于480×800的分辨率,我怎么可以得出一个背景纹理?
[我开发环境是爪哇/机器人,以便直接与该实施例是最好的,但其它语言就可以了。]
解决方案
即使你使用的是Android,我创建了一个实现这个要求在未来的视频帧的iPhone示例应用程序,你可以下载代码从的here 的。我有一个关于这个应用程序,使用视频直播这确实基于颜色的物体跟踪的书面记录,你可以阅读的此处。
在本申请中,我绘制两个三角形,以产生一个矩形,则质地使用以下坐标:
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);
其他提示
您真的不绘制背景,而不是你画一个矩形(或者,更准确:两个三角形形成一个矩形),并设置一个纹理到。这是在所有的从图纸的任何其他对象在屏幕上没有什么不同。
有很多展示如何做到这一点的地方,也许有更显出这一个Android示例项目。
棘手的部分越来越或后面别的前东西显示。对于这个工作,你需要建立一个深度缓冲,使深度测试(glEnable(GL_DEPTH_TEST))。和你的顶点需要有一个Z坐标(并告诉glDrawElements你的顶点是由三个值,而不是两个)。
如果你不这样做,对象将在次序呈现他们的glDrawElements()函数被调用(意思是无论你得出最后会落得模糊的其余部分)。
我的建议是没有背景的图像或做任何幻想,直到你得到它的窍门。 OpenGL ES 2.0的有怎样的一个陡峭的学习曲线,并在ES 1.x的教程没有真正帮助,让3D来工作,因为他们可以使用的辅助功能,如gluPerspective,其中2.0根本就没有。开始创建就没有什么背景的三角形。接下来,使它成为一个正方形。然后,如果你想要去已经看中,添加纹理。与位置播放。看到当你改变你的顶点的Z值会发生什么。 (提示:不是很多,如果你不具备深度测试启用即使这样,如果你没有透视投影,对象将不会变得更小更远的他们客场,所以它仍然会显得好像什么都没有。发生)
几天后,它不再是那么该死的令人沮丧,你终于“明白”,多。