GLSL
GLSL - OpenGL Shading Language 也称作 GLslang,是一个以C语言为基础的高阶着色语言。它是由 OpenGL ARB 所建立,提供开发者对绘图管线更多的直接控制,而无需使用汇编语言或硬件规格语言。
背景
随着近年来绘图卡的进步, 底层顶点(vertex)和片段(fragment)的渲染管线中加入更多更具弹性的新功能。 这个层次的可编程性由片段和顶点着色器实现。
最初这个功能是以汇编语言撰写着色器来达到,不直观而复杂。OpenGL ARB 建立了 OpenGL 着色语言,为 GPU 的程式设计提供更加直观的方法,同时维护了 OpenGL 一向的开放标准。
最初作为 OpenGL 1.4 的插件,后来由 OpenGL ARB 在2004 OpenGL 2.0 核心中正式纳入,是自 1992 年 OpenGL 1.0 发布起第一个 OpenGL 的大改版。
使用 GLSL 有如下好处:
详细资料
资料类型
OpenGL 着色语言规格定义了 22 个基本资料类型,有些用法与 C 相同,其它的是绘图处理器特有的。
- void – 用于没有返回值的函式
- bool – 条件类型,其值可以是真或假
- int – 带负号整数
- float – 浮点数
- vec2 – 2 个浮点数组成的向量
- vec3 – 3 个浮点数组成的向量
- vec4 – 4 个浮点数组成的向量
- bvec2 – 2 个布林组成的向量
- bvec3 – 3 个布林组成的向量
- bvec4 – 4 个布林组成的向量
- ivec2 – 2 个整数组成的向量
- ivec3 – 3 个整数组成的向量
- ivec4 – 4 个整数组成的向量
- mat2 – 浮点数的 2X2 矩阵
- mat3 – 浮点数的 3X3 矩阵
- mat4 – 浮点数的 4X4 矩阵
- sampler1D – 用来存取一维纹理的句柄(handle)(或:操作,作名词解。)
- sampler2D – 用来存取二维纹理的句柄
- sampler3D – 用来存取三维纹理的句柄
- samplerCube – 用来存取立方映射纹理的句柄
- sampler1Dshadow – 用来存取一维深度纹理的句柄
- sampler2Dshadow – 用来存取二维深度纹理的句柄
运算子
OpenGL 着色语言提供类似于 C语言的运算子。给开发者编写着色器的灵活性。GLSL 包含了 C和C++运算子,除了位元运算子和指标以外。
函式和控制结构
类似于 C语言,GLSL 支援循环和分支,包括 if、else、if/else、for、do-while、break、continue 等。
支援使用者定义函式,且各种常用的函式也已内建。这也就让绘图卡制造商,能够在硬件层次上最佳化这些内建的函式。许多函式与 C 语言相同,如 exp() 以及 abs(),其它绘图编程特有的,如 smoothstep() 以及 texture2D()。
编译和执行
GLSL 着色器不是独立的应用程序;其需要使用 OpenGL API 的应用程序。C、C++、C#、Delphi 和 Java 皆支援 OpenGL API,且支援 OpenGL 着色语言。
GLSL 着色器本身只是简单的字串集,这些字串集会传送到硬件厂商的驱动程式,并从程式内部的 OpenGL API 进入点编译。着色器可从程式内部或读入纯文字档来即时建立,但必须以字串形式传送到驱动程式。
用以编译、连结并传送参数到 GLSL 程式的 API 集,已在三个 OpenGL 扩展中规定,且即将成为 OpenGL 2.0(页面存档备份,存于互联网档案馆) 核心的一部分。这些 API 可在以下扩展中找到:
GLSL 顶点着色器的简单范例
void main(void)
{
gl_Position = ftransform();
}
GLSL 片断着色器的简单范例
void main(void)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
工具
GLSL 着色器可以事先建立和测试,现有以下 GLSL 开发工具:
参考文献
- Rost, Randi J. OpenGL Shading Language. 1st ed. Pearson Education, Inc, 2004. ISBN 0-321-19789-5
- Kessenich, John, & Baldwin, David, & Rost, Randi. The OpenGL Shading Language. Version 1.10.59. 3Dlabs, Inc. Ltd. https://web.archive.org/web/20070404171317/http://developer.3dlabs.com/documents/index.htm