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

背景
随着近年来绘图卡的进步, 已在渲染管线中的顶点(vertex)和片段(fragment)层次中,加入更具弹性的新功能。 达到在这个层次中,使用片段和顶点着色器的可编程性。
最初这个功能是以汇编语言撰写着色器来达到的。汇编语言对开发者的使用是不直观而复杂的。OpenGL ARB 创建了 OpenGL 着色语言,为 GPU 的编程提供更加直观的方法,当维护开放标准的时候,就有助于带动 OpenGL 的历史。
最初 OpenGL 1.5 是以扩充形式引入,后来 OpenGL ARB 在 OpenGL 2.0 内核中正式纳入 GLSL。自 1992 年创建的OpenGL 1.0 起,OpenGL 2.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 – 用来访问二维深度纹理的句柄
函数和控制结构
类似于 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 开发工具:
- RenderMonkey(页面存档备份,存于) - 这个软件是由 ATI 制作的,提供界面用以创建、编译和调试 GLSL 着色器,和 DirectX 着色器一样。仅能在 Windows 平台上运行。
- GLSLEditorSample - 在 Mac OS X 上,它是目前唯一可用的程序,其提供着色器的创建和编译,但不能调试。它是 cocoa 应用程序,仅能在 Mac OS X 上运行。
- Lumina(页面存档备份,存于) - Lumina 是新的 GLSL 开发工具。其使用 QT 界面,可以跨平台。
参考文献
- 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