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

GLSL基本框架

背景

随著近年来绘图卡的进步, 底层顶点(vertex)和片段(fragment)的渲染管线中加入更多更具弹性的新功能。 这个层次的可编程性由片段和顶点著色器实现。

最初这个功能是以汇编语言撰写著色器来达到,不直观而复杂。OpenGL ARB 建立了 OpenGL 著色语言,为 GPU 的程式设计提供更加直观的方法,同时维护了 OpenGL 一向的开放标准。

最初作为 OpenGL 1.4 的插件,后来由 OpenGL ARB英语OpenGL Architecture Review Board 在2004 OpenGL 2.0 核心中正式纳入,是自 1992 年 OpenGL 1.0 发布起第一个 OpenGL 的大改版。

使用 GLSL 有如下好处:

  • 具有跨平台的相容性,包括 MacintoshWindowsLinux 等作业系统。
  • 编写的著色器可以在所有支援 OpenGL 著色语言的绘图卡上使用。
  • 允许厂商为特定的绘图卡架构设计最佳化的代码。

详细资料

资料类型

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 开发工具:

  • RenderMonkey页面存档备份,存于互联网档案馆) - 这个软体是由 ATI 制作的,提供界面用以建立、编译和除错 GLSL 著色器,和 DirectX 著色器一样。仅能在 Windows 平台上执行。
  • GLSLEditorSample - 在 Mac OS X 上,它是目前唯一可用的程式,其提供著色器的建立和编译,但不能除错。它是 cocoa 应用程式,仅能在 Mac OS X 上执行。
  • Lumina页面存档备份,存于互联网档案馆) - Lumina 是新的 GLSL 开发工具。其使用 QT 界面,可以跨平台。

参考文献

外部链接

参见