2014-07-19 22 views
6

我有一個_color統一着色器和一個採樣器。現在,如果採樣器沒有設置,我只想用_color繪製。有沒有什麼方法可以在着色器中找出我們的內容? (不幸的是,採樣器未分配時返回1,1,1,1,這使得通過阿爾法不可能將其混合)如何檢查採樣器在glsl中是否爲空?

回答

7

你不能那樣做。採樣器是一個不透明的手柄,它只引用一個紋理單元。我不確定規範是否保證(1,1,1,1)從未綁定紋理的單元進行採樣,或者如果這是未定義的行爲。

你可以做的只是使用另一種制服來使用採樣器或統一的顏色進行切換,或者只是使用不同的着色器並在它們之間切換。這裏也有子程序的可能性,但我不知道這是否是這樣一個簡單問題的正確選擇。

1

我偶然發現了這個試圖解決類似問題的問題。

由於GLSL 4.30

int textureQueryLevels(gsamplerX sampler); 

是一個內置的功能。在GLSL規範中。頁。 151它說

如果沒有紋理或不完整的紋理與採樣器關聯,則返回零值。

在OpenGL的形式,我發現這個問題的條目提示使用

ivecY textureSize(gsamplerX sampler,int lod); 

和測試,如果紋理尺寸大於零。但就我的理解而言,這是標準未涵蓋的內容。在OpenGL規範的部分11.1.3.4據說

如果計算出紋理圖像電平是在範圍[levelbase,Q],結果是不確定的外面...

編輯: 我只是在我的問題上試過這種方法,結果發現nvidia在這個函數中有一些問題,當沒有紋理被綁定時導致非零值。 (見2015年的nvidia bug report