OpenGL(三)着色器语言GLSL

news2024/9/20 22:44:39

着色器语言

在GPU上运行的图形渲染语言,类C风格。

类似于CUDA,但是又没有CUDA通用,又有点像Verilog这种硬件描述语言

GLSL是一种着色器语言,需要有对应的图形API环境配合,可以使用OpenGL,也可以使用OpenGL ES,也可以使用WebGL。三者的关系可以简单理解为ES为GL的精简版,WebGL是ES的二次包装。其他图形API有自己对应的着色器语言,大同小异。

根据上篇blog提到的图形渲染流程,其中要用到着色器语言的流程有:

  • 顶点着色器:计算一个3D空间顶点的2D坐,输出为xyzw,其中xy为相机坐标系中的坐标,z为zbuffer,用于判断覆盖关系,w为放缩值,一般都是1,即不进行放缩。
  • 几何着色器:对所有顶点做处理
  • 片段着色器:计算每个像素的像素像素值,输出每个像素的RGBA,前面的为RGB通道,最后的A为透明通道。

GLSL基本语法

着色器代码结构:

#version version_number //版本信息,GLSL的版本和OpenGL版本是对应的
in type in_variable_name;
in type in_variable_name; //输入数据类型,名称

out type out_variable_name;

uniform type uniform_name;

void main()
{
  // 处理输入并进行一些图形操作
  ...
  // 输出处理过的结果到输出变量
  //GLSL的顶点着色器必须设置gl_Position变量
  //片段着色器必须设置gl_FragColor变量
  out_variable_name = weird_stuff_we_processed;
}

如果我们打算从一个着色器向另一个着色器发送数据,我们必须在发送方着色器中声明一个输出,在接收方着色器中声明一个类似的输入。当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了.
不同着色器之间的局部变量是无法互通的。
想要数据互通,GLSL中提供了一种类似于C语言全局变量的数据类型Uniform,初始化方式如上面代码所示。

数据类型

和其他编程语言一样,GLSL有数据类型可以来指定变量的种类。GLSL中包含C等其它语言大部分的默认基础数据类型:float,int,bool等。GLSL是强数据类型语言,不允许进行数据隐式变换。像int a = 1.0*3这种是不允许的int a = int(1.0)*3是允许的。GLSL中只有一维数组,声明方式和C语言一样,且GLSL数组提供了一个隐式的方法length()返回数组长度。

像cuda一样GLSL有几个数据并在一起的数据向量类型,例如vec4,包含4个float数据的向量。

类型含义
vecn包含n个float分量的默认向量
bvecn包含n个bool分量的向量
ivecn包含n个int分量的向量
uvecn包含n个unsigned int分量的向量
dvecn包含n个double分量的向量

向量最长为4,使用.xyzw来读取。允许一次读取多个元素

vec3 temp1 = vec3(0.1,0.1,0.1);
vec3 temp2 = temp1.zyx // 约等于顺序反转了
vec2 temp3 = temp1.xxx + temp2.xyz; //类似于广播机制

向量的点积和叉积使用内置函数dot和cross。
GLSL中内置的数据类型还有矩阵mat,但是矩阵只有浮点型的,而且是列优先排序。

mat4 m = mat4(1.0)//初始化一个对角线矩阵
vec2 a = vec2(1.0,2.0);
vec2 b = vec2(3.0,4.0);
mat2 n = mat2(a,b);
mat2 m = mat2(1.0,2.0,3.0,4.0);//列优先排列

m = n = [ 1 3 2 4 ] m = n = \begin{bmatrix} 1 & 3\\ 2 & 4 \end{bmatrix} m=n=[1234]

除此之外GLSL中还可以定义结构体,方法和C语言一样。且函数可以进行重载。

控制逻辑

for循环、if分支、函数定义,跟C语言都基本一致。

bool inRect(vec2 pt, vec4 rect)
{
	bool result = false;
	return result;
}

代码

一个顶点着色器和片段着色器的demo
VertexShader:

