1. 程式人生 > >OpenGL ES著色器語言----------------儲存修飾符

OpenGL ES著色器語言----------------儲存修飾符

可執行程序 函數參數 匹配 技術分享 預處理 但是 不變 基本 打包

一、存儲修飾符

技術分享圖片

  本地變量只能使用存儲修飾符const

  函數參數只能用const。函數返回值類型和結構體字段不要使用const。

從一個運行時著色器到下一個運行時著色器之間進行數據類型通信是不存在的。這阻止了同一個著色器在多個頂點和片元之間同時執行。

沒有存儲修飾符或僅僅使用const修飾符的全局變量,可能在main()執行前進行初始化。Uniforms, attributes和varyings可能沒有初始化器。

1、默認存儲修飾符

如果在全局變量前沒有修飾符,那麽它們就與應用程序和其他處理器上的著色器沒有關聯。

  對於全局或本地的無修飾符變量,聲明都會在其所屬的那個處理器上分配內存。這個變量將提供對分配的內存的讀寫訪問。

2、常量修飾符

  命名的編譯時常量可以用const聲明。任何使用const聲明的變量在其所屬的著色器中均是只讀的。

  const可以用來修飾任何基本數據類型。通常const變量在聲明的同時要進行初始化

      const vec3 zAxis = vec3 (0.0, 0.0, 1.0);

   結構體字段不能使用const修飾,但是變量可以,並通過構造器進行初始化。包含數組的數組和結構體不能聲明為常量,因為它們不能被初始化。

3、Attribute

  attribute修飾符用於聲明通過OpenGL ES應用程序傳遞到頂點著色器中的變量值。在其它任何非頂點著色器的著色器中聲明attribute變量是錯誤的

  在頂點著色器被程序使用之前,attribute變量是只讀的。

  attribute變量的值通過OpenGL ES頂點API或者作為頂點數組的一部分被傳進頂點著色器。它們傳遞頂點屬性值到頂點著色器,並且在每一個運行的頂點著色器中都會改變。

  attribute修飾符只能修飾float, vec2, vec3, vec4,mat2,mat3,mat4。attribute變量不能聲明為數組或結構體。如:

               attribute vec4 position;

               attribute vec3 normal;

               attribute vec2 texCoord;

  

  大家可能希望圖形硬件有極少量的固定位置來傳遞頂點屬性。

  所以,OpenGL ES為每一個非矩陣變量賦予了升級到4個浮點數值的空間,如vec4。

  在OpenGL ES中,可以使用的屬性變量個數是有限制的,如果超過這個限制,將會引起鏈接錯誤。(聲明了但沒有使用的屬性變量不會受到這個限制。)

  一個浮點數屬性也要受到這個限制,所以你應該盡量將四個毫不相關的float變量打包成一個pack,以優化底層硬件的兼容性。

  一個mat4和使用4個vec4變量是一致的,同理,一個mat3和使用3個vec3變量是一致的,一個mat2和使用2個vec2變量是一致的。

  著色語言和API隱藏了到底這些空間是如何被矩陣使用的。屬性變量需要被聲明為全局變量。

4、Uniform

  uniform修飾符用來修飾那些在整個圖元被處理的過程中保持不變的全局變量。

  所有的uniform變量都是只讀的,可以通過應用程序調用API命令初始化,或者通過OpenGL ES間接初始化。

    uniform vec4 lightPosition; 

  uniform修飾符可以和任意基本數據類型一起使用,或者包含基本數據類型元素的數組和結構體。

  每種類型的著色器的uniform變量的存儲數量是有限制的,如果超過這個限制,將會引起編譯時或鏈接時錯誤。

  聲明了但是沒有被靜態使用的uniform變量不會受到這個限制。

  靜態使用(static use)是指著色器包含變量在預處理以後的一個引用。用戶定義的uniform變量和著色器中被靜態使用的內建uniform變量將共同決定有沒有超出可用uniform存儲範圍。
 

  當頂點著色器和片元著色器被鏈接到一起,它們將共享同一個名稱空間。這就意味著,所有被連接到同一個可執行程序的著色器中的同名變量必須也同時具有相同的類型和精度。

4、Varying  

  varying變量提供了頂點著色器,片元著色器和二者通訊控制模塊之間的接口。

  頂點著色器計算每個頂點的值(如顏色,紋理坐標等)並將它們寫到varying變量中。

  

  通過定義,每個頂點的varying變量以一種透視校正的方式被插入到正在渲染的圖元上。如果是單采樣,插值為片元中心。如果是多采樣,插值可以是像素中的任何地方,包括片元中心或者其中一個片元采樣。

  片元著色器會讀取varying變量的值,並且被讀取的值將會作為插值器,作為圖元中片元位置的一個功能信息。varying變量對於片元著色器來說是只讀的

在頂點和片元著色器中都有聲明的同名varying變量的類型必須匹配,否則將引起鏈接錯誤。

  下表總結了頂點和片元著色器匹配的規則:

  技術分享圖片

術語“靜態使用”意思是在預處理之後,著色器至少包含一個訪問varying變量的語句,即使這個語句沒有真正執行過。

       varying vec3 normal;

varying修飾符只能用在float, vec2, vec3, vec4, mat2, mat3, mat4和包含這些類型元素的數組上,不能用於修飾結構體。

varying變量需要聲明為全局變量。


---------------------整理自南極娃娃魚文章,來源如下

作者:南極娃娃魚
來源:CSDN
原文:https://blog.csdn.net/wangyuchun_799/article/details/7744620?utm_source=copy
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

OpenGL ES著色器語言----------------儲存修飾符