前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qt5.12 + OpenGL 着色器

Qt5.12 + OpenGL 着色器

作者头像
用户5908113
发布2020-01-02 17:26:03
6830
发布2020-01-02 17:26:03
举报
文章被收录于专栏:Pou光明Pou光明

原教程地址:

https://learnopengl-cn.github.io/01%20Getting%20started/05%20Shaders/

一、 着色器概述

从基本意义上来讲,着色器只是一种把输入转化为输出的程序。它们之间唯一的“通讯”方式只有通过输入和输出来实现。

着色器是使用一种叫GLSL的类C语言写成的,GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。

1. 输入与输出

顶点着色器中定义一个输出,在片段着色器中定义输入来接收这个输出。

顶点着色器:

out vec4 vertexColor; // 为片段着色器指定一个颜色输出

片段着色器:

in vec4 vertexColor; // 从顶点着色器传来的输入变量(名称相同、类型相同)

就是红色三角形的例子!

2. Uniform 数据发送方式

Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,但uniform和顶点属性有些不同。

首先,uniform是全局的(Global)。第二,无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新。

为了实现例程中的效果,我使用了QObject自带的定时器事件,并使用Qt update()函数来更新绘图。

程序例子:

代码语言:javascript
复制
//使用uniform的片段着色器
static const char *fragmentShaderSourceUniform =
        "#version 330 core\n"
        "out vec4 FragColor;\n"
        "uniform vec4 ourColor;\n"                        // 在OpenGL程序代码中设定这个变量
        "void main(){\n"
        "   FragColor = ourColor;\n"
        "}\n\0";

paintGL中更新Uniform :

代码语言:javascript
复制
#ifdef COLORCHANGE
    // 更新uniform颜色
    float greenValue = sin(m_timeout) / 2.0f + 0.5f;
    int vertexColorLocation = m_core->glGetUniformLocation(m_shaderProgram, "ourColor");
    m_core->glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
#elif MULTICOLOR

#endif

定时器更新计数:

代码语言:javascript
复制
void MyGLWidget::timerEvent(QTimerEvent *e)
{
    Q_UNUSED(e);

    if(m_timeout >= 1.0)
    {
        m_timeout = -1.0;
    }

    m_timeout = m_timeout + 0.05;

    update();
}

效果视频:

三角形颜色渐变:

矩形颜色渐变:

3. 顶点属性传递颜色

代码语言:javascript
复制
 GLfloat vertices[] = {
        // 位置              // 颜色
            0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,   // 右下
           -0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,   // 左下
            0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f    // 顶部
};

m_core->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), nullptr);
m_core->glEnableVertexAttribArray(0);        //以顶点属性位置值作为参数,启用顶点属性;顶点属性默认是禁用的
m_core->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)(3* sizeof(float)));
m_core->glEnableVertexAttribArray(1);        //以顶点属性位置值作为参数,启用顶点属性;顶点属性默认是禁用的

效果图:

二、 总结

1、 小结

原教程中主要介绍了着色器的语法,改变颜色的三种方式。不同着色器间的输入输出、全局变量Uniform的使用、在顶点属性中设置颜色等。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Pou光明 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档