#version 330 core
layout (location = 0) in vec3 aPos;   // 位置变量的属性位置值为 0 
layout (location = 1) in vec3 aColor; // 颜色变量的属性位置值为 1

out vec3 ourColor; // 向片段着色器输出一个颜色

void main()
{
    gl_Position = vec4(aPos, 1.0);
    ourColor = aColor; // 将ourColor设置为我们从顶点数据那里得到的输入颜色
}

FragmentShader:

#version 330 core
out vec4 FragColor;  
in vec3 ourColor;

void main()
{
    FragColor = vec4(ourColor, 1.0);
}

效果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Proteus仿真综合实例(1)

分享一些基于Proteus的仿真实例,供大家学习参考。 1、51单片机230个Proteus仿真实例 包含基于51单片机的230个仿真实例,涉及定时器、中断、LCD显示、DS18B20温度测量、DS1621温度测量、PWM生成等充足电路模型案例。 2、51交通灯 模拟实现基于51单片机…

音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件

在文章《音视频入门基础:PCM专题(1)——使用FFmpeg命令生成PCM音频文件并播放》中讲述了生成PCM文件的方法。通过FFmpeg命令可以把该PCM文件转为AAC裸流文件: ./ffmpeg -f s16le -ar 44100 -ac 2 -i audio1.pcm audio1.aac 由于…

《论层次架构及其在软件系统中的应用》写作框架,软考高级系统架构设计师

论文真题 层次架构作为软件系统设计的一种基本模式,对于实现系统的模块化、可维护性和可扩展性具有至关重要的作用。在软件系统的构建过程中,采用层次架构不仅可以使系统结构更加清晰,还有助于提高开发效率和质量。因此,对层次架…

【笔记】2.2 黏土类原料

黏土类原料,用于制备陶瓷、耐火材料和水泥,为制品成型提供必须的可塑性,悬浮性。 2.2.1 黏土的成因和分类 黏土主要成分:含水硅铝酸盐 黏土形成:硅铝酸盐岩石经过长期地质时代的自然风化或热液蚀变作用而逐步形成。…

Elasticsearch-数据迁移elasticdump

一、环境信息 主机名 IPelasticsearch-master10.10.10.1elasticsearch-slave10.10.10.2 二、互联网部分 2.1、Nodejs下载安装(master节点) #官网:Download | Node.js #下载nodejs包 [rootelasticsearch-master home]# wget -c htt…

协议头,wireshark,http

目录 协议头 ip头 udp头 mac层 网络工具 telnet wireshark Http 一、HTTP 协议介绍 二、HTTP 协议的工作过程 三、使用抓包工具抓取报文 四、获取到http请求报文: 五、http请求(request) (一)、认识URL 项…

Redis 入门 - 五大基础类型及其指令学习

经过前面Redis入门系列三篇文章学习,相信大家已经准备好学习新知识了,到这里也算是真正开始学习Redis了。学习了软件安装,客户端选择,那么接下来也应该来了解Redis有什么,能干什么。 我们在第一章中就说过&#xff0c…

线程的六种状态

