Qt实现OpenGL的经典教程④——加载纹理补充

本文基于LearnOpenGL教程,介绍了如何在Qt环境中通过原生API实现纹理颜色混合和多纹理效果,包括创建QOpenGLTexture对象,修改片段着色器,设置纹理单元等步骤。
摘要由CSDN通过智能技术生成

本帖将参考LearnOpenGL这一经典教程,使用Qt的原生环境完成教程中所提的所有流程,并尽量和原教程保持一致,如有错误,欢迎评论!

为了方便大家参考,我将项目分享至了gitee,并实时进行更行:Qt实现OpenGL的经典教程: (gitee.com)

教程中文网站:LearnOpenGLCN 

教程原网站:LearnOpenGL

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

}

点击运行,大功告成!

源码在开头有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值