OpenGL ES呈现纹理,然后绘制纹理

我试图渲染到纹理,然后使用iPhone上的OpenGL ES将该纹理绘制到屏幕上。 我以这个问题为出发点,并在苹果演示EAGLView的子类中进行绘图。

实例变量:

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',然后在屏幕上绘制'纹理',则生成的图像会颠倒并“翻转”。 也就是说,看起来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图像加载的Texture2D可以正常工作。

至于绘制对象,每个顶点都有一个指定的单位,并启用了GL_NORMALIZE

glVertexPointer(3, GL_FLOAT, 0, myVerts);
glNormalPointer(GL_FLOAT, 0, myNormals);
glDrawArrays(GL_TRIANGLES, 0, numVerts);

当它呈现在屏幕上时,一切都很好; GL_DEPTH_TEST已启用并且运行良好。

有关如何解决这个问题的任何建议? 谢谢!


这个有趣的部分是,当直接绘制到后台缓冲区时,你会看到不同的结果。 既然你是在iPhone平台上,即使你正在绘制到后台缓冲区,你也总是在绘制一个FBO。

确保你有一个深度缓冲区连接到你的离线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);
链接地址: http://www.djcxy.com/p/879.html

上一篇: OpenGL ES render to texture, then draw texture

下一篇: play a waveform at a certain frequency in SDL callback function