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 有如下好处:

  • 具有​​跨平台​​的相容性,包括 ​​Macintosh​​、​​Windows​​ 和 ​​Linux​​ 等操作系统。
  • 所有支援 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 上执行。
  • ​Lumia​​ - Lumina 是新的 GLSL 开发工具。其使用 QT 界面,可以跨平台。

[​​编辑​​]参考文献

[​​编辑​​]参阅

[​​编辑​​]外部链接