FBO绑定,但没有被卷入其中
FBO bound but gets nothing drawn into it
我正在使用c++和OpenGL 3.3构建一个迷你游戏引擎,几乎所有内容都设置好了,除了后期处理效果。我开始阅读有关framebuffer的内容,并认为这不会是一个问题,我错了…
似乎framebuffers在被绑定后没有被使用。看一下代码示例:
....
GLuint FBO;
glViewport(0, 0, 800, 600);
glLoadIdentity();
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
GLuint texColorBuffer;
glGenTextures(1, &texColorBuffer);
glBindTexture(GL_TEXTURE_2D, texColorBuffer);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, 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_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0
);
GLenum drawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, drawBuffers);
GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
std::cout << "Not completed!" << std::endl;
// Clear the screen
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Read the framebuffer pixels back to check if it 'cleared' to white
unsigned char *img = new unsigned char[104857600];
glReadPixels(0, 0, 800, 600, GL_RGBA, GL_UNSIGNED_BYTE, img);
std::cout << img << std::endl;
delete[] img;
exit(1);
....
但是,一旦我读回framebuffer像素,我什么也得不到,只是一个大的空博客(像许多行结尾)。这个代码有什么问题吗?此外,我几乎确定OpenGL设置正确,我有很多绘图后,这个"测试"块的代码。
编辑
这些是我使用的初始化标志:
// Initializes and binds VAO (vertex arrary object)
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
// Enabling stuff
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Other
glDisable(GL_DEPTH_TEST);
我也在使用SDL 2.0.1, GLEW(到目前为止的最新版本)和TDM-GCC (GCC 4.8.1)
更新历史:
- 修改代码与张贴的建议(状态检查和glTexSubImage2D)
- 删除glTexSubImage
从FrameBuffer读取像素返回数据,但您正在渲染到纹理,因此使用glGetTexImage或TexSubImage2D来获取已经绘制到纹理上的内容。
如果你仍然想使用readPixel,创建一个renderBuffer并与glFramebufferRenderbuffer绑定,或者你也可以在创建fbo时使用GL_READ_FRAMEBUFFER或GL_DRAW_FRAMEBUFFER来允许使用readPixel。
....
GLuint FBO;
glViewport(0, 0, 800, 600);
glLoadIdentity();
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
GLuint texColorBuffer;
glGenTextures(1, &texColorBuffer);
glBindTexture(GL_TEXTURE_2D, texColorBuffer);
替换:
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL
);
由:glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA, 800, 600, 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_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0
);
GLenum drawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, drawBuffers);
GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
std::cout << "Not completed!" << std::endl;
// Clear the screen
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Read the framebuffer pixels back to check if it 'cleared' to white
unsigned char *img = new unsigned char[104857600];
替换:
glReadPixels(0, 0, 800, 600, GL_RGBA, GL_UNSIGNED_BYTE, img);
由:glGetTexImage( GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, img);
std::cout << img << std::endl;
delete[] img;
exit(1);
....
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- C++绑定(已弃用)
- 运行时错误:引用绑定到类型为"int"的空指针
- 将绑定到FBO的纹理复制到另一个OpenGL上下文
- FBO绑定,但没有被卷入其中