Qt QOpenGLShaderProgram详解

1. 概述

QOpenGLShaderProgram 是 Qt 框架中用于管理 OpenGL 着色器程序的类。它提供了一种方便的方式来创建、编译和链接着色器,以及管理着色器程序中的属性和统一变量。通过 QOpenGLShaderProgram,开发者可以轻松地将顶点着色器和片段着色器组合成一个完整的着色器程序,并在 OpenGL 渲染中使用。

2. 重要函数
构造函数和析构函数
  • QOpenGLShaderProgram(QObject *parent = nullptr)
    构造一个新的着色器程序。

  • virtual ~QOpenGLShaderProgram()
    析构函数,删除着色器程序。

添加着色器
  • bool addShader(QOpenGLShader *shader)
    添加一个已编译的着色器。

  • bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source)
    从源代码编译并添加着色器。

  • bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray &source)
    从 QByteArray 源代码编译并添加着色器。

  • bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString &source)
    从 QString 源代码编译并添加着色器。

  • bool addShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString &fileName)
    从文件编译并添加着色器。

缓存着色器
  • bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source)
    编译并添加一个可缓存的着色器(源码为 C 字符串)。

  • bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QByteArray &source)
    编译并添加一个可缓存的着色器(源码为 QByteArray)。

  • bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const QString &source)
    编译并添加一个可缓存的着色器(源码为 QString)。

  • bool addCacheableShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString &fileName)
    从文件编译并添加一个可缓存的着色器。

链接和绑定
  • bool link()
    链接着色器程序。

  • bool bind()
    绑定着色器程序到当前的 OpenGL 上下文。

  • void release()
    释放当前绑定的着色器程序。

  • bool isLinked() const
    检查着色器程序是否已成功链接。

属性和统一变量
  • int attributeLocation(const char *name) const
    获取属性的位置。

  • int uniformLocation(const char *name) const
    获取统一变量的位置。

  • void setUniformValue(const char *name, const QVariant &value)
    设置统一变量的值。

  • void setUniformValueArray(const char *name, const GLfloat *values, int count, int tupleSize)
    设置统一变量数组的值。

其他
  • QString log() const
    获取最近一次编译或链接操作的错误日志。

  • GLuint programId() const
    获取 OpenGL 着色器程序的 ID。

  • void removeAllShaders()
    移除所有着色器。

  • void removeShader(QOpenGLShader *shader)
    移除指定的着色器。

  • QVector<float> defaultInnerTessellationLevels() const
    获取默认的内部分割级别。

  • QVector<float> defaultOuterTessellationLevels() const
    获取默认的外部分割级别。

  • int maxGeometryOutputVertices() const
    获取几何着色器的最大输出顶点数。

  • int patchVertexCount() const
    获取补丁顶点数。

  • void setDefaultInnerTessellationLevels(const QVector<float> &levels)
    设置默认的内部分割级别。

  • void setDefaultOuterTessellationLevels(const QVector<float> &levels)
    设置默认的外部分割级别。

  • void setPatchVertexCount(int count)
    设置补丁顶点数。

静态成员函数

  • static bool hasOpenGLShaderPrograms(QOpenGLContext *context = nullptr)
    检查当前 OpenGL 上下文是否支持着色器程序。如果 contextnullptr,则使用当前上下文。

3. 重要信号

QOpenGLShaderProgram 没有提供信号。它主要用于着色器的管理和操作,不涉及信号与槽机制。

4. 常用枚举类型

QOpenGLShaderProgram 本身没有定义枚举类型,但与之紧密相关的 QOpenGLShader 类定义了以下枚举类型:

  • QOpenGLShader::ShaderType
    用于指定着色器的类型,如:

    • Vertex:顶点着色器

    • Fragment:片段着色器

    • Geometry:几何着色器

    • TessellationControl:细分控制着色器

    • TessellationEvaluation:细分评估着色器

