Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';t使用Renderbuffer在帧缓冲区上绘制_C++_Opengl - Fatal编程技术网

C++ Can';t使用Renderbuffer在帧缓冲区上绘制

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,

您好,我正在尝试使用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, 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);