OpenGL ES手冊翻譯---3.柵格化(四)

3.8 碎片著色器

接下來的應(yīng)用到碎片的操作,是用柵格化點(diǎn),線段,多邊形之后的結(jié)果,通過使用碎片著色器來繼續(xù)進(jìn)行的。

一個(gè)碎片著色器定義為一個(gè)包含著描述操作的源代碼的字符串?dāng)?shù)組,這些操作會(huì)作用在每個(gè)柵格化點(diǎn),線段,多邊形的結(jié)果的碎片上。碎片著色器使用的語言在OPenGL ES著色器語言規(guī)范中會(huì)有詳細(xì)介紹。

或者,碎片著色器也可以通過預(yù)編譯的二進(jìn)制碼定義,和在2.10節(jié)中介紹的頂點(diǎn)著色器使用相同的方法。

碎片著色器如在2.10.1節(jié)中描述的那樣創(chuàng)建,設(shè)置參數(shù)typeFRAGMENT_SHADER即可。如果2.10.3節(jié)中介紹的一樣,他們會(huì)被附著在program對象上并被program對象使用。

GL中正在使用的program對象上附著的碎片著色器被認(rèn)為是活躍的,通常被用來處理碎片。如果當(dāng)前沒有正在被使用的program對象,碎片著色器的執(zhí)行結(jié)果是無定義的。

3.8.1 著色器變量

碎片著色器可以訪問屬于當(dāng)前著色器對象的uniform變量。碎片著色器的uniform變量的可用的存儲(chǔ)數(shù)量通過依賴于實(shí)現(xiàn)的常量MAX_FRAGMENT_UNIFORM_VECTORS來指定。其值表示一個(gè)四元素的浮點(diǎn)指針,整數(shù),或者布爾向量,這些值可以填充碎片著色器的uniform變量的存儲(chǔ)空間。如果嘗試使用比碎片著色器uniform變量更多的空間將會(huì)產(chǎn)生鏈接錯(cuò)誤。

碎片著色器可以讀由柵格化產(chǎn)生的碎片的屬性相應(yīng)的varying變量。OpenGL ES著色器語言規(guī)范定義了一系列的內(nèi)建的varying變量,他們可以被碎片著色器訪問。這些內(nèi)建的varying變量包括碎片的位置,視角的z坐標(biāo)和朝前面的標(biāo)志。

image

一個(gè)頂點(diǎn)著色器可能會(huì)定義一個(gè)或者多個(gè)varying變量(見2.10.4節(jié)和OpenGL ES著色器語言規(guī)范)。這些值在圖元上被插值,渲染。在碎片著色器中定義相同名字的varying變量時(shí),這些插值的結(jié)果才是適用的。

3.8.2 著色器執(zhí)行

如果碎片著色器是活躍的,用碎片著色器的可執(zhí)行版本來處理點(diǎn),線段,多邊形柵格畫的結(jié)果值。

  • 紋理訪問

當(dāng)紋理查找表在碎片著色器中執(zhí)行時(shí),GL計(jì)算濾波紋理值\tau,如果按照3.7.7和3.7.8中描述的方式,然后根據(jù)表3.12將它轉(zhuǎn)換為紋理的源的顏色C_s。GL給碎片著色器返回了一個(gè)四通道的向量(R_s,G_s,B_s,A_s)。由于細(xì)節(jié)等級計(jì)算的目的,導(dǎo)數(shù)\frac{du}{dx},\frac{du}{dy},\frac{dv}{dx},\frac{dv}{dy},\frac{dw}{dx},\frac{dw}{dy}可能會(huì)被一個(gè)不一樣的算法近似,詳細(xì)的會(huì)在OpenGL ES著色器語言指南8.8節(jié)中介紹。

