我正在尝试使用iPhone上的OpenGL ES将内容渲染到纹理中,然后将该纹理绘制到屏幕上。我以这个问题为起点,在Apple演示EAGLView的子类中进行绘图。
实例变量:
现在,如果我像往常一样将场景绘制到屏幕上,那么它就能正常工作:
我可以通过重新排列(在Texture2D的drawInRect方法中)(glTexCoordPointer)坐标来轻松地将图像上下翻转,但这并不能解决“里外颠倒”的问题。
我尝试用手动创建的OpenGL纹理替换Texture2D纹理,结果相同。从PNG图像加载的Texture2D绘制正常。
至于绘制对象,每个顶点都有一个单位法线指定,并启用了GL_NORMALIZE。
实例变量:
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];
我可以通过重新排列(在Texture2D的drawInRect方法中)(glTexCoordPointer)坐标来轻松地将图像上下翻转,但这并不能解决“里外颠倒”的问题。
我尝试用手动创建的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
并且工作得很好。
有什么建议可以解决这个问题吗?谢谢!