从 QOpenGLFramebuffer 创建 Cubemap
Create Cubemap from QOpenGLFramebuffer
我想使用 Qt 小部件为 IBL 实现立方体贴图卷积。
在实现从等距柱状贴图到立方体贴图的转换时,我运行遇到了一个我不明白的错误:
以下是我创建渲染缓冲区的方法:
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setInternalTextureFormat(GL_RGBA32F_ARB);
envTarget = new QOpenGLFramebufferObject(QSize(256, 256), format);
下面是我创建立方体贴图纹理的方法:
envCubemap = new QOpenGLTexture(QOpenGLTexture::TargetCubeMap);
envCubemap->create();
envCubemap->bind();
envCubemap->setSize(256, 256, 4);
envCubemap->setFormat(QOpenGLTexture::RGBAFormat);
envCubemap->allocateStorage(QOpenGLTexture::RGB, QOpenGLTexture::Float32);
envCubemap->setMinMagFilters(QOpenGLTexture::Nearest, QOpenGLTexture::Linear);
然后我继续将不同的立方体贴图视图渲染到纹理的相应部分:
envCubemap->bind(9);
glViewport(0, 0, 256, 256);
envTarget->bind();
for (unsigned int i = 0; i < 6; ++i)
{
ActiveScene->ActiveCamera->View = captureViews[i];
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 9, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawBackground();
}
envTarget->release();
drawBackground()
方法绘制了一个环境球体,它适用于我的默认缓冲区。
我得到的 openGL 错误是 1282。如果我注释掉 glFramebufferTexture2D
行,它会变为 0。 1282 对应于 GL_INVALID_OPERATION
或 GL_INVALID_VALUE
,根据 glFramebufferTexture2D
文档,这两者都有多个附加错误。
我做错了什么?我尝试遍历每个参数以解决此错误,但没有提出解决方案。因为这应该是相当标准的东西,所以我希望在这里找到解决方案 :D 帮助?
您需要实际告诉帧缓冲区,要使用其 ID 渲染哪个纹理,而不是“9”:
glFramebufferTexture2D(
GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
envCubemap->textureId(), // <--- The change
0);
envCubemap->bind(9);
同理,去掉即可
我想使用 Qt 小部件为 IBL 实现立方体贴图卷积。
在实现从等距柱状贴图到立方体贴图的转换时,我运行遇到了一个我不明白的错误:
以下是我创建渲染缓冲区的方法:
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setInternalTextureFormat(GL_RGBA32F_ARB);
envTarget = new QOpenGLFramebufferObject(QSize(256, 256), format);
下面是我创建立方体贴图纹理的方法:
envCubemap = new QOpenGLTexture(QOpenGLTexture::TargetCubeMap);
envCubemap->create();
envCubemap->bind();
envCubemap->setSize(256, 256, 4);
envCubemap->setFormat(QOpenGLTexture::RGBAFormat);
envCubemap->allocateStorage(QOpenGLTexture::RGB, QOpenGLTexture::Float32);
envCubemap->setMinMagFilters(QOpenGLTexture::Nearest, QOpenGLTexture::Linear);
然后我继续将不同的立方体贴图视图渲染到纹理的相应部分:
envCubemap->bind(9);
glViewport(0, 0, 256, 256);
envTarget->bind();
for (unsigned int i = 0; i < 6; ++i)
{
ActiveScene->ActiveCamera->View = captureViews[i];
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 9, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawBackground();
}
envTarget->release();
drawBackground()
方法绘制了一个环境球体,它适用于我的默认缓冲区。
我得到的 openGL 错误是 1282。如果我注释掉 glFramebufferTexture2D
行,它会变为 0。 1282 对应于 GL_INVALID_OPERATION
或 GL_INVALID_VALUE
,根据 glFramebufferTexture2D
文档,这两者都有多个附加错误。
我做错了什么?我尝试遍历每个参数以解决此错误,但没有提出解决方案。因为这应该是相当标准的东西,所以我希望在这里找到解决方案 :D 帮助?
您需要实际告诉帧缓冲区,要使用其 ID 渲染哪个纹理,而不是“9”:
glFramebufferTexture2D(
GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
envCubemap->textureId(), // <--- The change
0);
envCubemap->bind(9);
同理,去掉即可