Создать Cubemap из QOpenGLFramebuffer - PullRequest
0 голосов
/ 03 июня 2018

Я хочу реализовать свертку кубической карты для IBL с использованием виджета Qt.

При реализации преобразования из карты с прямым углом в кубическую карту я столкнулся с ошибкой, которую не понимаю:

Воткак я создаю свой буфер визуализации:

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. Она превращается в 0, если я закомментирую glFramebufferTexture2D строка.1282 соответствует GL_INVALID_OPERATION или GL_INVALID_VALUE, где к обоим из них прикреплено несколько ошибок в соответствии с документацией glFramebufferTexture2D.

Что я сделал не так?Я попытался перебрать каждый параметр, чтобы решить эту ошибку, но не нашел решения.Поскольку это должно быть довольно стандартным материалом, я надеюсь найти решение здесь: D Помощь?

1 Ответ

0 голосов
/ 03 июня 2018

Вы должны указать фреймбуферу, какую текстуру визуализировать, используя его идентификатор, а не '9':

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

То же самое относится к envCubemap->bind(9);, который можно просто удалить.

...