C++ Can';t使用Renderbuffer在帧缓冲区上绘制
您好,我正在尝试使用opengl进行屏幕外渲染。我已经读了问题的答案。我在top answer中设置了所有内容,但opengl并没有使用帧缓冲区。至少我能从中得到数据。有一个例子。我做错了什么C++ Can';t使用Renderbuffer在帧缓冲区上绘制,c++,opengl,C++,Opengl,您好,我正在尝试使用opengl进行屏幕外渲染。我已经读了问题的答案。我在top answer中设置了所有内容,但opengl并没有使用帧缓冲区。至少我能从中得到数据。有一个例子。我做错了什么 #define GLEW_STATIC #define FREEGLUT_STATIC #include "GL\glew.h" #include "GL\freeglut.h" #include <cstdio> void RenderFunction(void); GLuint fbo,
#define GLEW_STATIC
#define FREEGLUT_STATIC
#include "GL\glew.h"
#include "GL\freeglut.h"
#include <cstdio>
void RenderFunction(void);
GLuint fbo, render_buf;
unsigned char *data = new unsigned char[256 * 256 * 4]();
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutCreateWindow("Lel");
glewInit();
glGenFramebuffers(1, &fbo); //
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); //
glGenRenderbuffers(1, &render_buf); // (1) Comment this section
glBindRenderbuffer(GL_RENDERBUFFER, render_buf); //
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 256, 256); //
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buf); //
glutDisplayFunc(RenderFunction);
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glutMainLoop();
}
void RenderFunction(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glColor4f(1.0f, 1.0f, 0.0f, 0.5f);
glVertex2f(1.0f, 1.0f);
glVertex2f(-1.0f, 1.0f);
glVertex2f(-1.0f, -1.0f);
glVertex2f(1.0f, -1.0f);
glEnd();
glFlush();
glReadBuffer(GL_COLOR_ATTACHMENT0); // (2) Comment first line and uncomment second
//glReadBuffer(GL_BACK); //
glReadPixels(0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, data);
printf("begin:\n");
for (int i = 0; i < 8; i++) {
printf("%d ", data[i]);
}
printf("\n");
printf("end:\n");
for (int i = 256 * 256 * 4 - 8; i < 256 * 256 * 4; i++) {
printf("%d ", data[i]);
}
printf("\n\n");
//glutSwapBuffers(); // (3) uncomment buffer swap
}
#定义GLEW#U静态
#定义FREEGLUT\u静态
#包括“GL\glew.h”
#包括“GL\freeglut.h”
#包括
void RenderFunction(void);
胶合fbo,渲染;
无符号字符*数据=新的无符号字符[256*256*4]();
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
创建窗口(“Lel”);
glewInit();
GLGEN帧缓冲区(1,&fbo);//
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);//
glGenRenderbuffers(1,&render_buf);/(1)对本节进行注释
glBindRenderbuffer(GL_RENDERBUFFER,render_buf);//
glRenderbufferStorage(GL_RENDERBUFFER,GL_RGBA,256,256);//
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_RENDERBUFFER,render_buf);//
glutDisplayFunc(渲染函数);
glClearColor(1.0f、1.0f、1.0f、0.0f);
glEnable(GL_线_光滑);
glEnable(GL_混合物);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
glHint(GL\u线\u平滑\u提示,GL\u最好);
glutMainLoop();
}
void RenderFunction(void)
{
glClear(GLU颜色缓冲位);
glBegin(GL_QUADS);
glColor4f(1.0f、1.0f、0.0f、0.5f);
glVertex2f(1.0f,1.0f);
glVertex2f(-1.0f,1.0f);
glVertex2f(-1.0f,-1.0f);
glVertex2f(1.0f,-1.0f);
格伦德();
glFlush();
glReadBuffer(GL_COLOR_ATTACHMENT0);/(2)注释第一行,取消注释第二行
//glReadBuffer(GL_BACK);//
glReadPixels(0,0,256,256,GL_RGBA,GL_无符号字节,数据);
printf(“开始:\n”);
对于(int i=0;i<8;i++){
printf(“%d”,数据[i]);
}
printf(“\n”);
printf(“结束:\n”);
对于(int i=256*256*4-8;i<256*256*4;i++){
printf(“%d”,数据[i]);
}
printf(“\n\n”);
//glutSwapBuffers();/(3)取消注释缓冲区交换
}
您将fbo
绑定为绘图帧缓冲区,但glReadPixels
将始终从GL\u read\u帧缓冲区读取。因此,您不会得到fbo
的内容,而是默认帧缓冲区的内容,glReadBuffer(GL\u COLOR\u ATTACHMENT0)
应该实际产生GL\u INVALID\u操作
错误,因为默认缓冲区只有GL\u FRONT
和GL\u BACK
颜色缓冲区,并且没有通用颜色附件
在许多源代码中,您将看到glBindFramebuffer(GL\u FRAMEBUFFER,…)
,这只是一个立即绑定GL\u READ\u FRAMEBUFFER
和GL\u DRAW\u FRAMEBUFFER
的快捷方式
通常,检查总账错误将有助于诊断此类问题。现代GL的功能大大提高了可用性和信息密度,因此您应该尽可能使用它
您的代码也缺少与您的FBO大小匹配的适当的glViewport
调用。最初,当GL上下文首次绑定到视口时,视口将设置为窗口的大小
您将fbo
绑定为绘图帧缓冲区,但glReadPixels
将始终从GL\u read\u帧缓冲区读取。因此,您不会得到fbo
的内容,而是默认帧缓冲区的内容,glReadBuffer(GL\u COLOR\u ATTACHMENT0)
应该实际产生GL\u INVALID\u操作
错误,因为默认缓冲区只有GL\u FRONT
和GL\u BACK
颜色缓冲区,并且没有通用颜色附件
在许多源代码中,您将看到glBindFramebuffer(GL\u FRAMEBUFFER,…)
,这只是一个立即绑定GL\u READ\u FRAMEBUFFER
和GL\u DRAW\u FRAMEBUFFER
的快捷方式
通常,检查总账错误将有助于诊断此类问题。现代GL的功能大大提高了可用性和信息密度,因此您应该尽可能使用它
您的代码也缺少与您的FBO大小匹配的适当的glViewport
调用。最初,当GL上下文第一次绑定到视口时,视口将设置为窗口的大小。为什么要混合使用新旧OpenGL?我将去掉glBegin、glColor4f、glVertex2f和其他OGL<3.2命令。来吧,跳进着色器时代。@Ripi2对不起,我是opengl和着色器方面的新手。所以我选择了最简单的方法。我的任务也非常简单。只需画一堆二维线,并将它们保存为png。为什么要混合使用新旧OpenGL?我将去掉glBegin、glColor4f、glVertex2f和其他OGL<3.2命令。来吧,跳进着色器时代。@Ripi2对不起,我是opengl和着色器方面的新手。所以我选择了最简单的方法。我的任务也非常简单。只需画一堆二维线,并将它们保存为png。哦,我的天啊。我试过多次切换GL\u帧缓冲区
,GL\u DRAW\u帧缓冲区
,GL\u READ\u帧缓冲区
。现在它终于起作用了。非常感谢。也谢谢你的关于OpenGL调试的页面。哦,我的上帝。我试过多次切换GL\u帧缓冲区
,GL\u DRAW\u帧缓冲区
,GL\u READ\u帧缓冲区
。现在它终于起作用了。非常感谢。也感谢您提供有关OpenGL调试的页面。
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);