理解inode
1159
2022-05-29
1 存儲限定符
在OpenGL的渲染管線上,頂點數據不是批量處理的,而是一個頂點一個頂點逐一處理的。也就是說,頂點著色器程序每次只處理一個頂點。同樣的,后續的著色器也是逐面片、逐圖元、逐片元處理的。
假如一個模型有1萬個頂點,則頂點著色器程序需要運行1萬次,每次輸入的頂點數據(包括法向量、紋理坐標等)是各不相同的。但是也有在這1萬運行中保持不變的數據,比如在該模型的此次渲染期間,投影矩陣、視點矩陣不會改變,大多數情況下,燈光參數也不會改變。
對于一個模型的一次渲染,在GLSL140版本之前,將頂點著色器程序每次運行時都會改變的數據稱之為attribute,將每次運行保持不變的數據稱之為uniform,將著色器之間順序傳遞的數據稱之為varying——這就是所謂的存儲限定符。
我們可以向著色器程序傳入attribute類型的數據和uniform類型的數據,但不能傳入varying類型的數據。下圖描述了attribute、uniform和varying的作用和用法。
也許是為了強化渲染管線數據的數據輸入輸出概念,自GLSL140版本開始,存儲限定符attribute和varying不再被推薦使用,取而代之的是in和out。顯然,in和out與attribute和varying并不是一一對應的關系。
除了一直不變的uniform,以及后來增補的in和out之外,還有一個存儲限定符const,用來向著色器傳遞只讀變量。
2 布局限定符
從GLSL330版本開始,GLSL增加了一個新的概念:布局管理。布局管理使用一個新的限定符layout,用來設置著色器輸入/輸出變量接口布局。下面的例子使用layout為in變量設置了接口位置,可以在渲染時直接使用這些接口而無需通過訪問著色器程序獲取它們。
#version 330 core layout(location=0) in vec4 a_Position; layout(location=1) in vec4 a_Normal; layout(location=3) in vec4 a_TexCoord;
如果變量是一個數組,則數組的每一個元素都會占據一個location的編號位置。下面的代碼中,u_Matrix是一個長度為3的數組,所以它將占據5、6、7三個位置。
layout(location=5) uniform mat4 u_Matrix[3];
對于out變量,layout同樣有效,且location的編號獨立于in變量。
layout(location=0) out v_color; layout(location=1) out v_TexCoord;
限定符layout的另一個用途是控制UBO(Uniform Buffer Object)數據塊的布局,這需要另外幾個布局限定符,見下表。
下面的代碼,共享了一個uniform數據塊,以行主序方式存儲數據,多個限定符之間以逗號分隔。
layout(shared, row_major) uniform ublock_name {...};
需要特別說明的是,盡管在聲明uniform數據塊時已經提供了數據塊的名字,但不能將數據塊名視為uniform變量的父名稱。這意味著不同的uniform數據塊中如果存在相同的uniform變量名,就會造成編譯錯誤。
OpenGL 渲染
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。