## [基本類型](http://www.hmoore.net/qihangkong/glslang-spec/1704656)
> 定義:基本類型是由語言的某些關鍵字定義的類型
> OpenGl?著色語言中支持如下的基本類型:
**透明類型**
|??類型???|???????????????含義???????????????|
| :---: | :---: |
|??void???|????????用于函數沒有返回值????????|
|??bool???|?條件類型,取值為?true?或者?false?|
|???int???|???????????有符號的整型???????????|
|??uint???|????????????無符號整型????????????|
|??float??|????????單精度浮點類型標量????????|
|?double??|????????雙精度浮點類型標量????????|
|??vec2???|????????二維單精度浮點向量????????|
|??vec3???|????????三維單精度浮點向量????????|
|??vec4???|????????四維單精度浮點向量????????|
|??dvec2??|????????二維雙精度浮點向量????????|
|??dvec3??|????????三維雙精度浮點向量????????|
|??dvec4??|????????四維雙精度浮點向量????????|
|??bvec2??|???????????二維布爾向量???????????|
|??bvec3??|???????????三維布爾向量???????????|
|??bvec4??|???????????四維布爾向量???????????|
|??ivec2??|????????二維有符號整型向量????????|
|??ivec3??|????????三維有符號整型向量????????|
|??ivec4??|????????四維有符號整型向量????????|
|??uvec2??|????????二維無符號整型向量????????|
|??uvec3??|????????三維無符號整型向量????????|
|??uvec4??|????????四維無符號整型向量????????|
|??mat2???|???????2x2?的單精度浮點矩陣???????|
|??mat3???|???????3x3?的單精度浮點矩陣???????|
|??mat4???|???????4x4?的單精度浮點矩陣???????|
|?mat2x2??|???????2x2?的單精度浮點矩陣???????|
|?mat2x3??|???????2x3?的單精度浮點矩陣???????|
|?mat2x4??|???????2x4?的單精度浮點矩陣???????|
|?mat3x2??|???????3x2?的單精度浮點矩陣???????|
|?mat3x3??|???????3x3?的單精度浮點矩陣???????|
|?mat3x4??|???????3x4?的單精度浮點矩陣???????|
|?mat4x2??|???????4x2?的單精度浮點矩陣???????|
|?mat4x3??|???????4x3?的單精度浮點矩陣???????|
|?mat4x4??|???????4x4?的單精度浮點矩陣???????|
|??dmat2??|???????2x2?的雙精度浮點矩陣???????|
|??dmat3??|???????3x3?的雙精度浮點矩陣???????|
|??dmat4??|???????4x4?的雙精度浮點矩陣???????|
|?dmat2x2?|???????2x2?的雙精度浮點矩陣???????|
|?dmat2x3?|???????2x3?的雙精度浮點矩陣???????|
|?dmat2x4?|???????2x4?的雙精度浮點矩陣???????|
|?dmat3x2?|???????3x2?的雙精度浮點矩陣???????|
|?dmat3x3?|???????3x3?的雙精度浮點矩陣???????|
|?dmat3x4?|???????3x4?的雙精度浮點矩陣???????|
|?dmat4x2?|???????4x2?的雙精度浮點矩陣???????|
|?dmat4x3?|???????4x3?的雙精度浮點矩陣???????|
|?dmat4x4?|???????4x4?的雙精度浮點矩陣???????|
> Note:?下表所說"訪問紋理","sampler "不透明類型訪問紋理,"image " 不透明類型訪問圖像,具有指定的類型。
## 修飾符
> 變量的聲明可以使用如下的修飾符。
|??類型???|???????????????含義???????????????|
| :---: | :---: |
| const | 常量值必須在聲明是初始化。它是只讀的不可修改的。 |
| attribute | 表示只讀的頂點數據,只用在頂點著色器中。數據來自當前的頂點狀態或者頂點數組。它必須是全局范圍聲明的,不能再函數內部。一個attribute可以是浮點數類型的標量,向量,或者矩陣。不可以是數組或則結構體 |
| uniform | 一致變量。在著色器執行期間一致變量的值是不變的。與const常量不同的是,這個值在編譯時期是未知的是由著色器外部初始化的。一致變量在頂點著色器和片段著色器之間是共享的。它也只能在全局范圍進行聲明。 |
| varying | 頂點著色器的輸出。例如顏色或者紋理坐標,(插值后的數據)作為片段著色器的只讀輸入數據。必須是全局范圍聲明的全局變量。可以是浮點數類型的標量,向量,矩陣。不能是數組或者結構體。 |
| centorid varying | 在沒有多重采樣的情況下,與varying是一樣的意思。在多重采樣時,centorid varying在光柵化的圖形內部進行求值而不是在片段中心的固定位置求值。 |
| invariant | (不變量)用于表示頂點著色器的輸出和任何匹配片段著色器的輸入,在不同的著色器中計算產生的值必須是一致的。所有的數據流和控制流,寫入一個invariant變量的是一致的。編譯器為了保證結果是完全一致的,需要放棄那些可能會導致不一致值的潛在的優化。除非必要,不要使用這個修飾符。在多通道渲染中避免z\-fighting可能會使用到。 |
| in | 用在函數的參數中,表示這個參數是輸入的,在函數中改變這個值,并不會影響對調用的函數產生副作用。(相當于C語言的傳值),這個是函數參數默認的修飾符 |
| out | 用在函數的參數中,表示該參數是輸出參數,值是會改變的。 |
| inout | 用在函數的參數,表示這個參數即是輸入參數也是輸出參數。 |
## 內置變量
> 內置變量可以與固定函數功能進行交互。在使用前不需要聲明。頂點著色器可用的內置變量如下表:
| 名稱 | 類型 | 描述 |
|-------------------------|-------|------------------------------------------------|
| gl\_Color | vec4 | 輸入屬性\-表示頂點的主顏色 |
| gl\_SecondaryColor | vec4 | 輸入屬性\-表示頂點的輔助顏色 |
| gl\_Normal | vec3 | 輸入屬性\-表示頂點的法線值 |
| gl\_Vertex | vec4 | 輸入屬性\-表示物體空間的頂點位置 |
| gl\_MultiTexCoordn | vec4 | 輸入屬性\-表示頂點的第n個紋理的坐標 |
| gl\_FogCoord | float | 輸入屬性\-表示頂點的霧坐標 |
| gl\_Position | vec4 | 輸出屬性\-變換后的頂點的位置,用于后面的固定的裁剪等操作。所有的頂點著色器都必須寫這個值。 |
| gl\_ClipVertex | vec4 | 輸出坐標,用于用戶裁剪平面的裁剪 |
| gl\_PointSize | float | 點的大小 |
| gl\_FrontColor | vec4 | 正面的主顏色的varying輸出 |
| gl\_BackColor | vec4 | 背面主顏色的varying輸出 |
| gl\_FrontSecondaryColor | vec4 | 正面的輔助顏色的varying輸出 |
| gl\_BackSecondaryColor | vec4 | 背面的輔助顏色的varying輸出 |
| gl\_TexCoord\[\] | vec4 | 紋理坐標的數組varying輸出 |
| gl\_FogFragCoord | float | 霧坐標的varying輸出 |
> 片段著色器的內置變量如下表:
| 名稱 | 類型 | 描述 |
|--------------------|-------|----------------------------------------------------------------|
| gl\_Color | vec4 | 包含主顏色的插值只讀輸入 |
| gl\_SecondaryColor | vec4 | 包含輔助顏色的插值只讀輸入 |
| gl\_TexCoord\[\] | vec4 | 包含紋理坐標數組的插值只讀輸入 |
| gl\_FogFragCoord | float | 包含霧坐標的插值只讀輸入 |
| gl\_FragCoord | vec4 | 只讀輸入,窗口的x,y,z和1/w |
| gl\_FrontFacing | bool | 只讀輸入,如果是窗口正面圖元的一部分,則這個值為true |
| gl\_PointCoord | vec2 | 點精靈的二維空間坐標范圍在\(0\.0, 0\.0\)到\(1\.0, 1\.0\)之間,僅用于點圖元和點精靈開啟的情況下。 |
| gl\_FragData\[\] | vec4 | 使用glDrawBuffers輸出的數據數組。不能與gl\_FragColor結合使用。 |
| gl\_FragColor | vec4 | 輸出的顏色用于隨后的像素操作 |
| gl\_FragDepth | float | 輸出的深度用于隨后的像素操作,如果這個值沒有被寫,則使用固定功能管線的深度值代替 |