渲染到纹理仍然渲染到OpenGLES中的屏幕

时间:2010-07-07 14:12:56

标签: iphone objective-c opengl-es

我正在尝试在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];

我得到的是这个 - 我的线条显示在屏幕的“后面”(我画三角扇的方式意味着我可以看到它背后)这意味着我的线条被绘制到渲染缓冲区,即使我从来没有绑定它。最重要的是,我将我的纹理绘制为一些奇怪的颜色,而不是我预期的线条。

所以我在这里遇到两个问题:

如果我没有将它们写入渲染缓冲区,为什么我的线条仍会出现在屏幕背面?

我正确地写了纹理吗?如果是这样,为什么不显示?

1 个答案:

答案 0 :(得分:2)

您需要使用Framebuffer对象(FBO)直接绘制到纹理中,以下教程应该可以帮助您:

http://www.flashbang.se/archives/48

请注意,这些教程适用于OpenGL,因为OpenGL ES是相同的,但EXT在大多数方法和枚举中都更改为OES。

另请注意,绑定帧缓冲区(glBindFramebufferEXT / OES)会使所有渲染都转到该帧缓冲区(并且它附加了纹理/渲染缓冲区),因此您需要在再次绘制到屏幕之前先取消绑定帧缓冲区,这是通过以下方式进行的:

glBindFramebuffer(GL_FRAMEBUFFER, 0);