我在创建FBO时遇到问题,然后在我的iOS应用程序中将其用作纹理.我在github上传了我的应用程序的精简版,显示了问题.我只是一个空白的屏幕,有一种奇怪的颜色,我从来没有设置过.检查状态显示FBO已成功创建.
https://github.com/glman74/simpleFBO
我已经查看了相关的stackoverflow问题,特别是datenwolf下面的链接,它显示了如何使用GLUT设置FBO,但不使用着色器.我仍然不确定我做错了什么.
https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/minimalfbo/
我还在这里附上代码的相关部分.在renderFBO方法中,我只是在做清楚.我原本期望在主渲染中渲染多边形时使用这种纯色(绿色)纹理.
FBO设置:
// intialize FBO
- (void)setupFBO
{
fbo_width = 512;
fbo_height = 512;
glGenFramebuffers(1, &fboHandle);
glGenTextures(1, &fboTex);
glGenRenderbuffers(1, &depthBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, fboHandle);
glBindTexture(GL_TEXTURE_2D, fboTex);
glTexImage2D( GL_TEXTURE_2D,
0,
GL_RGBA,
fbo_width, fbo_height,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER_APPLE, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTex, 0);
glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, fbo_width, fbo_height);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_APPLE, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
// FBO status check
GLenum status;
status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
switch(status) {
case GL_FRAMEBUFFER_COMPLETE:
NSLog(@"fbo complete");
break;
case GL_FRAMEBUFFER_UNSUPPORTED:
NSLog(@"fbo unsupported");
break;
default:
/* programming error; will fail on all hardware */
NSLog(@"Framebuffer Error");
break;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
Run Code Online (Sandbox Code Playgroud)
FBO渲染:
// render FBO
- (void)renderFBO
{
glBindTexture(GL_TEXTURE_2D, 0);
glEnable(GL_TEXTURE_2D);
glBindFramebuffer(GL_FRAMEBUFFER, fboHandle);
glViewport(0,0, fbo_width, fbo_height);
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
Run Code Online (Sandbox Code Playgroud)
主要渲染:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
// render FBO tex
[self renderFBO];
glViewport(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
// render main
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glUniform1i(uSamplerLoc, 0);
// Render
glUseProgram(_program);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisable(GL_TEXTURE_2D);
}
Run Code Online (Sandbox Code Playgroud)
关于我可能做错了什么的想法?
编辑#1:
我在github上对代码做了一些小改动.尝试使用GL_FRAMEBUFFER而不是上面的GL_DRAW_FRAMEBUFFER_APPLE.还添加了一个缺少绑定纹理调用.仍然无法正常工作.
编辑#2:
我找到了解决方案.我需要调用main渲染:
// reset to main framebuffer
[((GLKView *) self.view) bindDrawable];
Run Code Online (Sandbox Code Playgroud)
找到了解决方案,我已经更新了下面的代码,以防它对某人有用.
https://github.com/glman74/simpleFBO/
主要问题是我需要调用main渲染:
// reset to main framebuffer
[((GLKView *) self.view) bindDrawable];
Run Code Online (Sandbox Code Playgroud)
这是因为我使用的是GLKView.情况与CAEAGLLayer示例不同.
| 归档时间: |
|
| 查看次数: |
12847 次 |
| 最近记录: |