GLSL(着色器语言)

2023-11-10

GLSL(着色器语言)

  • 简介

    • OpenGLES的着色器语言GLSL是一种高级的图形化编程语言,其源自应用广泛的C语言。与传统的c语言不同的是,它提供了更加丰富的针对于图像处理的原生类型,诸如向量、矩阵之类。OpenGLES 主要包含以下特性:

    • GLSL是一种面向过程的语言,和Java的面向对象是不同的。

    • GLSL的基本语法与C/C++基本相同。
    • 它完美的支持向量和矩阵操作。
    • 它是通过限定符操作来管理输入输出类型的。
    • GLSL提供了大量的内置函数来提供丰富的扩展功能。

    在前面的博客示例中,我们所使用的都是非常简单的着色器,基本没有使用过GLSL的内置函数,在后面使用光照、贴图等等其他功能,我们不可避免的要使用这些内置函数。

  • 基础

    • GLSL虽然是基于C/C++的语言,但是它和C/C++还是有很大的不同的,比如在GLSL中没有doublelong等类型,没有unionenumunsigned以及位运算等特性。
  • 数据类型

    • GLSL中的数据类型主要分为标量、向量、矩阵、采样器、结构体、数组、空类型七种类型:
    • 标量:标量表示的是只有大小没有方向的量,在GLSL中标量只有bool、int和float三种。对于int,和C一样,可以写为十进制(16)、八进制(020)或者十六进制(0x10)。关于进制不了解的,得自己补补,这是编程基础。对于标量的运算,我们最需要注意的是精度,防止溢出问题
    • 向量:向量我们可以看做是数组,在GLSL通常用于储存颜色、坐标等数据,针对维数,可分为二维、三维和四位向量。针对存储的标量类型,可以分为bool、int和float。共有vec2、vec3、vec4,ivec2、ivec3、ivec4、bvec2、bvec3和bvec4九种类型,数组代表维数、i表示int类型、b表示bool类型。需要注意的是,GLSL中的向量表示竖向量,所以与矩阵相乘进行变换时,矩阵在前,向量在后(与DirectX正好相反)。向量在GPU中由硬件支持运算,比CPU快的多。
      • 作为颜色向量时,用rgba表示分量,就如同取数组的中具体数据的索引值。三维颜色向量就用rgb表示分量。比如对于颜色向量vec4 color,color[0]和color.r都表示color向量的第一个值,也就是红色的分量。其他相同。
      • 作为位置向量时,用xyzw表示分量,xyz分别表示xyz坐标,w表示向量的模。三维坐标向量为xyz表示分量,二维向量为xy表示分量。
      • 作为纹理向量时,用stpq表示分量,三维用stp表示分量,二维用st表示分量。
    • 矩阵:在GLSL中矩阵拥有2*2、3*3、4*4三种类型的矩阵,分别用mat2、mat3、mat4表示。我们可以把矩阵看做是一个二维数组,也可以用二维数组下表的方式取里面具体位置的值。
    • 采样器:采样器是专门用来对纹理进行采样工作的,在GLSL中一般来说,一个采样器变量表示一副或者一套纹理贴图。所谓的纹理贴图可以理解为我们看到的物体上的皮肤。
    • 结构体:和C语言中的结构体相同,用struct来定义结构体,关于结构体参考C语言中的结构体。
    • 数组:数组知识也和C中相同,不同的是数组声明时可以不指定大小,但是建议在不必要的情况下,还是指定大小的好。
    • 空类型:空类型用void表示,仅用来声明不返回任何值得函数。
  • 类型转换

    • GLSL的类型转换与C不同。在GLSL中类型不可以自动提升,比如float a=1;就是一种错误的写法,必须严格的写成float a=1.0,也不可以强制转换,即float a=(float)1;也是错误的写法,但是可以用内置函数来进行转换,如float a=float(1);还有float a=float(true);(true为1.0,false为0.0)等,值得注意的是,低精度的int不能转换为低精度的float