#include "widget.h"float 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    // 顶部
};MyGLWidget::MyGLWidget(QWidget *parent) : QOpenGLWidget(parent) {}MyGLWidget::~MyGLWidget()
{glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);
}void MyGLWidget::initializeGL()
{initializeOpenGLFunctions(); // 初始化 OpenGL 函数//创建、绑定VAOglGenVertexArrays(1, &VAO);glBindVertexArray(VAO);//创建、绑定VBO + 填充数据glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//设置顶点属性指针glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);// 颜色属性glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));glEnableVertexAttribArray(1);//解绑缓冲区和 VAOglBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);shader = new QOpenGLShaderProgram;if (!shader->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shader/shader.vert")) {qDebug() << "Vertex shader compile failed:" << shader->log();return;}if (!shader->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shader/shader.frag")) {qDebug() << "Fragment shader compile failed:" << shader->log();return;}// 链接着色器程序if (!shader->link()){qDebug() << "Shader program link failed:" << shader->log();return;}
}void MyGLWidget::paintGL()
{glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区shader->bind();glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);glBindVertexArray(0);
}void MyGLWidget::resizeGL(int w, int h)
{glViewport(0, 0, w, h); // 设置视口大小
}

觉得有帮助的话,打赏一下呗。。

           

需要商务合作(定制程序)的欢迎私信!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18927.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小爱音箱控制手机和电视听歌的尝试

最近买了小爱音箱pro&#xff0c;老婆让我扔了&#xff0c;吃灰多年的旧音箱。当然舍不得&#xff0c;比小爱还贵&#xff0c;刚好还有一台红米手机&#xff0c;能插音箱&#xff0c;为了让音箱更加灵活&#xff0c;买了个2元的蓝牙接收模块Type-c供电3.5接口。这就是本次尝试起…

ESXi安装【真机和虚拟机】(超详细)

项目简介&#xff1a; ESXi&#xff08;Elastic Sky X Integrated&#xff09;是VMware公司开发的一种裸机虚拟化管理程序&#xff0c;允许用户在单一物理服务器上运行多个虚拟机&#xff08;VM&#xff09;。它直接安装在服务器硬件上&#xff0c;而不是操作系统之上&#xff…

本地通过隧道连接服务器的mysql

前言 服务器上部署了 mysql&#xff0c;本地希望能访问该 mysql&#xff0c;但是又不希望 mysql 直接暴露在公网上 那么可以通过隧道连接 ssh 端口的方式进行连接 从外网看&#xff0c;服务器只开放了一个 ssh 端口&#xff0c;并没有开放 3306 监听端口 设置本地免密登录 …

MyBatis-Plus模块扩展分页查询

文章目录 1.说明2.common-mybatis-plus-starter1.目录结构2.MybatisPLusAutoConfiguration.java 添加MyBatis Plus分页插件3.PlusPageResult.java MyBatis Plus 分页对象的增强版4.SunPlusPageHelper.java 分页工具类 3.EasyCode模板修改4.common-mybatis-plus-starter-demo 分…

TestHubo基础教程-创建项目

TestHubo是一款国产开源一站式测试工具&#xff0c;涵盖功能测试、接口测试、性能测试&#xff0c;以及 Web 和 App 测试&#xff0c;可以满足不同类型项目的测试需求。本文将介绍如何快速创建第一个项目&#xff0c;以快速入门上手。 1、创建项目 在 TestHubo 中&#xff0c;…

Pythong 解决Pycharm 运行太慢

Pythong 解决Pycharm 运行太慢 官方给Pycharm自身占用的最大内存设低估了限制,我的Pycharm刚开始默认是256mb。 首先找到自己的Pycharm安装目录 根据合适自己的改 保存&#xff0c;重启Pycharm

【Cocos TypeScript 零基础 15.1】

