sb.*_*sb. 7 iphone opengl-es render-to-texture
我正在尝试渲染纹理,然后使用iPhone上的OpenGL ES将该纹理绘制到屏幕上.我正在使用这个问题作为起点,并在Apple的演示EAGLView的子类中进行绘图.
实例变量:
GLuint textureFrameBuffer;
Texture2D * texture;
Run Code Online (Sandbox Code Playgroud)
要初始化帧缓冲区和纹理,我这样做:
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);
Run Code Online (Sandbox Code Playgroud)
现在,如果我像往常一样将我的场景画到屏幕上,它可以正常工作:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// draw some triangles, complete with vertex normals
[contentDelegate draw];
[self swapBuffers];
Run Code Online (Sandbox Code Playgroud)
但是,如果我渲染到'textureFrameBuffer',然后在屏幕上绘制'纹理',则生成的图像会颠倒并"向内".也就是说,看起来三维物体的法线指向内部而不是外部 - 每个物体的最前面是透明的,我可以看到背面的内部.这是代码:
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];
Run Code Online (Sandbox Code Playgroud)
通过相应地重新排序(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);
Run Code Online (Sandbox Code Playgroud)
当它渲染到屏幕上时,一切都很好; 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15554 次 |
| 最近记录: |