变量声明示例:

float a=1.0;
int b=1;
bool c=true;
vec2 d=vec2(1.0,2.0);
vec3 e=vec3(1.0,2.0,3.0)
vec4 f=vec4(vec3,1.2);
vec4 g=vec4(0.2);  //相当于vec(0.2,0.2,0.2,0.2)
vec4 h=vec4(a,a,1.3,a);
mat2 i=mat2(0.1,0.5,1.2,2.4);
mat2 j=mat2(0.8);   //相当于mat2(0.8,0.8,0.8,0.8)
mat3 k=mat3(e,e,1.2,1.6,1.8);

限定符

在之前的博客中也提到了,GLSL中的限定符号主要有:

  • attritude:一般用于各个顶点各不相同的量。如顶点颜色、坐标等。
  • uniform:一般用于对于3D物体中所有顶点都相同的量。比如光源位置,统一变换矩阵等。
  • varying:表示易变量,一般用于顶点着色器传递到片元着色器的量。
  • const:常量。

限定符与Java限定符类似,放在变量类型之前,并且只能用于全局变量。在GLSL中,没有默认限定符一说。

函数

GLSL中也可以定义函数,定义函数的方式也与C语言基本相同。函数的返回值可以是GLSL中的除了采样器的任意类型。对于GLSL中函数的参数,可以用参数用途修饰符来进行修饰,常用修饰符如下:

  • in:输入参数,无修饰符时默认为此修饰符。
  • out:输出参数。
  • inout:既可以作为输入参数,又可以作为输出参数。

浮点精度

与顶点着色器不同的是,在片元着色器中使用浮点型时,必须指定浮点类型的精度,否则编译会报错。精度有三种,分别为:

  • lowp:低精度。8位。
  • mediump:中精度。10位。
  • highp:高精度。16位。

具体如下表:

精度 浮点范围 浮点量级 浮点精度 整数范围
highp (−262,262) (2−62,262) 相对:(2−16) (−216,216)
mediump (−214,214) (2−14,214) 相对:(2−10) (−210,210)
lowp (−2,2) (2−8,2) 绝对:(2−8) (−28,28)

不仅仅是float可以制定精度,其他(除了bool相关)类型也同样可以,但是int、采样器类型并不一定要求指定精度。加精度的定义如下:

uniform lowp float a=1.0;
varying mediump vec4 c;1212

当然,也可以在片元着色器中设置默认精度,只需要在片元着色器最上面加上precision <精度> <类型>即可制定某种类型的默认精度。其他情况相同的话,精度越高,画质越好,使用的资源也越多。

顶点着色器的内建变量

  1. 输入变量:
    • gl_Position:顶点坐标
    • gl_PointSize:点的大小,没有赋值则为默认值1,通常设置绘图为点绘制才有意义。

片元着色器的内建变量

  1. 输入变量
    • gl_FragCoord:当前片元相对窗口位置所处的坐标。
    • gl_FragFacing:bool型,表示是否为属于光栅化生成此片元的对应图元的正面。
  2. 输出变量
    • gl_FragColor:当前片元颜色
    • gl_FragData:vec4类型的数组。向其写入的信息,供渲染管线的后继过程使用。

常见函数

  • radians(x):角度转弧度
  • degrees(x):弧度转角度
  • sin(x):正弦函数,传入值为弧度。相同的还有cos余弦函数、tan正切函数、asin反正弦、acos反余弦、atan反正切
  • pow(x,y):xy
  • exp(x):ex
  • exp2(x):2x
  • log(x):logex
  • log2(x):log2x
  • sqrt(x):x√
  • inversesqr(x):1x√
  • abs(x):取x的绝对值
  • sign(x):x>0返回1.0,x<0返回-1.0,否则返回0.0
  • ceil(x):返回大于或者等于x的整数
  • floor(x):返回小于或者等于x的整数
  • fract(x):返回x-floor(x)的值
  • mod(x,y):取模(求余)
  • min(x,y):获取xy中小的那个
  • max(x,y):获取xy中大的那个
  • mix(x,y,a):返回x∗(1−a)+y∗a
  • step(x,a):x< a返回0.0,否则返回1.0
  • smoothstep(x,y,a):a < x返回0.0,a>y返回1.0,否则返回0.0-1.0之间平滑的Hermite插值。
  • dFdx(p):p在x方向上的偏导数
  • dFdy(p):p在y方向上的偏导数
  • fwidth(p):p在x和y方向上的偏导数的绝对值之和

