Tôi đang gặp sự cố khi tạo FBO và sau đó sử dụng làm kết cấu trong ứng dụng iOS của mình. Tôi đã tải lên một phiên bản rút gọn của ứng dụng của tôi trên github, trong đó cho thấy vấn đề. Tôi chỉ nhận được một màn hình trống với một màu lạ mà tôi chưa từng đặt. Kiểm tra trạng thái cho thấy rằng FBO đã được tạo thành công.Ví dụ tối thiểu để tạo FBO bằng OpenGL ES 2.0 trên iOS
https://github.com/glman74/simpleFBO
tôi đã xem xét câu hỏi stackoverflow có liên quan, và đặc biệt là liên kết dưới đây từ datenwolf trong đó cho thấy làm thế nào để thiết lập một FBO sử dụng dư thừa, nhưng không sử dụng bóng đổ. Tôi vẫn không chắc mình đang làm gì sai.
https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/minimalfbo/
Tôi cũng phụ thêm ở đây các phần có liên quan của mã. Trong phương thức renderFBO, tôi chỉ làm rõ ràng. Tôi đã có thể mong đợi rằng kết cấu màu (màu xanh) rắn này sẽ được sử dụng khi tôi vẽ đa giác trong render chính.
FBO thiết lập:
// 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);
}
FBO render:
// 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);
}
chính Render:
- (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);
}
Một ý tưởng về những gì tôi có thể làm sai?
Chỉnh sửa # 1:
Tôi đã thực hiện một số thay đổi nhỏ đối với mã của mình tại github. Đã thử sử dụng GL_FRAMEBUFFER thay vì GL_DRAW_FRAMEBUFFER_APPLE ở trên. Cũng đã thêm một cuộc gọi kết cấu ràng buộc, đó là mất tích. Vẫn không hoạt động.
Chỉnh sửa # 2:
Tôi đã tìm được giải pháp. Tôi cần gọi để hiển thị chính:
// reset to main framebuffer
[((GLKView *) self.view) bindDrawable];
Cảm ơn, ví dụ của bạn thực sự đã giúp tôi. Nếu ai đó có lỗi biên dịch với GL_DEPTH_COMPONENT24_OES, hãy thay thế bằng GL_DEPTH_COMPONENT16 – LightMan