当前位置: 首页 > 知识库问答 >
问题:

OpenGL帧缓冲-渲染到纹理创建纹理与主要帧缓冲内容

濮嘉茂
2023-03-14

这是更大项目的一部分,基本上,我用以下方式创建带有颜色、深度和模具缓冲区的帧缓冲区:

// Create texture
glGenTextures(1, &m_textureInput);
glBindTexture(GL_TEXTURE_2D, m_textureInput);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWidth(), getHeight(), 0, GL_BGRA, GL_UNSIGNED_BYTE, 0);
// Create FBOs
glGenFramebuffers(1, &m_fboInput);

glBindFramebuffer(GL_FRAMEBUFFER, m_fboInput);

// Attach texture to it
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textureInput, 0);

// Render buffer, depth with stencil
glGenRenderbuffers(1, &m_rbDepthStencilInput);
glBindRenderbuffer(GL_RENDERBUFFER, m_rbDepthStencilInput);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, getWidth(), getHeight());
//Attach depth buffer to FBO
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthStencilInput);
//Also attach as a stencil
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthStencilInput);

status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)
{
    // Restore current framebuffer
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    return false;
}

glBindFramebuffer(GL_FRAMEBUFFER, 0);

我用以下方法将其绑定:

glBindFramebuffer(GL_FRAMEBUFFER, m_fboInput);
// render
glBindFramebuffer(GL_FRAMEBUFFER, 0);

当我转储附加的纹理:

glBindTexture(GL_TEXTURE_2D, m_textureInput);
long imageSize = x * y * 4;
unsigned char *data = new unsigned char[imageSize];
glReadPixels(0,0,x,y, GL_BGRA,GL_UNSIGNED_BYTE,data);

我收到主帧缓冲区(0)的内容。

知道我哪里错了吗?先谢谢你。

共有1个答案

司徒捷
2023-03-14

glReadPixels文档称它从帧缓冲区读取数据。因为您之前将零绑定到它,我猜它将从默认帧缓冲区读取。

您可以绑定帧缓冲区对象,然后使用GL_COLOR\u ATTACHMENT0调用glReadBuffer,然后执行glReadPixels,或者更直接地使用glGetTexImage直接读取纹理。

 类似资料:
  • 我做了一个在上面渲染天空盒和粒子的应用程序。我想添加一些效果,我需要使用帧缓冲区来渲染天空盒、粒子颜色、深度和位置以分离纹理。然后我想使用简单的着色器来使用这些纹理中的值并以适当的方式混合它们。我为纹理、帧缓冲区和屏幕四边形(渲染简单的矩形)编写了辅助类,但不幸的是——当我尝试使用它时没有任何渲染。 当绑定帧缓冲区被注释掉时,我的场景如下所示: 修改着色器表明深度和位置值计算正确。因此问题在于纹理

  • 我正在使用JOGL,但这个问题一般适用于OpenGL。似乎存在类似的问题,但它们要么针对GLSL代码,要么与复制帧缓冲区的内容有关,要么是一般建议-使用帧缓冲区对象,而不是。 我正在做一些阴影映射。如何使用帧缓冲对象将深度通道直接渲染到纹理? 能否请你贴一段初始化纹理和帧缓冲对象的代码,以及渲染场景前初始化一切的代码? 目前,我使用<code>glCopyTexSubImage2D<code>。我

  • 这是我试图执行的主要程序: 但是,我看到的不是纹理而是白色矩形。如果我在屏幕上渲染,我会得到预期的结果(因此渲染代码应该没有问题)。这是FrameBuffer类: 其他一切都经过测试,所以问题应该在主程序的逻辑或帧缓冲区中。 顺便说一下,视口大小iz与窗口大小完全相同。

  • 我已经找了几个小时来解决我的问题。首先我有高清7800系列amd GPU,最新的驱动程序。 我正在尝试创建一个framebuffer类,它拥有我需要的所有framebuffer函数。看起来我让renderbuffers开始工作了,但绘制到纹理会导致非常奇怪的错误。 GLCHECKFRAMEBERSTATUS在两次检查时返回GL_FRAMEBUFFER_Completed_附件。createDept

  • 我是OpenGL的新手。我想使用帧缓冲区读取并保存渲染场景中的所有深度值。我设法将其设置为附加到深度组件的帧缓冲区。但是当我将深度纹理渲染到默认帧缓冲区(显示窗口)时,它只显示白色,即使我线性化了深度值(教程从https://learnopengl.com/开始)。当我在默认帧缓冲区片段着色器中从gl_FragCoord. z访问深度值时,我会得到一个深度图,并且绘图也可以,但是当将深度作为纹理从

  • 我正在尝试使用OpenGL GLSL着色器渲染到纹理。首先,我尝试用白色填充30x30纹理的每个像素。我将顶点着色器索引从0传递到899,表示纹理的每个像素。对吗?顶点着色器: 片段着色器: