从 QOpenGLFramebuffer 创建 Cubemap

Posted

技术标签:

【中文标题】从 QOpenGLFramebuffer 创建 Cubemap【英文标题】:Create Cubemap from QOpenGLFramebuffer 【发布时间】:2018-06-03 13:11:22 【问题描述】:

我想使用 Qt 小部件为 IBL 实现立方体贴图卷积。

在实现从 equirectangular 贴图到立方体贴图的转换时,我遇到了一个我不明白的错误:

这是我创建渲染缓冲区的方法:

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_OPERATIONGL_INVALID_VALUE,根据glFramebufferTexture2D 文档,这两个都附加了多个错误。

我做错了什么?我尝试迭代每个参数以解决此错误,但没有提出解决方案。由于这应该是相当标准的东西,我希望在这里找到解决方案:D 帮助?

【问题讨论】:

【参考方案1】:

您实际上需要告诉帧缓冲区,使用它的 ID 来渲染哪个纹理,而不是“9”:

glFramebufferTexture2D(
     GL_FRAMEBUFFER,
     GL_COLOR_ATTACHMENT0,
     GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
     envCubemap->textureId(), // <--- The change
     0);

envCubemap-&gt;bind(9); 也是如此,可以简单地删除。

【讨论】:

以上是关于从 QOpenGLFramebuffer 创建 Cubemap的主要内容,如果未能解决你的问题,请参考以下文章

从 .c 创建 DLL 文件

如何在 C/C++ 中从系数和 10 的幂创建双精度数?

如何从 C 结构创建 Lua 表

从 C 代码创建 cupy.array() 的 C 头文件

如果'C'从'B'公开继承,B私下从'A'继承,为啥我不能在'C'内部创建'A'的对象? [复制]

从 C 包装器创建 C++ 对象