正常加载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);
}