以前嘗試將一個GLSL version 110的版本寫成GLSL version 330的,在此將學習過程和收穫記錄下來。git
參考連接 GLSL Versionsgithub
你可使用#version命令做爲着色器的第一行來指定GLSL版本:數組
#version 120 void main() { gl_FragColor = vec4(1.0); }
GLSL版本與GL版本一塊兒發佈。 請參閱如下圖表以肯定要定位的版本。函數
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 |
OpenGL ES有本身的着色語言,並且版本開始變得新鮮。它是基於OpenGL着色語言版本1.10。佈局
OpenGL ES 版本 | GLSL ES 版本 |
2.0 | 100 |
3.0 | 300 |
因此,例如,若是GLSL 120中有一個功能,它可能在GLSL ES 100中不可用,除非ES編譯器特別容許它。post
(桌面)GLSL版本之間的差別。學習
定點着色器:ui
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); }
片斷(片元)着色器:spa
uniform sampler2D tex0; varying vec2 vTexCoord; void main() { vec4 color = texture2D(tex0, vTexCoord); gl_FragColor = color; }
從GLSL 130+開始,使用in和out代替屬性和變化。 GLSL 330+包括其餘功能,如佈局限定符和將texture2D更改成紋理。orm
頂點着色器
#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); }
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。
1,支持int和uint(以及它們的按位操做);
2,支持switch語句;
3,新的內置函數:trunc(),round(),roundEven(),isnan(),isinf(),modf();
4,片斷輸出能夠是用戶定義的;
5,輸入和輸出用in和out語法聲明,替代屬性和變化。
1,如今應該使用texture(),替代texture2D()。
1,佈局限定符能夠聲明頂點着色器輸入和片斷着色器輸出的位置,例如:
layout(location = 2) in vec3 values[4];
形式上這隻能經過ARB_explicit_attrib_location擴展來實現。
1,uniform在圖形學中能夠理解爲全局變量(或者理解爲全局統一量),若是varying修飾的跟cg同樣都是函數參數,會很好理解;
2,片斷和片元其實都指的是一個fragment;
3,vertex和point兩個意思有時候不同,前一個指定點、端點,後一個指「單純的一個」點。