Cg語言中文說明文檔(二)

聲明及聲明修飾符

Cg程序有一系列的聲明構成,每個聲明由一個或多個函數或變量構成。每個聲明,有零個或多個聲明修飾符,類型,一個或多個聲明組成。一些修飾符和標準C一樣,一些是Cg中特有的

const

變量被定義成常量的話,在程序中,就不能再對該變量賦值,除非const和uniform,varying一起使用。const修飾的變量,需要在聲明時給予一個初始值

extern

extern表明聲明僅僅是聲明,而非定義。在程序中一定有一個地方存在一個非extern的對應的聲明

in

只在聲明參數,或是使用varying修飾符時使用。將參數,或是varying作爲函數或是程序的輸入值。函數參數如果沒有in,out,或者inout的話,隱式的默認爲in

inline

只在函數定義時有用,告訴編譯器始終對該函數採取內聯調用

inout

只在聲明爲參數和varying時使用,將參數或是varying聲明爲函數或是程序的輸入輸出值

static

只在聲明全局變量時使用,static將使變量對程序而言成爲私有的,外部不可見,不能和uniform,varying一起使用

out

只在聲明參數和varying時使用,將變量或varying定義爲函數或是程序的輸出值

uniform

用於全局變量和程序的入口函數的參數,用來定義constant buffers(常量緩存)。如果用於一個非入口函數的參數,它將被忽略。這樣做的目的是爲了使一個函數既能作爲入口函數,又能作爲非入口函數。uniform的變量可以像非uniform的變量那樣讀寫。uniform修飾符通過向外部語言提供一個機制,來提供變量的初始值是如何指定和保存的信息。

這段話的意思,結合前一篇文章中的說明,就是說uniform修飾的變量,其初始值不是由cg程序內部指定,而是由外部程序指定的。並且一旦指定後,在GPU的併發調用中,這段程序即使被多次調用,這個初始值還是不變的,直到外部程序改變了這個值。
即便初始值不變,但在這段cg程序執行內,這個uniform變量就和一般的變量讀寫沒有區別了

注:這個外部程序是指當前編譯後,並執行的入口函數及其調用程序以外的不相關的程序。比如說我們編譯了一段cg代碼,其中有一個入口函數,和N個被調用函數,那麼我們編譯的另一段cg代碼,或者我們使用c等語言編寫的調用這段cg程序的代碼,就是外部程序

varying

只用於程序的頂層main函數的參數,或是全局變量。如果用於非頂層函數,將被忽略

profile name

任何profile的名字,或是通配符可以在任何函數的聲明之前指定。限定了函數只在對應的profile中可見

uniform和varying

uniform和varying修飾符,指定了一段Cg程序和外部程序之間的數據傳遞的方式。典型的,一個uniform變量或是參數的初始值被存儲與不同的硬件寄存器類中來表示一個varing變量。進一步的,外部機制指定的uniform的變量或是參數的初始值的方式不同與對varying變量或是參數的初始值。使用uniform修飾的參數通常看成是永久狀態,而varying看成是流狀態數據,每條流記錄都有一個新的值

非靜態的全局變量默認是uniform的,頂層函數的參數,默認是varying

老實說,原文的這一段關於uniform和varying的說明很晦澀,結合先前提到的對uniform的解釋,我目前理解這段內容表述的是(有可能過幾天我理解深入了,就會重新寫,哈哈,表扔我雞蛋)
uniform可以保證在不同的代碼執行中,數據的初始值是保持不變的。如果要使這個值變化,那只有將初值值保存在不同的硬件寄存器中。那麼,這種情況可能出現在這段cg代碼正運行於不同的渲染階段。不同的渲染階段,其使用的硬件不同,因此這時對該值進行的值纔會不同。而varying則相反,即時在同一渲染階段,隨着輸入的數據不同,值就發生變化。

每個聲明在其聲明點到封閉塊的結尾是可見的,或是如果其在塊外部,則到該段編譯對象結尾是可見的。在有命名的範圍(比如結構,接口)中的聲明,如果使用顯示的範圍修飾符可以在其範圍外可見,這個和C++類似

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章