天天看點

OpenGL ES着色器語言規範 7 内建變量7 内建變量

版權聲明:本文為flycatdeng原創文章或譯文,轉載請加上連結和作者名 https://blog.csdn.net/flycatdeng

目錄

7 内建變量

7.1 頂點着色器特殊變量

7.2 片段着色器特殊變量

7.3 頂點着色器内置屬性

7.4 内建常量

7.5 内置統一狀态

7 内建變量

一些OpenGL ES操作仍然在頂點處理器和片段處理器之間的固定功能中繼續發生。在片段處理器之後,其他OpenGL ES操作繼續以固定功能發生。 着色器通過使用内置變量與OpenGL ES的固定功能進行通信。

在OpenGL ES中,内置的特殊變量構成了頂點着色器輸出的一部分,片段着色器輸入的一部分和片段着色器的輸出。與使用者定義的易變變量不同的是,内置特殊變量在頂點語言和片段語言之間沒有嚴格的一對一對應關系。 相反,提供了兩組,每種語言一組。

7.1 頂點着色器特殊變量

變量gl_Position僅在頂點語言中可用,用于寫入齊次頂點位置。格式良好的頂點着色器的所有執行都應該将值寫入此變量。它可以在着色器執行期間随時寫入。在寫入之後,着色器也可以回讀它。該值将由圖元裝配,剪切,剔除以及在發生頂點處理後對基元進行操作的其他固定功能操作使用。如果編譯器未檢測到gl_Position,或者在寫入之前讀取,則編譯器可能會生成診斷消息,但并非所有此類情況都可檢測到。如果執行頂點着色器并且不寫gl_Position,則gl_Position的值是未定義的(如果為未定義,則不同的晶片會有不同的處理方式,這裡需要注意,那在不同的晶片上可能就表現不同了)。

變量gl_PointSize僅在頂點語言中可用,并且僅用于頂點着色器以寫入要光栅化的點的大小。它以像素為機關進行測量。

用于與固定功能通信的這些内置頂點着色器變量本質上使用以下類型聲明:

highp vec4 gl_Position; // 應該被寫入

mediump float gl_PointSize; // 可能被寫入

如果未寫入任何這些變量,則其值未定義。在寫入之後,着色器可以回讀它們,以檢索寫入的内容。在寫入它們之前讀取它們會導緻傳回未定義的值。如果它們被寫入多次,則它是後續操作所使用的最後寫入的值。

這些内置變量具有全局範圍。

7.2 片段着色器特殊變量

片段着色器的輸出由OpenGL ES管道後端的固定功能操作處理。除非執行discard關鍵字,否則片段着色器使用内置變量gl_FragColor和gl_FragData将值輸出到OpenGL ES管道。

片段着色器不需要寫入gl_FragColor或gl_FragData。 有許多算法,例如陰影卷,包括不寫入顔色值的渲染過程。

這些變量可以在片段着色器中多次寫入。如果是,則配置設定的最後一個值是在後續固定功能管道中使用的值。寫入這些變量的值可以在寫入後回讀。 在寫入這些變量之前從這些變量中讀取會導緻未定義的值。

寫入gl_FragColor指定将由後續固定功能管道使用的片段顔色。如果後續的固定功能使用片段顔色并且片段着色器的執行沒有向gl_FragColor寫入值,則消耗的片段顔色未定義的。

變量gl_FragData是一個數組。 寫入gl_FragData [n]指定将由後續固定功能管道用于資料n的片段資料。如果後續固定功能使用片段資料并且片段着色器的執行不向其寫入值,則消耗的片段資料是未定義的。

如果着色器靜态為gl_FragColor指派,則它可能不會為gl_FragData的任何元素指派。如果着色器靜态地将值寫入gl_FragData的任何元素,則它可能不會為gl_FragColor指派。也就是說,着色器可以将值配置設定給gl_FragColor或gl_FragData,但不能同時配置設定兩者。

(着色器包含對變量x的靜态指派,如果在預處理之後,着色器包含将寫入x的語句,則運作時控制流是否會導緻執行該語句。)

如果着色器執行discard關鍵字,則丢棄該片段,并且gl_FragColor和gl_FragData的值變得無關緊要。

變量gl_FragCoord可用作片段着色器中的隻讀變量,它儲存片段的視窗相對坐标x,y,z和1 / w值。此值是固定功能的結果,該功能在頂點處理之後插入基元以生成片段。 z分量是将用于片段深度的深度值。

片段着色器可以通路隻讀内置變量gl_FrontFacing,如果片段屬于前向基元,則其值為true。其中一個用途是通過選擇由頂點着色器計算的兩種顔色中的一種來模拟雙面照明。

片段着色器可以通路隻讀内置變量gl_PointCoord。gl_PointCoord中的值是二維坐标,訓示目前片段位于點基元内的位置。它們的範圍從0.0到1.0。 這在OpenGL規範2.0版的3.3.1基本點光栅化中有更詳細的描述,其中讨論了點精靈。如果目前基元不是一個點,那麼從gl_PointCoord讀取的值是未定義的。

可以從片段着色器通路的内置變量本質上是給定的類型,如下所示:

mediump vec4 gl_FragCoord;

 bool gl_FrontFacing;

mediump vec4 gl_FragColor;

mediump vec4 gl_FragData[gl_MaxDrawBuffers];

mediump vec2 gl_PointCoord;

但是,它們的行為不像沒有存儲限定符的變量; 他們的行為如上所述。

這些内置變量具有全局範圍。

7.3 頂點着色器内置屬性

OpenGL ES中沒有内置屬性名稱。

7.4 内建常量

以下内置常量提供給頂點和片段着色器。

//

// 依賴于實作的常量。 以下示例值是這些最大值們所允許的最小值。

//

const mediump int gl_MaxVertexAttribs = 8; 

const mediump int gl_MaxVertexUniformVectors = 128;

const mediump int gl_MaxVaryingVectors = 8; 

const mediump int gl_MaxVertexTextureImageUnits = 0; 

const mediump int gl_MaxCombinedTextureImageUnits = 8;

const mediump int gl_MaxTextureImageUnits = 8; 

const mediump int gl_MaxFragmentUniformVectors = 16;

const mediump int gl_MaxDrawBuffers = 1; 

7.5 内置統一狀态

作為通路OpenGL ES處理狀态的輔助手段,OpenGL ES着色語言中内置了以下統一變量。 所有符号都是對2.0規範的引用。如果實作不支援片段語言中的highp精度,但是狀态列為highp,則該狀态将僅作為片段語言中的mediump提供。

//

// 視窗坐标的深度範圍

//

struct gl_DepthRangeParameters {

 highp float near; // n

 highp float far; // f

 highp float diff; // f - n

};

uniform gl_DepthRangeParameters gl_DepthRange;

OpenGL ES着色器語言規範 7 内建變量7 内建變量

Android,OpenGL ES,圖形學

繼續閱讀