Opengl FBO渲染问题-在同一应用程序中使用生成的FBO颜色/深度进行GLSL绘图
带有两个立方体的图像在使用BLIT调用-测试代码时可用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
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作为深度缓冲可能会更好。但要做到这一点,您必须使用所有相应的调用:
- 使用
创建idglGenRenderbuffers
- 用
绑定它glBindRenderbuffer
- 为其分配了
glRenderbufferStorage
- 使用
将其连接到FBOglFramebufferRenderbuffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fboInfo.depth, 0);