Iphone OpenGL ES渲染到纹理,然后绘制纹理

Iphone OpenGL ES渲染到纹理,然后绘制纹理,iphone,opengl-es,render-to-texture,Iphone,Opengl Es,Render To Texture,我正在尝试渲染一个纹理,然后在iPhone上使用OpenGL ES将该纹理绘制到屏幕上。我用它作为起点,在苹果演示版EagleView的一个子类中画图 实例变量: GLuint textureFrameBuffer; Texture2D * texture; 要初始化帧缓冲区和纹理,我将执行以下操作: GLint oldFBO; glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO); // initWithData results in

我正在尝试渲染一个纹理,然后在iPhone上使用OpenGL ES将该纹理绘制到屏幕上。我用它作为起点,在苹果演示版EagleView的一个子类中画图

实例变量:

GLuint textureFrameBuffer;
Texture2D * texture;
要初始化帧缓冲区和纹理,我将执行以下操作:

GLint oldFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO);

// initWithData results in a white image on the device (works fine in the simulator)
texture = [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"blank320.png"]];

// create framebuffer
glGenFramebuffersOES(1, &textureFrameBuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);

// attach renderbuffer
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture.name, 0);

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
    NSLog(@"incomplete");

glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO);
现在,如果我像往常一样简单地将场景绘制到屏幕上,效果会很好:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// draw some triangles, complete with vertex normals
[contentDelegate draw];
[self swapBuffers];
但是,如果我渲染到“textureFrameBuffer”,然后在屏幕上绘制“texture”,则生成的图像是颠倒的,“由内而外”。也就是说,看起来3d对象的法线指向内部而不是外部——每个对象的最前面都是透明的,我可以看到背面的内部。代码如下:

GLint oldFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// draw some polygons
[contentDelegate draw];

glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glColor4f(1, 1, 1, 1);
[texture drawInRect:CGRectMake(0, 0, 320, 480)];    
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);

[self swapBuffers];
我可以通过对(glTexCoordPointer)坐标进行相应的重新排序(在Texture2D的drawInRect方法中),轻松地将图像向右翻转,但这并不能解决“由内而外”的问题

我尝试用手动创建的OpenGL纹理替换Texture2D纹理,结果是一样的。绘制从PNG图像加载的纹理2D效果很好

对于绘制对象,每个顶点都指定了一个单位法线,并且启用了
GL\u NORMALIZE

glVertexPointer(3, GL_FLOAT, 0, myVerts);
glNormalPointer(GL_FLOAT, 0, myNormals);
glDrawArrays(GL_TRIANGLES, 0, numVerts);
当渲染到屏幕上时,一切都画得很好<代码>GL_深度_测试已启用,工作正常


关于如何解决这个问题有什么建议吗?谢谢

有趣的是,当直接绘制到backbuffer时,您会看到不同的结果。因为你是在iPhone平台上,所以你总是画到FBO,即使你画到backbuffer

确保在屏幕外FBO上连接了深度缓冲区。在初始化代码中,您可能希望在glBindFramebufferOES(…)之后添加以下代码段

// attach depth buffer
GLuint depthRenderbuffer;
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

对于“由内而外”的问题:如果前面的基本体被剔除,则顶点顺序存在问题,该顺序用于确定镶嵌面法线。这不是纹理的问题,除非我误解了什么。您是否启用了GL_CULL_面?GL_CULL_面未启用。启用它肯定会改善整体外观。现在,对象法线似乎是正确的出路,但许多应该隐藏的前向面现在都是可见的,无论它们是否(或者更确切地说,应该)被另一个面遮挡。这是否表明我的三角形缠绕有问题?我正在使用脚本从Blender导出顶点;出口时,我会确保绕组均匀。请注意,当我直接在屏幕上画图时,一切看起来都很完美(GL_CULL_FACE打开或关闭没有任何区别)。你可能已经了解了一些东西,但它还不起作用。。。执行此操作并附加纹理(如前所述)后,glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)返回GL_FRAMEBUFFER_Complete_DIMENSIONS_OES。帧缓冲区是否也需要附加颜色渲染缓冲区?(尝试得很快,还没有运气,但我会坚持下去。)顺便说一句,谢谢你的帮助,我真的很感激。哦,我的意思是将渲染添加到backbuffer中,然后使用glCopyTexSubImage2D复制到我的图像中,然后显示图像(一切都按它应该的方式绘制),速度太慢了。回到找出我的缓冲区出了什么问题…很有趣。是的,您也需要附加颜色渲染缓冲。顺便说一句,这与此无关,但您可能希望确保您的纹理对象具有两个大小的幂,以便它可以与较旧的iPhone配合使用。祝你好运好吧,我从项目中走出来,没有抽出时间来设置所有合适的缓冲区。我认为这是正确的,因为它可能是正确的。如果我再回来,我会把我的工作代码贴在这里。