如果下面的任何一個(gè)條件成立時(shí),從碎片著色器中調(diào)用一個(gè)采樣器將會(huì)返回(R,G,B,A)= (0,0,0,1):

  • 當(dāng)一個(gè)二維的采樣器被調(diào)用時(shí),縮小濾波器要求一個(gè)mipmap(既不是NEAREST也不是LINEAR),采樣器對應(yīng)的紋理對象不完整,如果3.7.1和3.7.10中定義的那樣。
  • 當(dāng)一個(gè)二維采樣器被調(diào)用時(shí),縮小濾波器不需要mipmap(既不是NEAREST也不是LINEAR),對應(yīng)紋理對象的0級陣列的維度不是正的。
  • 當(dāng)一個(gè)二維采樣器被調(diào)用時(shí),對應(yīng)的紋理圖像不是2的冪指數(shù)的圖像(如同3.7.7接種關(guān)于Mipmapping的討論中介紹過),紋理包裹模式不是CLAMP_TO_DEGE,縮小濾波器也不是NEAREST或者LINEAR。
  • 一個(gè)立方體貼圖采樣器被調(diào)用時(shí),對應(yīng)的紋理圖像不是2的冪指數(shù)圖像,紋理包裹模式不是CLAMP_TO_EDGE模式,縮小濾波器不是NEAREST或者LINEAR。
  • 一個(gè)立方體貼圖采樣器被調(diào)用時(shí),對應(yīng)的立方體貼圖紋理不是完整的立方體,TEXTURE_MIN_FILTER需要mipmap但是紋理不是完整的mipmap立方體。

分離的紋理單元的數(shù)目被依賴實(shí)現(xiàn)的常量MAX_TEXTURE_IMAGE_UNITS指定,這些紋理單元可以在基本圖元的渲染期間在碎片著色器中被訪問。

  • 著色器輸入

OpenGL ES著色器語言指南描述了適合作為碎片著色器輸入的值。

內(nèi)建變量gl_FragCoord維持著碎片的窗口坐標(biāo)x,y,z,\frac{1}{w}gl_FragCoord的z通道經(jīng)歷了到浮點(diǎn)指針的隱式轉(zhuǎn)換。這個(gè)轉(zhuǎn)換比如保留0和1不變。注意,如果允許的話,這個(gè)z通道已經(jīng)添加了一個(gè)多邊形的偏移量。(見3.5.2節(jié),\frac{1}{w}值從w_c坐標(biāo)中計(jì)算得到。(見2.12節(jié)))。

內(nèi)建變量gl_FrontFacing在碎片是由面朝前的圖元產(chǎn)生式,設(shè)置為true,否則設(shè)置為false。對于多邊形圖元產(chǎn)生的碎片,則是由通過3.5.1節(jié)中的3.4等式計(jì)算的面積的符號計(jì)算決定的(包括由函數(shù)FrontFace控制后可能會(huì)發(fā)生的符號的逆轉(zhuǎn))。如果符號是正的,圖元產(chǎn)生的碎片是面朝前的;否則,他們是背朝前的。所有其他的碎片都被認(rèn)為是面朝前的。

  • 著色器輸出

OpenGL ES著色器語言指南介紹了可以被碎片著色器當(dāng)做輸出的值。就是gl_FragColorgl_FragData[0]。在碎片著色器中的最終的碎片顏色值或者最終的碎片數(shù)據(jù)值都限制在[0,1]范圍內(nèi),然后入2.1.2中描述的那樣為了幀緩沖的顏色組件而被轉(zhuǎn)換成修正指針類型。

gl_FragColor或者gl_FragData[0]寫數(shù)據(jù)就是制定了碎片的顏色(顏色數(shù)字為0),這些顏色會(huì)被用在渲染管線的接下來的階段。和碎片有關(guān)的任何顏色,顏色通道如果不是寫在碎片著色器中,將是無定義的。碎片著色器不會(huì)靜態(tài)的給gl_FragColorgl_FragData[0]賦值。這種情況下,將會(huì)導(dǎo)致編譯或者鏈接錯(cuò)誤。如果在預(yù)處理后,著色器包含了將會(huì)寫入變量的聲明,不論運(yùn)行時(shí)的控制流是否會(huì)導(dǎo)致聲明被執(zhí)行,著色器都會(huì)被靜態(tài)的給變量分配值。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容