OpenGL纹理加载

该文演示了如何在Qt环境中创建一个自定义的QOpenGLWidget子类,集成QOpenGLExtraFunctions,使用GLSL编写顶点和片段着色器,加载纹理,并通过缓存对象进行三角形风扇绘制,从而实现图像的OpenGL渲染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

演示效果 

1.声明自定义类并继续QOpenGLWidget与QOpenGLExtraFunctions

2.重写基类函数

virtual void initializeGL() override;
    virtual void resizeGL(int w, int h) override;
    virtual void paintGL() override;

3. 创建缓存对象与shader程序

    m_vao.create();
    m_vbo.create();

    m_prog = new QOpenGLShaderProgram();

4. 添加着色器GLSL代码与绑定

m_prog->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex,u8R"(
            #version 330 core
            in vec3 vPos;
            in vec2 vTexture;
            out vec2 oTexture;
            void main()
            {
                gl_Position = vec4(vPos, 1.0);
                oTexture = vTexture;
            }
    )");

    m_prog->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment,u8R"(
            #version 330 core
            in vec2 oTexture;
            uniform sampler2D uTexture;
            out vec4 fragColor;
            void main()
            {
                fragColor = texture(uTexture, oTexture);
            }
    )");

    m_prog->link();

 5.加载纹理并初始化顶点数据

//加载纹理
    m_texture = new QOpenGLTexture(QImage("C:/Users/dev2/apple.jpg").mirrored());

    //顶点加纹理,前三顶点,后二纹理
    float _vertex[] = {
        -1,  1, 0,	0, 1, // 左上
        -1, -1, 0,	0, 0, // 左下
        1, -1, 0,	1, 0, // 右下
        1,  1, 0,	1, 1, // 右上
    };

 6. 使用缓存

 m_vao.bind();
    m_vbo.bind();
    m_vbo.allocate(_vertex,20*sizeof(float));

7.使用着色器

 m_prog->setAttributeArray("vPos",GL_FLOAT,0*sizeof(float),3,5*sizeof(float));
    m_prog->enableAttributeArray("vPos");
    m_prog->setAttributeArray("vTexture",GL_FLOAT,0*sizeof(float),3,5*sizeof(float));
    m_prog->enableAttributeArray("vTexture");

8.绘制

 m_texture->bind();
    m_vao.bind();
    m_prog->bind();
    glDrawArrays(GL_TRIANGLE_FAN,0,4);

9.显示OPENGL窗口

 显示OPENGL窗口 

 GLWidget4 widget4;
    widget4.show();

    return a.exec();

 

 示例头文件

#ifndef GLWIDGET4_H
#define GLWIDGET4_H

#include <QOpenGLWidget>
#include <QOpenGLExtraFunctions>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLBuffer>
#include <QOpenGLShaderProgram>
#include <QOpenGLShader>
#include <QOpenGLTexture>

class GLWidget4 : public QOpenGLWidget , public QOpenGLExtraFunctions
{
public:
    GLWidget4();

    // QOpenGLWidget interface
protected:
    virtual void initializeGL() override;
    virtual void resizeGL(int w, int h) override;
    virtual void paintGL() override;

private:
    QOpenGLVertexArrayObject m_vao;
    QOpenGLBuffer m_vbo;
    QOpenGLShaderProgram *m_prog;
    QOpenGLTexture *m_texture = nullptr; //OPENGL纹理
};

#endif // GLWIDGET4_H

示例源文件

#include "glwidget4.h"

GLWidget4::GLWidget4()
{

}

void GLWidget4::initializeGL()
{
    initializeOpenGLFunctions();
    glEnable(GL_DEPTH_TEST);
    glClearColor(0.0f,0.0f,1.0f,1.0f);

    m_vao.create();
    m_vbo.create();

    m_prog = new QOpenGLShaderProgram();
    m_prog->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex,u8R"(
            #version 330 core
            in vec3 vPos;
            in vec2 vTexture;
            out vec2 oTexture;
            void main()
            {
                gl_Position = vec4(vPos, 1.0);
                oTexture = vTexture;
            }
    )");

    m_prog->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment,u8R"(
            #version 330 core
            in vec2 oTexture;
            uniform sampler2D uTexture;
            out vec4 fragColor;
            void main()
            {
                fragColor = texture(uTexture, oTexture);
            }
    )");

    m_prog->link();

    //加载纹理
    m_texture = new QOpenGLTexture(QImage("C:/Users/dev2/apple.jpg").mirrored());

    //顶点加纹理,前三顶点,后二纹理
    float _vertex[] = {
        -1,  1, 0,	0, 1, // 左上
        -1, -1, 0,	0, 0, // 左下
        1, -1, 0,	1, 0, // 右下
        1,  1, 0,	1, 1, // 右上
    };

    m_vao.bind();
    m_vbo.bind();
    m_vbo.allocate(_vertex,20*sizeof(float));

    m_prog->setAttributeArray("vPos",GL_FLOAT,0*sizeof(float),3,5*sizeof(float));
    m_prog->enableAttributeArray("vPos");
    m_prog->setAttributeArray("vTexture",GL_FLOAT,0*sizeof(float),3,5*sizeof(float));
    m_prog->enableAttributeArray("vTexture");


    m_prog->release();
    m_vao.release();


}

void GLWidget4::resizeGL(int w, int h)
{

}

void GLWidget4::paintGL()
{

    //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    m_texture->bind();
    m_vao.bind();
    m_prog->bind();
    glDrawArrays(GL_TRIANGLE_FAN,0,4);
    m_prog->release();
    m_vao.release();
    m_texture->release();


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自由软件开发者

有你的鼓励,我会更加努力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值