GLSL 程序与使用

2023-10-29

#核心模式OpenGL GLSL程序

GLSL程序简介和在QT中向GLSL程序变量传递数据

数据类型

包含基本数据类型 int、float、double、uint、bool

两种容器类型

  • 向量(Vector)
标识符 含义
vecn n个float
bvecn booleans
ivecn integers
uvecn unsigned integers
dvecn double components

向量可以使用重组(swizzling),例如

vec2 vect = vec2(0.5, 0.7);

vec4 result = vec4(vect, 0.0, 0.0);

vec4 otherResult = vec4(result.xyz, 1.0)

  • 矩阵(Matrix)

输入输出

发送方着色器声明一个输出,out

接收方着色器声明一个输入,in

类型名字一致的变量,会在链接程序对象完成时,被OpenGL链接到一起

Layout

为了定义顶点数据管理方式,使用location一元数据指定输入变量。设置属性位置值,在glsl中的属性前面添加layout,例如:

layout(location = 0) in vec3 aPos;

在cpu中通过这个序号与gpu中的属性建立联系,以下为问答方式,询问aPos的序号。(QT封装函数操作)

GLint glGetAttribLocation( GLuint program,
const GLchar * name);

shaderProgram.bind();
GLint posLocation = shaderProgram.attributeLocation("aPos");

告诉显卡如何解释缓冲里的属性

glVertexAttribPointer(posLocation, 2, GL_FLOAT, GL_FALSE,
 sizeof(float) * 2, (void*)0);

另一种方式,由程序绑定

推荐使用上一种方式,在着色器中设置

shaderProgram.bind();
GLint posLocation = 2;
shaderProgram.bindAttributeLocation("aPos",posLocation);


glVertexAttribPointer(posLocation, 2, GL_FLOAT, GL_FALSE,
 sizeof(float) * 2, (void*)0);


glEnableVertexAttribArray(posLocation);

Uniform

另一种从cpu向gpu着色器发送数据的方式。

全局的,可以被任意着色器在任意阶段访问

uniform vec4 ourColor;

注意!如果没有使用这个变量,这个变量会被编译器优化掉,会导致一些问题。

QT中有一个初步的封装

shaderProgram.setUniformValue("ourColor", val0, val1, val2, val3);

通用方法为

int colorLocation = glGetUniformLocation(shaderProgram, "ourColor");
glUseProgram(shaderProgram);
glUniform4f(colorLocation,val0, val1, val2, val3);//根据变量类型使用不同函数

glUniform是个c库,不支持重载,不同变量类型需要使用不同的函数。QT中已经封装好了,不需要考虑变量类型。

例子,通过QT信号槽动态改变函数

#include <QTimer>

private:
    QTimer timer;
public slots:
    void on_timout();

//构造函数
timer.start(100);
connect(&timer, SIGNAL(timeout()), this, SLOT(on_timeout()));

