GLSL 語法基礎

2021-06-28 11:57:12 字數 3753 閱讀 2549

glsl語法跟c語言非常相似:

1.資料型別:

glsl包含下面幾種簡單的資料型別

float 

bool :false or ture

int向量:

vec        長度為2, 3, 4的float向量

bvec      長度為2, 3, 4的bool向量

ivec       長度為2, 3, 4的int向量

矩陣:mat2   2*2的浮點矩陣

mat3   3*3的浮點矩陣

mat4   4*4的浮點矩陣

以上三種矩陣可以簡寫為mat2 mat3 mat4

矩陣的行和列並沒有規定相等,因為可以使用mat2*3 mat 4*2等方法來宣告行數和列數

一種特殊的資料型別:取樣器--用於紋理取樣

sampler1d     訪問乙個一維紋理

sampler2d     訪問乙個二維紋理

sampler3d     訪問乙個三維紋理

samplercube  訪問乙個立方體紋理

sampler1dshadow 訪問乙個帶對比的一維深度紋理

sampler2dshadow 訪問乙個帶對比的二維深度紋理

glsl提供了類似c語言的使用者定義結構:

struct dirlight;

變數限定符:

限定符賦給變數特殊的含義:

const--     用於宣告非可寫的編譯時常量變數

attribute-- 用於經常更改的資訊,只可以再頂點著色器中使用

uniform--  用於不經常更改的資訊,用於頂點著色器和片元著色器

varying--   用於慈寧宮頂點著色器傳遞到片元著色器的插值資訊

控制流:

glsl的控制流  與c++非常類似,可以使用for while以及do-while實現迴圈,也可以使用if和if-else進行選擇,不過if語句中的變數宣告,只是在最近的硬體中才提供

函式:glsl也提供了一些特殊的實現:

continue

break

discard --只可用於片元著色器,當控制流遇到這個關鍵字時,正在處理的片元就會被標記為將要丟棄

函式main() 可以返回除了陣列外的任何型別

對於函式的引數 可以使用下面幾種限定符

in -- 複製進函式但不在返回時複製,在函式內部仍然是可寫的

out--只在返回時複製,是可讀的

inout  複製進函式並在返回時複製

如果沒有指定限定符,預設情況下為in

函式可以通過引數型別過載,但是不能僅僅通過返回型別過載,同樣,因為不會執行引數型別自動提公升,所以呼叫函式時引數型別必須完全匹配

函式不能被遞迴呼叫

glsl vertex shader內建的輸入變數,注意這些變數都是不可更改的

attribute vec4  gl_color;                               頂點資料字段的diffuse顏色

attribute vec4  gl_secondarycolor;                頂點資料字段的specular顏色

attribute vec4  gl_normal;                             頂點法線

attribute vec4  gl_vertex;                             頂點位置

attribute vec4  gl_multitexcoord0;                8組貼圖座標

attribute vec4  gl_multitexcoord1;

attribute vec4  gl_multitexcoord2;

attribute vec4  gl_multitexcoord3;

attribute vec4  gl_multitexcoord4;

attribute vec4  gl_multitexcoord5;

attribute vec4  gl_multitexcoord6;

attribute vec4  gl_multitexcoord7;

attribute vec4  gl_multitexcoord0;

attribute vec4  gl_multitexcoord1;

attribute vec4  gl_fogcoord;                         使用霧效果的參考數值

在編寫shader時,可以把這些輸入資料所代表的功能重新定義,名稱只是用來讓傳入資料時有個規則可循而已,c++呼叫glvertexpointer所指到的vetex buffer資料,在glsl中可以通過gl_vertex變數來獲得。

vertex shader的輸出資料時使用的內建變數:

vec4 gl_posotion;                用來設定頂點轉換到螢幕座標的位置,vertex shader一定要去更新這個數值

float gl_pointsize;                是啟動pointsprite功能時,用來設定矩形大小的數值

vec4 gl_clipvertex;              如果啟用了clip plane功能,gl_clipvertex可以放入用來與clip plane平面做測試用的位置

下面的輸出資料在vertex shader中用來輸出資料,在fragment sahder也可以使用這些變數,但是是用來讀取資料:

araying vec4   gl_frontcolor;                          對正面做不同的光照計算 ,這兩組顏色分主要顏色和次要顏色 代表的是固管的diffuse值

varying vec4   gl_backcolor;                            背面

varying vec4   gl_frontseconddarycolor;          固管的specular值 

varying vec4   gl_backsecondarycolor;

varying vec4   gl_texcoord[gl_maxtexturecoords]; gltextcoord[0]是指第0個貼圖座標  

varying vec4   gl_fogfragcoord;

fragment sahder除了可以從上面幾個所列出的變數獲得內插結果外,還可以從另外兩個內建變數得到一些無法從vertex shader獲得的數值

vec4 gl_fragcoord;  gl_fragcoorg.xy代表畫素在framebuffer畫面的位置,gl_fragcoord.z代表這個店在做z buffer測試時所用的z值

bool gl_frontfacing; 可用來查詢目前正在畫的畫素是來自三角形的正面還是來自他的背面

fragment shader的內建輸出變數:

vec4 gl_fragcolor;                               代表畫面所要填入的顏色

vec4 gl_fragdata[gl_maxdrawbuffers];  用來填入畫面的顏色,用在啟用多個framebuffer時,呼叫gl_fragdata填入畫面顏色

vec4 gl_fragdepth;                             用來指定z buffer測試時所使用的z值,這樣就可以不通過頂點內插得到的z值

對於vertex shader來說,除了可通過內建變數來內插數值給fragment shader之外,也可以不通過內建變數,只要在vertex shader和fragment shader中宣告相同名稱的全域性變數,glsl就可以自動的把這兩個數值連線起來

GLSL 語法基礎

glsl語法跟c語言非常相似 1.資料型別 glsl包含下面幾種簡單的資料型別 float bool false or ture int向量 vec 長度為2,3,4的float向量 bvec 長度為2,3,4的bool向量 ivec 長度為2,3,4的int向量 矩陣 mat2 2 2的浮點矩陣 ...

GLSL基礎教程(一)

高階著色語言 hlsl high level shading language 是用來在頂點和畫素著色器 shader 中程式設計的語言。其實,說白了他們就是我們寫的短小的自定義程式,他們是在圖形卡的gpu graphic processor unit圖形處理單元 上執行的,代替了固定的渲染管線的一...

關於GLSL中語法和呼叫規則

glsl是什麼就不多說了。這裡只介紹一下glsl中一些限定符。glsl中包含兩類具有定義性質的符號,一類是和c 中定義變數的一樣的符號,用來說明存放資料的型別,如float,int,bool。還有一類是的功能類似於c 中的private,protect,public,是用來說明變數被訪問的方式,gl...