2012-03-06 77 views
0

我想用cg編寫着色器(用於ogre3d)。我似乎無法解析我想用作我自己代碼的起點的有效着色器。cg着色器參數

這裏的着色器的聲明:

void main 
(
    float2 iTexCoord0 : TEXCOORD0, 

    out float4 oColor : COLOR, 

    uniform sampler2D covMap1, 
    uniform sampler2D covMap2, 
    uniform sampler2D splat1, 
    uniform sampler2D splat2, 
    uniform sampler2D splat3, 
    uniform sampler2D splat4, 
    uniform sampler2D splat5, 
    uniform sampler2D splat6, 

    uniform float splatScaleX, 
    uniform float splatScaleZ 
) 
{...} 

我的問題:

iTexCoord0顯然是一個輸入參數。爲什麼沒有宣佈統一? (oColor顯然是一個輸出參數毫無疑問)

covMap1 - splat6的紋理。這些參數或東西加載到圖形卡的內存(如全局變量)?着色器程序的怪物定義不會將它們列爲參數。

splatScaleX和splatScaleZ還有參數嗎?着色器程序的怪物定義也沒有列出這些參數。

從外部程序發送值時,聲明的順序是否意味着什麼?

我想float數組(高度圖)通過。我認爲這將是

uniform float splatScaleZ, 
    uniform float heightmap[1024] 
) 
{...} 

如果我不通過將着色器只是沒有被執行的參數之一(和我的對象將是不可見的,因爲它沒有紋理)?

有沒有更好的方式來調試這些比只是命中/錯過和猜測?

回答

3

iTexCoord0顯然是一個輸入參數。爲什麼沒有宣佈統一?

制服是不一樣的東西作爲輸入參數。 iTexCoord是一個變化的輸入,也就是說,對於每個頂點,它可以具有唯一的值。這是用像glVertexAttribPointer命令設置的。像頂點座標,法線,texcoords,頂點顏色等東西都是您可能使用變化輸入的示例。

制服是另一方面旨在是在程序的整個幀或靜態壽命爲整個繪圖調用,或潛在。它們設置爲glUniform *命令。制服可能類似於對象的模型視圖矩陣,或者用於照明計算的太陽位置。他們不經常改變。

[編輯]這些特定的命令我認爲實際上GLSL工作,但理論上應該是CG相同。查找一個cg特定的教程來找出確切的命令來設置變化和制服。

covMap1 - splat6的紋理。這些參數或東西加載到圖形卡的內存(如全局變量)?着色器程序的怪物定義不會將它們列爲參數。

我的CG是有點生疏,但如果它一樣GLSL那麼sampler2d是一致的是需要代表你想從採樣其採樣器的索引。當你做一些像glActiveTexture(GL_TEXTURE3),glBindTexture(n)這樣的事情時,你可以將採樣器統一設置爲「3」,你可以從該紋理中採樣。

從外部程序發送值時,聲明的順序是否意味着什麼?

不,這些變量在外部程序中通過它們的字符串變量名引用。

如果我沒有通過其中一個參數,那麼着色器就不會被執行(並且我的對象將因爲沒有紋理而不可見)?

未知。他們可能會有「一些」初始價值,儘管這是否有意義,並會產生任何可見的東西很難猜測。

有沒有更好的方法來調試這些比只是命中/錯過和猜測?

http://http.developer.nvidia.com/CgTutorial/cg_tutorial_appendix_b.html 見部分B.3.8

+0

它而努力學習這一點,我不會有詞彙來搜索答案發生在我身上。我不得不問,或者只是讀一些我能找到的東西,希望能夠找到答案。謝謝! – Jay 2012-03-06 12:57:52