渲染到纹理仍渲染到OpenGLES中的屏幕
我想要在OpenGLES中完成一堆东西,但这里是我开始的地方 - 将东西绘制到纹理,然后显示该纹理。渲染到纹理仍渲染到OpenGLES中的屏幕
我创造了一些缓冲:
glGenFramebuffersOES(1, &frameBuffer);
glGenRenderbuffersOES(1, &colorRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, frameBuffer);
然后,我给自己定了画一些线条的帧缓冲区。
glViewport(0, 0, backingWidth, backingHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glVertexPointer(2, GL_FLOAT, 0, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colours);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_LINES, 0, 2000);
然后,我尝试将其复制到新制纹理中。
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, 128, 128);
然后显示纹理。
GLfloat vertices[] = {-1,1,1,1,-1,-1,1,-1};
GLfloat texcoords[] = { 0,1,
1,1,
0,0,
1,0,};
glColor4f(0.5, 0.5, 0.5, 0.1);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
GL_RENDERBUFFER_OES, colorRenderbuffer);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
[context presentRenderbuffer:GL_FRAMEBUFFER_OES];
我所得到的是这样的 - 在这意味着我的台词屏幕(我画的三角形扇意味着我可以在后面看到的样子)的“后退”显示我的台词都被吸引到了渲染,尽管我从来没有约束过它。最重要的是,我将我的纹理绘制成一些奇怪的颜色,而不是我预期的那样。
所以,我有两个问题在这里:
为什么我的线仍然出现在如果我不写他们的渲染屏幕的后面?
我是否正确写入纹理?如果是这样,为什么不显示?
你需要使用一个帧缓冲区对象(FBO)直接绘制到纹理,下面教程应该可以帮助您:
http://www.flashbang.se/archives/48
注意,这些教程是对OpenGL,支持OpenGL ES是相同,但EXT在大多数方法和枚举中更改为OES。
另请注意,绑定帧缓冲区(glBindFramebufferEXT/OES)会使所有渲染都转到该帧缓冲区(以及它附加的纹理/渲染缓冲区),因此,在再次绘制屏幕之前需要先解除帧缓冲区的绑定, :
glBindFramebuffer(GL_FRAMEBUFFER, 0);
我看过那篇教程。它很有意义,尽管他提供的代码还没有工作。我会坚持下去,谢谢你! – mtrc 2010-07-07 16:57:39
您遗漏了很多重要的代码,如glFramebuffer *电话(glFramebufferRenderbuffer等),但我真的不明白,就是如果你绑定的帧缓冲,这会使它,而不是屏幕。 另外,你为什么不使用FBO直接绘制纹理? – 2010-07-07 15:30:11
FBO是FramebufferObject,对吧?你能详细说明可能涉及的内容吗?我已经在其他地方看到过这种情况,但没有提供可靠的代码。 关于渲染目标,这也正是我的问题。没有理由为什么应该出现在屏幕上,但它是。仍然用更简单的例子来处理它。 – mtrc 2010-07-07 15:37:16
其实更好的问题是,你想要做什么? – 2010-07-07 16:26:43