2013-04-11 75 views
2

我有一個有故意的語法錯誤的GLSL片段着色器。爲什麼GLSL代碼編譯和鏈接,即使它有語法錯誤?

void main() 
{ 
    // vec4 is ommitted 
    gl_FragColor = (1,1,0,1); 
} 

但我仍然可以編譯和鏈接它沒有錯誤。運行我的應用程序 後,屏幕上什麼都看不到。這是一種奇怪的行爲還是別的?

+0

我編輯了這個問題,試圖更好地格式化問題。如果您認爲它太多,請隨時回滾/編輯更改。 – Hydronium 2013-04-11 13:56:57

+1

哪個'#版本'是你的着色器,你在做什麼? (我在NVidia桌面GPU上得到了「從int到vec4的隱式投射」,用於「#version 130」....) – 2013-04-11 16:36:23

+0

GLSL版本:3.3,操作系統:Ubuntu 12.04LTS,顯卡:ATI Radeon 4650 – 2013-04-11 21:32:08

回答

5

您已使用逗號運算符。

您的代碼評估每一個逗號分隔號,並丟棄所有這些除了最後一個,這樣它等同於寫

gl_FragColor = (1); 

在括號只是進行分組,而不是一個函數調用,這樣可以忽略不計。當您分配一個值到一個向量它複製該值的所有組件,以便您的說法是一樣的書寫 -

gl_FragColor = vec4(1,1,1,1); 

是「背景」白?在這種情況下,你什麼都看不到。

+0

編號背景顏色是黑色的。 – 2013-04-11 14:11:02

+0

_當你給一個向量賦一個值時,它會將該值複製到所有的組件..._。實際上,GLSL規範沒有提到這一點,這也不適用於ATi卡。然而,NVidia似乎忽略了規範,並且代碼按照您的描述工作。 – Hannesh 2013-04-11 14:43:50

+0

嗯我在發佈之前檢查了這篇文章,因爲我不確定...至少我以爲我做了...檢查:) – jcoder 2013-04-11 14:50:03

相關問題