几何函数

  • length(x):计算向量x的长度
  • distance(x,y):返回向量xy之间的距离
  • dot(x,y):返回向量xy的点积
  • cross(x,y):返回向量xy的差积
  • normalize(x):返回与x向量方向相同,长度为1的向量

矩阵函数

  • matrixCompMult(x,y):将矩阵相乘
  • lessThan(x,y):返回向量xy的各个分量执行x< y的结果,类似的有greaterThan,equal,notEqual
  • lessThanEqual(x,y):返回向量xy的各个分量执行x<= y的结果,类似的有类似的有greaterThanEqual
  • any(bvec x):x有一个元素为true,则为true
  • all(bvec x):x所有元素为true,则返回true,否则返回false
  • not(bvec x):x所有分量执行逻辑非运算

纹理采样函数

纹理采样函数有texture2D、texture2DProj、texture2DLod、texture2DProjLod、textureCube、textureCubeLod及texture3D、texture3DProj、texture3DLod、texture3DProjLod等。

  • texture表示纹理采样,2D表示对2D纹理采样,3D表示对3D纹理采样
  • Lod后缀,只适用于顶点着色器采样
  • Proj表示纹理坐标st会除以q

纹理采样函数中,3D在OpenGLES2.0并不是绝对支持。我们再次暂时不管3D纹理采样函数。重点只对texture2D函数进行说明。texture2D拥有三个参数,第一个参数表示纹理采样器。第二个参数表示纹理坐标,可以是二维、三维、或者四维。第三个参数加入后只能在片元着色器中调用,且只对采样器为mipmap类型纹理时有效。

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

GLSL(着色器语言) 的相关文章