目录 见缝插针UI脚本针脚本球脚本心得_旋转心得_更改父节点心得_缓动动画成品展示图 见缝插针 本人只是看了老师的大纲,中途不明白不会的时候再去看的视频 所以代码可能与老师代码有出入 SIKI_学院_点击跳转 UI脚本 import { _decorator, Camera, color, Component, directo…

docker部署单机版doris,完整无坑

文章目录 一、部署1、修改内核参数2、下载Docker 开发环境镜像3、下载安装包4、启动镜像5、配置fe6、配置be7、远程连接 二、运维命令参考资料 一、部署 1、修改内核参数 在启动doris的be时&#xff0c;需要将 Linux 操作系统的内核参数设置为2000000&#xff0c;这里是Doris…

docker 进阶命令(基于Ubuntu)

数据卷 Volume: 目录映射, 目录挂载 匿名绑定: 匿名绑定的 volume 在容器删除的时候, 数据卷也会被删除, 匿名绑定是不能做到持久化的, 地址一般是 /var/lib/docker/volumes/xxxxx/_data 绑定卷时修改宿主机的目录或文件, 容器内的数据也会同步修改, 反之亦然 # 查看所有 vo…

指针复习 ( 下 )

这是指针复习的第二篇&#xff0c;主要介绍指针与数组、函数的应用。 一、指针与数组 1.1 数组名的理解 在说明指针与数组的关系之前&#xff0c;我们必须要先了解「数组名」的意义 我们在指针复习 ( 下 ) 中&#xff0c;指针整数的部份有写过下面这段代码 int arr[10] {1,…

ElementUI 的组件 Switch(开关)如何让文字显示在按钮上

效果图&#xff1a; 一、引入switch组件 给组件自定义一个类&#xff1a;tableScopeSwitch&#xff0c;设置开关的值和对应展示的文字&#xff08;开为 1&#xff0c;并展示启用&#xff1b;关为 0&#xff0c;并展示禁用&#xff09;。 <div class"tableScopeSwitch…

Linux---系统函数

一、打开文件open #include <fcntl.h> int open(const char *pathname&#xff0c;int flags); int open(const char *pathname&#xff0c;int flags&#xff0c;mode_t mode); 功能: 打开或创建文件 参数: pathname //打开的文件名 flags //操作的标志…

智能编程助手功能革新与价值重塑之:GitHub Copilot

引言&#xff1a; GitHub Copilot 的最新更新为开发者带来了显著变化&#xff0c;其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令&#xff0c;并具备多级任务推理能力&#xff0c;这使得开发者在开发复杂功能时&#xff0c;可大幅减少…

Elasticsearch+Logstash+Kibana可视化集群部署

文章目录 1.组件介绍简述2.集群规划3.Es组件部署4.Logstash组件部署5.Kibana组件部署6.Kibana的基础使用 1.组件介绍简述 Elasticsearch&#xff1a;开源实时分布式搜索和分析引擎&#xff0c;支持大规模数据存储和高吞吐量&#xff0c;提供丰富的搜索功能和可扩展性。 Logsta…

SpringBoot多数据源实践:基于场景的构建、实现和事务一体化研究

1. 多数据源应用场景剖析 1.1 业务驱动的多数据源需求 数据量与业务复杂度引发的分库分表&#xff1a;在现代企业级应用中&#xff0c;随着业务的不断拓展和用户量的持续增长&#xff0c;数据量呈爆炸式增长。例如&#xff0c;在大型电商平台中&#xff0c;用户数据、订单数据…

LabVIEW 中dde.llbDDE 通信功能

在 LabVIEW 功能体系中&#xff0c;位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\dde.llb 的 dde.llb 库占据着重要的地位。作为一个与动态数据交换&#xff08;DDE&#xff09;紧密相关的库文件&#xff0c;它为 LabVIEW 用户提供了与其他…

数据结构-栈和队列的应用

目录 前言一、栈的应用&#xff08;迷宫问题&#xff09;1.1 问题描述1.2 算法选择1.3 算法精化1.4 算法实现1.5 问题结果 二、队列的应用&#xff08;农夫过河问题&#xff09;2.1 问题描述2.2 算法选择2.3 算法精化2.4 算法实现2.5 问题结果 总结 前言 本篇文章使用两个例子…

SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界

文章目录 前言一、集成SkyWalking二、SkyWalking使用三、SkyWalking性能剖析四、SkyWalking 告警推送4.1 配置告警规则4.2 配置告警通知地址4.3 下发告警信息4.4 测试告警4.5 慢SQL查询 总结 前言 在传统监控系统中&#xff0c;我们通过进程监控和日志分析来发现系统问题&…

AIGC图生视频保姆级教程

一、AI文生图高阶技巧 推荐工具 ▸ MidJourney&#xff08;艺术感最强&#xff09; ▸ DALLE 3&#xff08;与ChatGPT深度联动&#xff09; ▸ Leonardo.ai&#xff08;精细化参数控制&#xff09; 核心策略 提示词架构&#xff1a; [主体描述][环境氛围][镜头语言][风格参数…

springboot整合mybatis-plus【详细版】

目录 一&#xff0c;简介 1. 什么是mybatis-plus2.mybatis-plus特点 二&#xff0c;搭建基本环境 1. 导入基本依赖&#xff1a;2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三&#xff0c;基本知识介绍 1. 基本注解 T…