Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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
Opengl FBO渲染问题-在同一应用程序中使用生成的FBO颜色/深度进行GLSL绘图_Opengl_Graphics_Opengl Es_Opengl Es 2.0_Fbo - Fatal编程技术网

Opengl FBO渲染问题-在同一应用程序中使用生成的FBO颜色/深度进行GLSL绘图

Opengl FBO渲染问题-在同一应用程序中使用生成的FBO颜色/深度进行GLSL绘图,opengl,graphics,opengl-es,opengl-es-2.0,fbo,Opengl,Graphics,Opengl Es,Opengl Es 2.0,Fbo,带有两个立方体的图像在使用BLIT调用-测试代码时可用 typedef struct { GLuint id; GLuint color; GLuint depth; }FBOInfo; 只有一个多维数据集的图像不使用BLIT调用-测试代码 typedef struct { GLuint id; GLuint color; GLuint depth; }FBOInfo; 各位, 请按照以下所附图片和代码操作。 unsig

带有两个立方体的图像在使用BLIT调用-测试代码时可用

typedef struct {
    GLuint id;
    GLuint color;
    GLuint depth;
}FBOInfo;
只有一个多维数据集的图像不使用BLIT调用-测试代码

typedef struct {
    GLuint id;
    GLuint color;
    GLuint depth;
}FBOInfo;
各位, 请按照以下所附图片和代码操作。

            unsigned long i = 0;
            int ret = init_gl();
            ret = createFBO();
            draw(i);
            EGL_CHECK(eglSwapBuffers(eglDisplay, eglSurface));
在过去两天里一直在努力解决这个问题

在下面的代码中使用FBO时遇到了一个问题,我能够成功地附加并渲染到FBO,但在同一个程序中无法将其用作纹理(颜色和深度缓冲区),渲染到FBO后我的glReadpixel调用显示了Zero的所有数据

在GLSL-shader代码中使用生成的FBO(颜色、深度)时,该代码从Draw2()调用。函数显示一个没有纹理的混合白色立方体

请建议…,以下是完整的代码,我正在创建一个FBO&使用两个着色器,一个用于正常渲染,另一个使用先前处理的FBO的颜色和深度

这是我的着色器代码

        init_gl()
        {
此片段着色器代码用于在draw()下的程序中使用的正常渲染。

此片段着色器代码在draw2()下的Program2中使用。

我在FBO上的第一幅画

    static void draw(uint32_t i)
    {

            EGL_CHECK(glEnable(GL_DEPTH_TEST)); 
        glEnable(GL_TEXTURE_2D);
        EGL_CHECK(glDepthFunc(GL_ALWAYS));
            EGL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, fboInfo.id));
        EGL_CHECK(glUseProgram(program));

        //CUBE DRAWING
在此处读取像素,返回所有零

        GLubyte *pixels = malloc(4 * 256 * 256);
        EGL_CHECK(glReadBuffer(GL_COLOR_ATTACHMENT0));
        EGL_CHECK(glReadPixels(0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, pixels));

            //**TO TEST my FBO , IF ITS HAVING SOME RENDER DATA**
        EGL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, 0));
        glBindFramebuffer(GL_READ_FRAMEBUFFER, fboInfo.id); 
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
        glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_COLOR_BUFFER_BIT, GL_NEAREST);
        glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
            //TEST CODE ONLY

        glBindTexture(GL_TEXTURE_2D, fboInfo.id);
            glGenerateMipmap(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, 0);

        draw2(i);

    }
第二个没有FBO的图形(但这使用可以访问FBO数据颜色、深度的FRAG着色器)

这些函数用于创建FBO(颜色、深度)

这就是我的FBO结构的样子

typedef struct {
    GLuint id;
    GLuint color;
    GLuint depth;
}FBOInfo;
我的主函数在下面显示,我在这里创建FBO,然后调用绘图函数并交换缓冲区。

            unsigned long i = 0;
            int ret = init_gl();
            ret = createFBO();
            draw(i);
            EGL_CHECK(eglSwapBuffers(eglDisplay, eglSurface));

由于这是相当多的代码,并且您建议问题在于FBO设置,因此我将重点放在该部分。我确实在设置附件的代码部分发现了一个关键问题:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fboInfo.depth, 0);
如果在此之后调用
glGetError()
,您应该会看到返回的错误,因为
GL\u RENDERBUFFER
不是第三个参数的有效值。唯一有效的参数是
GL\u TEXTURE\u 2D
GL\u TEXTURE\u CUBE\u MAP.*
值。在这种情况下,您必须使用
GL\u TEXTURE\u 2D

如果您从未将renderbuffer用作纹理,那么使用renderbuffer作为深度缓冲可能会更好。但要做到这一点,您必须使用所有相应的调用:

  • 使用
    glGenRenderbuffers
    创建id
  • glBindRenderbuffer
    绑定它
  • 为其分配了
    glRenderbufferStorage
  • 使用
    glFramebufferRenderbuffer
    将其连接到FBO

当我更改枚举值并将其替换为GL_TEXTURE_2D时,会出现FBO设置不正确的错误。。。
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fboInfo.depth, 0);