本帖将参考LearnOpenGL这一经典教程,使用Qt的原生环境完成教程中所提的所有流程,并尽量和原教程保持一致,如有错误,欢迎评论!
为了方便大家参考,我将项目分享至了gitee,并实时进行更行:Qt实现OpenGL的经典教程: (gitee.com)
Qt版本:6.7
操作系统:Windows10
突然发现纹理加载这一章还有两个内容没写,这里补充一下。
纹理颜色混合
在上一篇文章的代码上对片段着色器进行修改,使其混合颜色:
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
in vec2 TexCoord;
// texture samplers
uniform sampler2D texture1;
void main()
{
// linearly interpolate between both textures (80% container, 20% awesomeface)
FragColor = texture(texture1, TexCoord) * vec4(ourColor, 1.0);
}
点击运行后,我们便能得到如下图所示结果:
多纹理混合
这里我们在MyOpenGLWidget.h中再声明一个纹理对象:
private:
QOpenGLShaderProgram *_shaderProgram;
QOpenGLTexture *_texture;
QOpenGLTexture *_texture1;
QOpenGLVertexArrayObject *_vao;
QOpenGLBuffer *_vbo;
QOpenGLBuffer *_ebo;
并在MyOpenGLWidget.cpp中进行实例化:
//创建对象
_texture = new QOpenGLTexture(QImage(":/container.jpg").mirrored());
_texture->setWrapMode(QOpenGLTexture::Repeat);
_texture->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
_texture->setMagnificationFilter(QOpenGLTexture::Linear);
_texture->generateMipMaps();
_texture1 = new QOpenGLTexture(QImage(":/awesomeface.png").mirrored());
_texture1->setWrapMode(QOpenGLTexture::Repeat);
_texture1->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
_texture1->setMagnificationFilter(QOpenGLTexture::Linear);
_texture1->generateMipMaps();
同时,我们修改片段着色器,添加一个sample2D对象,将两个texture用mix函数混合:
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
in vec2 TexCoord;
// texture samplers
uniform sampler2D texture1;
uniform sampler2D texture2;
void main()
{
// linearly interpolate between both textures (80% container, 20% awesomeface)
FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.2);
}
紧接着,我们更新shader的uniform设置,使它们绑定到不同的纹理单元上:
// update shader uniform
_shaderProgram->bind();
_shaderProgram->setUniformValue(_shaderProgram->uniformLocation("texture1"), 0);
_shaderProgram->setUniformValue(_shaderProgram->uniformLocation("texture2"), 1);
最后在PaintGL函数中,我们更新如下代码:
void MyOpenGLWidget::paintGL()
{
//由于继承了QOpenGLFunctions,可以直接使用OpenGL中的函数
// render
// ------
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// bind Texture
glActiveTexture(GL_TEXTURE0);
_texture->bind();
glActiveTexture(GL_TEXTURE1);
_texture1->bind();
// update shader uniform
_shaderProgram->bind();
// render the triangle
_vao->bind();
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}
点击运行,大功告成!
源码在开头有