Как построить текстуру кубической карты с помощью QOpenGLTexture?

Я хочу построить текстуру кубической карты, используя QOpenGLTexture, используя 6 изображений. Думаю, я правильно их разместил.

Я использую следующий код для построения кубической карты

const QImage posx = QImage(":/images/posx.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);
const QImage posy = QImage(":/images/posy.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);
const QImage posz = QImage(":/images/posz.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);
const QImage negx = QImage(":/images/negx.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);
const QImage negy = QImage(":/images/negy.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);
const QImage negz = QImage(":/images/negz.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);

d->environment = new QOpenGLTexture(QOpenGLTexture::TargetCubeMap);
d->environment->create();
d->environment->setSize(posx.width(), posx.height(), posx.depth());
d->environment->setFormat(QOpenGLTexture::RGBA8_UNorm);
d->environment->allocateStorage();
d->environment->setData(0, 0, QOpenGLTexture::CubeMapPositiveX,
                        QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                        (const void*)posx.constBits(), 0);
d->environment->setData(0, 0, QOpenGLTexture::CubeMapPositiveY,
                        QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                        (const void*)posy.constBits(), 0);
d->environment->setData(0, 0, QOpenGLTexture::CubeMapPositiveZ,
                        QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                        (const void*)posz.constBits(), 0);
d->environment->setData(0, 0, QOpenGLTexture::CubeMapNegativeX,
                        QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                        (const void*)negx.constBits(), 0);
d->environment->setData(0, 0, QOpenGLTexture::CubeMapNegativeY,
                        QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                        (const void*)negy.constBits(), 0);
d->environment->setData(0, 0, QOpenGLTexture::CubeMapNegativeZ,
                        QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                        (const void*)negz.constBits(), 0);
d->environment->setWrapMode(QOpenGLTexture::ClampToEdge);
d->environment->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
d->environment->setMagnificationFilter(QOpenGLTexture::LinearMipMapLinear);

Затем я привязываю текстуру среды во время paintGL() следующим образом:

.....
d->environment->bind(0);
d->shader->setUniformValue("qt_Environment", 0);

const int nrIndicies = d->torusResolution * d->tubeResolution * 6;
glDrawElements(GL_TRIANGLES, nrIndicies, GL_UNSIGNED_INT, (void*)0);
.....

Фрагмент вершинного шейдера выглядит следующим образом

....
varying vec3 v_TexCoord;
....

void main(void)
{
    ....
    v_TexCoord = normalize(v_Normal + v_Position);
    ....
}

Фрагмент фрагмента шейдера выглядит следующим образом

.....
varying vec3 v_TexCoord;
uniform samplerCube qt_Environment;
.....

vec4 evaluateColor(in vec3 normal, in vec3 texCoord)
{
    vec3 finalColor ....
    .....
    .....

    finalColor += textureCube(qt_Environment, texCoord).rgb;    
    return vec4( finalColor, c_one );
}

void main(void)
{
    gl_FragColor = evaluateColor(v_Normal, v_TexCoord);
}

У меня также есть другая часть кода, которая отображает кубическую карту на скайбоксе. Хотя я могу спроецировать 6 изображений на скайбокс и отрисовать их правильно, я не могу отобразить отражение на объекте тора в сцене.

Я получаю хорошо освещенный тор без отражения.

Может кто-нибудь помочь с этим, пожалуйста?


person Prashanth N Udupa    schedule 01.02.2016    source источник
comment
Правильный способ указать, что вы нашли ответ самостоятельно, — опубликовать ответ как ответ. То есть используйте поле Post Answer внизу. Это нормально, чтобы ответить на свой вопрос.   -  person Nicol Bolas    schedule 01.02.2016
comment
@NicolBolas: Хорошо. Спасибо, что указали. Это мой первый вопрос о стеке, я поумнею от этого :-)   -  person Prashanth N Udupa    schedule 01.02.2016


Ответы (1)


РЕДАКТИРОВАТЬ: Эта проблема теперь РЕШЕНА. http://lists.qt-project.org/pipermail/interest/2016-February/020788.html

Мне пришлось вызвать generateMipMap() для текстуры окружения, прежде чем применять ее к тору.

person Prashanth N Udupa    schedule 01.02.2016