优质博文:IT-BLOG-CN 线程的状态在Thread.State这个枚举类型中定义:共有6种状态,可以调用线程Thread种的getState()方法获取当前线程状态。 public enum State { /** * 新建状态(New): * 当用new操作符创建一个线程时&#…

C++第五节 - this指针、构造函数、析构函数

一、类对象的存储方式 只保存成员变量&#xff0c;成员函数存放在公共的代码段 注意点&#xff1a; #include<iostream> using namespace std; class A { public:void PrintA(){cout << _a << endl;} private:char _a; }; int main() {class A a;cout <…

CSS“多列布局”(补充)——WEB开发系列35

多列布局是一种非常常见的布局方式&#xff0c;适用于内容丰富的页面&#xff0c;如新闻网站、杂志或博客。 一、CSS多列布局概述 CSS多列布局允许我们将内容分成多个垂直列&#xff0c;使页面布局更加灵活和多样化。多列布局的主要属性包括 ​​column-count​​、​​column…

django学习入门系列之第十点《A 案例: 员工管理系统4》

文章目录 6 部门管理&#xff08;原始方式&#xff09;6.6 添加界面的导入&#xff08;数据库&#xff09;6.7 删除按键的应用6.8 编辑按键的应用6.81 传值的另一种方式 6.9 提交按键的应用 往期回顾 6 部门管理&#xff08;原始方式&#xff09; 6.6 添加界面的导入&#xff…

E32.【C语言 】练习:蓝桥杯题 懒羊羊字符串

1.题目 【问题描述】 “懒羊羊”字符串是一种特定类型的字符串&#xff0c;它由三个字符组成&#xff0c;具有以下特点: 1.字符串长度为 3. 2.包含两种不同的字母。 3.第二个字符和第三个字符相同 换句话说&#xff0c;“懒羊羊”字符串的形式应为 ABB&#xff0c;其中A和B是不…

【python2C】算法基础:计时比较

不断改进代码&#xff0c;是学习进步必经之路。 判断代码优劣&#xff0c;在空间允许的情况下&#xff0c;计时就是最可靠的标尺。 打表不算&#xff0c;人脑不算 1.对于答案较为固定的题&#xff0c;预先算出所有可能的答案表&#xff0c;然后对应输入查找答案&#xff0c;从…

【OpenGL 002】着色器 GLSL 语言及GLFW代码案例

文章目录 1.GLSL语言简介本节案例 code 1 2.GLSL的数据类型① 向量(Vector)- 向量重组示例- 向量重组禁忌 3.GLSL的输入输出本节案例 code 2 4.着色器示例5.Uniform本节案例 code 3 通过第一节 【OpenGL 001】Ubuntu 搭建 GLFW 环境及其相关测试 demo 想必已经搭建好了GLFW环境…

『功能项目』GameObject对象池 - 第三职业【39】

本章项目成果展示 我们打开上一篇38管理器基类的项目&#xff0c; 本章要做的事情是利用对象池制作第三个职业——魔法师 在GameRoot对象下创建空物体 重命名为PoolRoot 将GameRoot拖拽至预制体 创建脚本&#xff1a; 编写脚本&#xff1a;PoolManager.cs using UnityEngine;…

使用豆包MarsCode 编写 Node.js 全栈应用开发实践

以下是「豆包MarsCode 体验官」优秀文章&#xff0c;作者狼叔。 欢迎更多用户使用豆包MarsCode 并分享您的产品使用心得及反馈、创意项目开发等&#xff0c;【有奖征集&#xff5c;人人都是豆包MarsCode 测评官&#xff01;】活动正在火热进行中&#xff0c;欢迎大家投稿参加&a…

【Python报错已解决】 SyntaxError: invalid syntax

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;修复缺失的括号或引号2.…

甘肃五仁月饼:传统风味,舌尖上的乡愁

在中秋佳节的美食画卷中&#xff0c;甘肃食家巷五仁月饼以其独特的魅力占据着重要的一席之地。甘肃五仁月饼&#xff0c;那朴实无华的外表下&#xff0c;藏着无尽的美味与情怀。它的饼皮金黄酥脆&#xff0c;散发着淡淡的麦香&#xff0c;仿佛在诉说着古老的制作工艺。轻轻咬上…

Java:动态代理

Java&#xff1a;动态代理 什么是代理 代理模式 是一种设计模式&#xff0c;它为其他对象提供了一种代理以控制对这个对象的访问。代理对象通常包装实际的目标对象&#xff0c;以提供一些附加的功能&#xff08;如延迟加载、访问控制、日志记录等&#xff09;。我们一般可以使…

C++中的内存管理和模板初识

一、内存管理 1.1内存区域的划分 1.1.1内存划分区域图示 1.1.1补&#xff1a;堆和栈都可以进行动态分配和静态分配吗&#xff1f; 不是的&#xff0c;堆无法进行静态分配&#xff0c;只能动态分配&#xff1b;栈可以利用_alloca动态分配&#xff0c;但是分配的空间不能用fre…