GL_FRAMEBUFFER
时间: 2023-06-23 15:51:00 浏览: 145
`GL_FRAMEBUFFER` 是 OpenGL 中的一个常量,它代表帧缓冲对象的绑定目标。在 OpenGL 中,我们可以同时绑定多个类型的对象(如纹理、渲染缓冲等),因此需要指定绑定的目标类型。当我们使用 `glBindFramebuffer` 函数绑定帧缓冲对象时,我们需要指定绑定目标为 `GL_FRAMEBUFFER`,例如:
```c++
GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
```
这样就将生成的 `framebuffer` 对象绑定到了帧缓冲对象绑定目标上,后续对帧缓冲对象的操作将作用在这个对象上。在解绑帧缓冲对象时,我们可以使用 `glBindFramebuffer(GL_FRAMEBUFFER, 0)` 将绑定目标指定为默认帧缓冲对象,或者使用 `glBindFramebuffer(GL_FRAMEBUFFER, another_framebuffer)` 将绑定目标指定为另一个帧缓冲对象。
相关问题
glCheckFramebufferStatus 返回GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT原因
GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 表示帧缓存不完整,缺少附加图像。这通常是由于您在创建帧缓存时没有正确附加所有必需的图像附件所致。您需要调用 glFramebufferTexture 或 glFramebufferRenderbuffer 函数,将所有必需的图像附件附加到帧缓存中。如果您已经正确附加了所有必需的图像附件,请确保它们都已初始化并且它们的分辨率与帧缓存的分辨率匹配。如果您仍然无法解决此问题,请检查您是否正确地设置了视口和投影矩阵。
void renderFrame(int w, int h, unsigned char* image, const char* my2String,Rect rect) { glClear(GL_COLOR_BUFFER_BIT); // glBindFramebuffer(GL_FRAMEBUFFER, gTexture); glUseProgram(gProgram); glBindFramebuffer(GL_FRAMEBUFFER, gFbo); u_MosaicPosition = glGetUniformLocation(gProgram, "uMosaicPosition"); glUniform2f(u_MosaicPosition, rect.x, rect.y); u_MosaicSize = glGetUniformLocation(gProgram, "uMosaicSize"); glUniform1f(u_MosaicSize, rect.width); texture_uniform = glGetUniformLocation(gProgram, "Texture"); glUniform1i(texture_uniform, 0); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, indices); glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, image); //saveRGB(my2String, image, w, h); //eglSwapBuffers(eglGetCurrentDisplay(), eglGetCurrentSurface(EGL_DRAW)); }每行都是什么意思
这是一个渲染图像的函数,下面是每行代码的含义:
1. 清空颜色缓冲区
```
glClear(GL_COLOR_BUFFER_BIT);
```
2. 使用着色器程序
```
glUseProgram(gProgram);
```
3. 绑定帧缓冲对象
```
glBindFramebuffer(GL_FRAMEBUFFER, gFbo);
```
4. 获取着色器程序中的uniform变量uMosaicPosition的位置,并将矩形的左下角位置传递给它
```
u_MosaicPosition = glGetUniformLocation(gProgram, "uMosaicPosition");
glUniform2f(u_MosaicPosition, rect.x, rect.y);
```
5. 获取着色器程序中的uniform变量uMosaicSize的位置,并将矩形的宽度传递给它
```
u_MosaicSize = glGetUniformLocation(gProgram, "uMosaicSize");
glUniform1f(u_MosaicSize, rect.width);
```
6. 获取着色器程序中的uniform变量Texture的位置,并将纹理单元编号传递给它
```
texture_uniform = glGetUniformLocation(gProgram, "Texture");
glUniform1i(texture_uniform, 0);
```
7. 绘制矩形,使用索引缓冲区进行绘制
```
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, indices);
```
8. 读取像素数据到内存中的image数组中
```
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, image);
```
9. 保存图像到文件(这行代码被注释掉了)
```
//saveRGB(my2String, image, w, h);
```
10. 交换缓冲区(这行代码被注释掉了)
```
//eglSwapBuffers(eglGetCurrentDisplay(), eglGetCurrentSurface(EGL_DRAW));
```
阅读全文