OpenGL GLSL语言

2019-02-23  本文已影响0人  azmohan

GLSL - OpenGL Shading Language也称作GLslang,是一个以C语言为基础的高阶着色语言。为开发者提供对绘图管线更多的直接控制,而无需使用汇编语言或硬件规格语言。

GLSL类型

OpenGL着色器语言规格定义了 22 个基本变量类型,大部分用法与C语言相同,其它的是绘图处理器特有的。

从上面的类型可以看出,GLSL着色器语言是由标量、向量、矩阵、采样器等基本数学数据元素类型组成的。这也是数学描素图像学的基本数据类型。当然和C语言一样,GLSL语言也有能力用基本数据类型构成复杂的数据。例如:支持结构和数组。

注意:GLSL语言不支持双精度浮点型、字节类型、短整型、长整型。并且没有联合体、枚举类型、无符号整型以及位运算等特性。

数据类型的使用

GLSL语言数据类型的使用和C语言类似,都先声明再使用,有使用域,变量初始化也符合C语言语法。下面说一下C语言没有的类型初始化和引用示例:

vec4 va = vec3(1.0,2.0,3.0,4.0);
vec3 vb = va.rgb; // 颜色相关 argb
vec3 vc = va.xyz; // 坐标相关 xyzw
vec3 vd = va.stuv // 纹理相关 stuv
vec3 vf = va.aagg // 可以组合,但只能同类型组合
mat3 ma = mat3(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0);
mat3 mb = mat3(1.0) // 1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0;

特殊的内建变量

着色器代码的开发中会使用到很多变量,其中大部分可能是由开发人员根据需求自定义的,但着色器也提供了一些用来满足特定需求的内建变量,这些内建变量不需要声明即可使用,一般用来实现渲染管线固定功能部分与自定义顶点或片元着色器之间的信息交互。

内建变量根据信息传递的方向可以分为两类:输入与输出变量。输入变量负责将渲染管线中固定功能部分产生的信息传递进着色器,输出变量负责将着色器产生的信息传递给渲染管线中固定功能部分。

内建输入变量

gl_Position
gl_PointSize
gl_FragCoord
gl_FrontFacing

内建输出变量

gl_FragColor
gl_FragData

算法

程序就是数据加算法。上面介绍了GLSL支持的数据类型,就可以构造数据了。算法就是对数据的操作,是符合C语言的。运算符、控制流程、函数等都和C语言类似。只不过为了运算的高效,给开发者提供高效的内置函数。

内置函数

内置函数通常是以最优的方式实现的,有部分函数甚至是由硬件直接支持,这大大地提高了执行效率。大部分内置函数同时适用于顶点着色器与片元着色器,但是也有部分内置函数只适用于顶点着色器或者片元着色器。

内置函数按照设计目的可以分为三个类型:

具体内置函数 https://cloud.tencent.com/developer/article/1148928

编译和执行

GLSL也是编译执行性语言,只不过编译是动态的,并且不是独立的应用,需要使用OpenGL API的宿主程序。

工具

GLSL着色器可以事先建立和测试,现有以下GLSL开发工具:

上一篇下一篇

猜你喜欢

热点阅读