2016-02-01 5 views
0

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

Я использую следующий код для построения cubemap

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); 
..... 

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

.... 
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); 
} 

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

I am getting a well lit torus, with no reflection.

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

+1

Правильный способ указать, что вы нашли ответ самостоятельно, чтобы отправить ответ * в качестве ответа *. То есть, используйте поле «Ответ на сообщение» внизу. Это нормально, чтобы ответить на собственный вопрос. –

+0

@NicolBolas: Хорошо. Спасибо за указание. Это мой первый вопрос, связанный с stackoverflow, я смужусь от этого :-) –

ответ