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兩個意思有時候不一樣,前一個指定點、端點,後一個指“單純的一個”點。

參考資料

GLSL 詳解(基礎篇)

GLSL 詳解(高級篇)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章