GLSL版本的區別和對比
之前嘗試將一個GLSL version 110的版本寫成GLSL version 330的,在此將學習過程和收穫記錄下來。
參考連結 GLSL Versions
介紹
你可以使用#version命令作為著色器的第一行來指定GLSL版本:
#version 120 void main() { gl_FragColor = vec4(1.0); }
GLSL版本與GL版本一起釋出。 請參閱以下圖表以確定要定位的版本。
GLSL版本
OpenGL 版本 |
GLSL 版本 |
2.0 | 110 |
2.1 | 120 |
3.0 | 130 |
3.1 | 140 |
3.2 | 150 |
3.3 | 330 |
4.0 | 400 |
4.1 | 410 |
4.2 | 420 |
4.3 | 430 |
GLSL ES版本 (Android, iOS, WebGL)
OpenGL ES有自己的著色語言,而且版本開始變得新鮮。它是基於OpenGL著色語言版本1.10。
OpenGL ES 版本 | GLSL ES 版本 |
2.0 | 100 |
3.0 | 300 |
所以,例如,如果GLSL 120中有一個功能,它可能在GLSL ES 100中不可用,除非ES編譯器特別允許它。
一些差異
(桌面)GLSL版本之間的差異。
版本 100
定點著色器:
uniform mat4 projTrans; attribute vec2 Position; attribute vec2 TexCoord; varying vec2 vTexCoord; void main() { vTexCoord = TexCoord; gl_Position = u_projView * vec4(Position, 0.0, 1.0); }
片段(片元)著色器:
uniform sampler2D tex0; varying vec2 vTexCoord; void main() { vec4 color = texture2D(tex0, vTexCoord); gl_FragColor = color; }
版本 330
從GLSL 130+開始,使用in和out代替屬性和變化。 GLSL 330+包括其他功能,如佈局限定符和將texture2D更改為紋理。
頂點著色器
#version 330 uniform mat4 projTrans; layout(location = 0) in vec2 Position; layout(location = 1) in vec2 TexCoord; out vec2 vTexCoord; void main() { vTexCoord = TexCoord; gl_Position = u_projView * vec4(Position, 0, 1); }
片段(片元)著色器:
#version 330 uniform sampler2D tex0; in vec2 vTexCoord; //使用你自己的輸出從而替代 gl_FragColor out vec4 fragColor; void main() { //'texture' 替代 'texture2D' fragColor = texture(tex0, vTexCoord); }
其他重大的變化
GLSL 120 增加
1,你可以在著色器中初始化陣列,如下所示:
float a[5] = float[5](3.4, 4.2, 5.0, 5.2, 1.1); float b[5] = float[](3.4, 4.2, 5.0, 5.2, 1.1);
然而,即使使用GLSL 120,Mac OSX Snow Leopard也不支援上述功能。
2,你可以在著色器中初始化全域性變數,並且值將在連結時設定:
uniform float val = 1.0;
3,在設定const值時,可以使用像sin()這樣的內建函式;
4,必要時,整數會隱式轉換為浮點數,例如:
float f = 1.0; <-- valid float g = 1; <-- only supported in GLSL 120 vec2 v = vec2(1, 2.0); <-- only supported in GLSL 120
5,你可以用f來定義一個浮點數:float f = 2.5f。
GLSL 130 增加
1,支援int和uint(以及它們的按位操作);
2,支援switch語句;
3,新的內建函式:trunc(),round(),roundEven(),isnan(),isinf(),modf();
4,片段輸出可以是使用者定義的;
5,輸入和輸出用in和out語法宣告,替代屬性和變化。
GLSL 150 增加
1,現在應該使用texture(),替代texture2D()。
GLSL330 增加
1,佈局限定符可以宣告頂點著色器輸入和片段著色器輸出的位置,例如:
layout(location = 2) in vec3 values[4];
形式上這隻能通過ARB_explicit_attrib_location擴充套件來實現。
注意
1,uniform在圖形學中可以理解為全域性變數(或者理解為全域性統一量),如果varying修飾的跟cg一樣都是函式引數,會很好理解;
2,片段和片元其實都指的是一個fragment;
3,vertex和point兩個意思有時候不一樣,前一個指定點、端點,後一個指“單純的一個”點。
參考資料