Iphone 渲染到纹理仍在OpenGLES中渲染到屏幕

Iphone 渲染到纹理仍在OpenGLES中渲染到屏幕,iphone,objective-c,opengl-es,Iphone,Objective C,Opengl Es,我试图在OpenGLES中完成一些东西,但我从这里开始——将东西绘制到纹理,然后显示该纹理 我创建了一些缓冲区: glGenFramebuffersOES(1, &frameBuffer); glGenRenderbuffersOES(1, &colorRenderbuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, frameBuffer); 然后我设置自己,画一些线到帧缓冲区 glViewport(0, 0, backingWi

我试图在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];
然后显示纹理

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)直接绘制到纹理中,以下教程将帮助您:

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

还请注意,绑定帧缓冲区(glBindFramebufferEXT/OES)会使所有渲染都转到该帧缓冲区(及其附加的纹理/renderbuffers),因此需要先解除帧缓冲区的绑定,然后再将其再次绘制到屏幕上,这是通过以下方式实现的:

glBindFramebuffer(GL_FRAMEBUFFER, 0);

您缺少很多重要的代码,例如glFramebuffer*调用(glFramebufferRenderbuffer,等等),但我不太明白的是,如果绑定帧缓冲区,它将呈现给它,而不是屏幕。另外,为什么不使用FBO直接绘制纹理?FBO是FramebufferObject,对吗?你能详细说明这可能涉及到什么吗?我在其他地方看到过这一点,但没有可靠的代码。关于渲染目标,这也是我的问题。没有理由让它出现在屏幕上,但事实确实如此。仍然在使用更简单的示例。实际上,一个更好的问题是,你到底想做什么?我需要画一些线,将它们转换为纹理,然后将该纹理映射到一个对象上,以便在屏幕上显示。这是摘要。我/实际上/需要做的是在2D图像上画一束线,模糊该图像(使用我已经实现的模糊),然后将其显示在屏幕上。这是实现这一点的第一步-帧缓冲区到纹理(通常我会模糊),然后纹理到屏幕。这很有道理,尽管他提供的代码还不起作用。我会坚持下去,谢谢你!