1. 程式人生 > >GLSL版本的區別和對比

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 詳解(高階篇)