void on_timout()
{
    makeCurrent();

    int timeValue = QTime::currentTime().second();
    float greenval = (sin(timeValue) / 2.0f) + 0.5f;
    shaderProgram.setUniformValue("ourColor", 0.0f, greenval, 0.0f, 1.0f);

    doneCurrent();
    update();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GLSL 程序与使用 的相关文章

随机推荐

  • 关于静态批处理/动态批处理/GPU Instancing /SRP Batcher的详细剖析

    静态批处理 1 定义 标明为 Static 的静态物件 如果在使用相同材质球的条件下 在Build 项目打包 的时候Unity会自动地提取这些共享材质的静态模型的Vertex buffer和Index buffer 根据其摆放在场景中的位置
  • 刷脸支付成众多创业者青睐的项目

    风口正盛 优势尽显 刷脸支付成了众多投资者与创业者青睐的项目 布局刷脸支付行业 快速抢占头部市场 支付机构是供给方 商家B端和用户C端是需求方 而中间ISV服务商的作用就至关重要了 虽然未来存在很多变数 但刷脸支付的趋势不可阻挡 用户使用比
  • 《caffe学习之路》第五章:Ubuntu16.04 caffe ssd 在QT环境上编译运行ssd_detect.cpp

    大多深度学习框架主要支持python 而caffe提供c 接口 这也是我选择caffe框架的原因 前一章说到examples ssd目录下的ssd detect cpp文件是weiliu等大神给我们提供的 算是一个c 实现demo 这一章主
  • 如何在UE4里面打开一个Windows窗口

    案例 FailureMessage FText Format LOCTEXT PrimaryGameModuleCouldntBeLoaded The game module 0 could not be loaded There may
  • mac m2 安装使用linux

    问题出现在哪里
  • 图片转为git 小程序 python

    先展示效果图 下面展示一些 内联代码片 import os import imageio from natsort import natsorted def create gif image list gif name frames for
  • android 平板怎么刷机,小白必看,安卓平板电脑刷机教程之一键刷机

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 从来没刷机的的小白 你有以下疑问吗 什么是 刷机 什么是 ROM 什么是 ROOT 什么是 Recovery 什么是USB调试模式 如何打开USB调试模式 刷机会不会损坏我的设备 刷机中途能拔掉
  • 利用反射创建对象

    public class Reflection public static void main String args throws Exception Reflection reflection new Reflection System
  • HTML属性

    目录 HTML 属性 属性实例 更多 HTML 属性实例 属性例子 1 属性例子 2 属性例子 3 HTML 提示 使用小写属性 始终为属性值加引号 HTML 属性参考手册 一个完整的实例 属性为 HTML 元素提供附加信息 HTML 属性
  • 安装Firefly错误-Unable to find vcvarsall.bat

    晚上尝试安装Firefly时 在安装twisted时出现错误而退出 根据错误提示如下 error Setup script exited with error Microsoft Visual C 9 0 is required Unabl
  • 5、基于注解的AOP配置

    一 开启注解支持 1 概述 1 Spring AOP如同IoC一样支持基于XML和基于注解两种配置方式 基于注解所需的依赖和基于XML所需的依赖一致 其中spring context包含了Spring IoC Spring AOP等核心依赖
  • 改进的北方苍鹰算法优化VMD参数,最小包络熵、样本熵、信息熵、排列熵(适应度函数可自行选择,一键修改)包含MATLAB源代码...

    今天给大家带来一期由改进的北方苍鹰算法 SCNGO 优化VMD的两个参数 同样以西储大学数据集为例 选用105 mat中的X105 BA time mat数据中1000个数据点 没有数据的看这篇文章 西储大学轴承诊断数据处理 matlab免
  • linux之数据库操作,Linux之MySQL数据库常用操作

    8种机械键盘轴体对比 本人程序员 要买一个写代码的键盘 请问红轴和茶轴怎么选 因为最近在使用云服务器部署项目 所以也难免要在服务器上使用MySQL 所以就想把MySQL常使用记录下来 以便日后查看并熟悉 也希望能够对大家有所帮助 首先你需要
  • Linux内核TCP参数调优全面解读

    Linux内核TCP参数调优全面解读 前言 TCP 性能的提升不仅考察 TCP 的理论知识 还考察了对于操心系统提供的内核参数的理解与应用 TCP 协议是由操作系统实现 所以操作系统提供了不少调节 TCP 的参数 如何正确有效的使用这些参数
  • redis配置超时时间

    redis配置超时时间 cd usr local redis etc vim redis conf 找到timeout 0 改为 timeout 30
  • 在sublime text中用终端来编译运行java

    在sublime text中用终端来编译运行java sublime text是一款非常优秀的轻量编辑器 今天就来给大家演示下如何用sublime来编译运行java 安装Terminus 首先需要在sublime中安装terminus这个终
  • JAVA学习之——计算机网络(背诵版)

    1 简述OSI七层协议 物理层 主要解决两台物理机之间的通信 通过二进制比特流的传输来实现 二进制数据表现为电流电压上的强弱 到达目的地再转化为二进制机器码 网卡 集线器工作在这一层 在局部局域网上传送数据帧 它负责管理计算机通信设备和网络
  • 【转】C语言的学习路线

    http topic csdn net u 20110922 08 391f0557 6bbc 490d 8394 b7dede44fa0e html seed 1927482974 r 75671683 r 75671683 UNIX下C
  • Java中判断两个类是否相等

    Java中判断两个类是否相等 当有参数的类生成对象时 当两个对象给的参数相同时 会将第二个对象指向第一个对象的地址 如实例中展示 会输出true public class test1 public static void main Stri
  • GLSL 程序与使用

    核心模式OpenGL GLSL程序 GLSL程序简介和在QT中向GLSL程序变量传递数据 数据类型 包含基本数据类型 int float double uint bool 两种容器类型 向量 Vector 标识符 含义 vecn n个flo