随机推荐

  • C#中使用Process组件访问本地进程

    欢迎大家提出意见 一起讨论 转载请标明是引用于 http blog csdn net chenyujing1234 代码 VS2008 http www rayfile com zh cn files 10801d54 991d 11e1
  • SD卡受损最简单的修复方法,太神奇了

    如何修复受损的SD卡 很多的数据存储设备在使用时间过长之后都容易出现损坏等的意外 这样会导致一些数据出现乱码 丢失 损坏等的情况 严重影响到了用户的使用 那么各位是否知道如何修复受损的SD卡呢 丢失的数据又该怎么恢复呢 要修复损坏的SD卡的
  • 解决sudo找不到环境变量的问题

    原因 sudo命令会重置环境变量 查看文件 etc sudoers 可以看到这样的配置 Defaults env reset 解决方法 第一种 也是最简单的 使用sudo E来代替sudo即可保留当前用户的环境变量 但缺点也很明显 每次都要
  • linux:unset 一个环境变量,删除环境变量

    在使用 export 导出 设定 一个 环境变量后 我想删除这个环境变量 我使用 unset 上图 的 1到 5 从上倒下 2 展示 了错误的方式 你不要在 unset 的时候 使用 直接像 4 5 那样 使用 变量名字 即可
  • SAP ABAP SE41复制标准状态STATUS

    需要对ALV 标准工具栏进行扩展 自定义一些按钮 这是项目中常见的需求 其实也很简单 步骤如下 1 事务码 SE41 From 标准程序 SAPLKKBL 标准状态栏 STANDARD FULLSCREEN To program 需要添加工
  • 『曼哈顿距离转切比雪夫距离·树状数组·扫描线』航空基地Airbase

    P r o b l e m mathrm Problem Problem S o l u t i o n mathrm Solution Solution 我们考虑将曼哈顿距离转化为切比雪夫具体 p x y p x y x y p x y
  • 01-SA8155P QNX Fastboot更新固件

    1 背景 在基于Android系统做开发时 Fastboot是一个非常实用的工具 能解决快速及便捷的更新开发者所需的分析数据 同样 SA8155P Hypervisor 也支持fastboot 如何使用fastboot呢 详情实操步骤如下第
  • LQFP100封装尺寸图

    下图是LQFP100封装规格的参数 根据下图的参数 即可制作LQFP100的PCB封装
  • Windows API程序设计一

    文章目录 实验目的 实验过程 实验结果 实验目的 了解 windows操作系统应用程序开发的基本概念 win32 API函数 消息与事件驱动 掌握WinMain函数的基本框架 窗口定义 窗口创建 消息循环及窗口过程函数 实验过程 设计一个窗
  • Certificates + APP IDS + Devices + Provisioning Profiles笔记(一)

    一 添加证书 在https developer apple com登陆到后台 打开Certificates 选择一下 是开发证书 需要创建CSR文件了 下面的操作在mac下进行 前往 gt 实用工具 gt 钥匙串访问 gt 证书助理 gt
  • 网页拉起其他app

  • c++调用tensorflow

    目前深度学习越来越火 学习 使用tensorflow的相关工作者也越来越多 但是目前绝大部分的python都是拥有着丰富的python的API 而c 的API不够完善 这就导致绝大多是使用tensorflow的项目都是基于python 如果
  • Web 的攻击技术

    互联网上的攻击大都将 Web 站点作为目标 本章讲解具体有哪些攻击 Web 站点的手段 以及攻击会造成怎样的影响 简单的 HTTP 协议本身并不存在安全性问题 因此协议本身几乎不会成为攻击的对象 应用 HTTP 协议的服务器和客户端 以及运
  • 二进制包安装mysql5.7.36

    二进制包安装mysql 5 7 36 一 下载二进制软件件包 http mirrors 163 com mysql Downloads MySQL 5 7 mysql 5 7 36 linux glibc2 12 x86 64 tar gz
  • Python服务docker file 的两种方式

    方法1 简单方式 FROM python 3 6 8 slim stretch ENV LANG en US UTF 8 LC ALL en US UTF 8 COPY home code label recongnize RUN cp f
  • C#去掉字符串最后一个字符

    可以直接去掉 C 字符串的最后一个字符 有几种方法可以实现这个功能 方法1 使用 Substring 方法 string str Hello World string result str Substring 0 str Length 1
  • STM32单片机初学7-USART串口通信

    USART是Universal Synchronous Asynchronous Receiver Transmitter的英文缩写 意为通用同步 异步串行接收 发送器 它也是单片机中最常用通信方式之一 常用于单片机与上位机 蓝牙模块 GP
  • tomcat_jdbc配置

    tomcat jdbc配置 背景 最近在导入数据时经常出现connection has been closed的异常 排除了数据库8小时问题后 将wait timeout值设置了一个比较大的值 然并卯 最后捣腾到时数据库连接池上 最终通过增
  • 新星计划->线性表_定义+初始化->学习笔记~

    作者 芝士小熊饼干 系列专栏 数据结构 gt 线性表 支持我 点赞 收藏 留言 新星计划参与者 创作不易 十年运道龙困井 一朝得势入青云 金鲤岂是池中物 一遇风雨变化龙 线性表的机构特点 官方解释 线性表的顺序储存是指 在内存中用一组地址连
  • GLSL(着色器语言)

    GLSL 着色器语言 简介 OpenGLES的着色器语言GLSL是一种高级的图形化编程语言 其源自应用广泛的C语言 与传统的c语言不同的是 它提供了更加丰富的针对于图像处理的原生类型 诸如向量 矩阵之类 OpenGLES 主要包含以下特性