QT OpenGL 天空盒

正常加载shader program 就是图片不一样了 立方体贴图 可以看看learnopengl

QT里面封装了

QOpenGLTexture

这个类设置target就可以加载立方体贴图

initTextures()
{
 
 
        const QImage posx = QImage(":/left.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);
        const QImage posy = QImage(":/bottom.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);
        const QImage posz = QImage(":/front.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);
        const QImage negx = QImage(":/right.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);
        const QImage negy = QImage(":/top.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);
        const QImage negz = QImage(":/back.jpg").mirrored().convertToFormat(QImage::Format_RGBA8888);
 
 
      enviroment = new QOpenGLTexture(QOpenGLTexture::TargetCubeMap);
      enviroment->create();
      enviroment->setSize(posx.width(), posx.height(), posx.depth());
      enviroment->setFormat(QOpenGLTexture::RGBA8_UNorm);
      enviroment->allocateStorage();
      enviroment->setData(0, 0, QOpenGLTexture::CubeMapPositiveX,
                         QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                         (const void*)posx.constBits(), 0);
      enviroment->setData(0, 0, QOpenGLTexture::CubeMapPositiveY,
                         QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                         (const void*)posy.constBits(), 0);
      enviroment->setData(0, 0, QOpenGLTexture::CubeMapPositiveZ,
                         QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                         (const void*)posz.constBits(), 0);
      enviroment->setData(0, 0, QOpenGLTexture::CubeMapNegativeX,
                         QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                         (const void*)negx.constBits(), 0);
      enviroment->setData(0, 0, QOpenGLTexture::CubeMapNegativeY,
                         QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                         (const void*)negy.constBits(), 0);
      enviroment->setData(0, 0, QOpenGLTexture::CubeMapNegativeZ,
                         QOpenGLTexture::RGBA, QOpenGLTexture::UInt8,
                         (const void*)negz.constBits(), 0);
      enviroment->generateMipMaps();
      enviroment->setWrapMode(QOpenGLTexture::ClampToEdge);
      enviroment->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
      enviroment->setMagnificationFilter(QOpenGLTexture::LinearMipMapLinear);
 
 
    glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
}

然后就可以把这个用于贴图了

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    enviroment->bind();
 
 
    //glBindTexture(GL_TEXTURE_CUBE_MAP, skyID);
    //glDepthMask(GL_FALSE);
    glDepthFunc(GL_LEQUAL);
 
 
    QMatrix4x4 matrix;
    matrix.setToIdentity();
 
 
  matrix.scale(10,10);
 
 
    view.lookAt(QVector3D(0,0,0.0),QVector3D(0,0,0),QVector3D(0,-1,0));
     view.rotate(rotation);
 
 
    if (!program.bind())
        close();
 
 
    program.setUniformValue("pv_matrix", projection*view*matrix);
    //! [6]
 
 
    program.setUniformValue("skybox", 0);
 
 
 
 
    _painter->paintSkyBox(&program);//自己写个类drawArray
 
 
 
 
    glDepthFunc(GL_LESS);


VERT

#ifdef GL_ES
 
 
precision mediump int;
precision mediump float;
#endif
 
 
uniform mat4 pv_matrix;
 
 
attribute vec3 a_position;
varying vec3 v_texCoord;
void main()
{
    gl_Position=pv_matrix*vec4(a_position,1.0);
    v_texCoord=a_position;
}

FRAG

#ifdef GL_ES
// Set default precision to medium
precision mediump int;
precision mediump float;
#endif
uniform samplerCube skybox;
varying vec3 v_texCoord;
void main()
{
    gl_FragColor= textureCube(skybox, v_texCoord);
}

猜你喜欢

转载自blog.csdn.net/qq_35158695/article/details/80469707