2014-01-09 83 views
6

當GLSL採樣紋理是這樣的:OpenGL的採樣,沒有質感結合

vec4 color = texture(mySampler, myCoords); 

如果沒有質感勢必mySampler顏色似乎總是(0,0,0, 1)。

這是標準行爲嗎?或者在某些實現中可能是undefined?我在規格中找不到任何東西。

+0

請參閱http://stackoverflow.com/questions/12570379/opengl-es-2-0-glsl-texture2d-return-value-when-unbound。我無法找到規範中的任何內容,但據我所知它是未定義的。我已經看到它在不同的實現中做了不同的事情! –

回答

5

這確實爲「綁定」沒有這樣的事 - 你只是綁定到哪個被稱爲紋理0。根據維基的OpenGL(http://www.opengl.org/wiki/OpenGL_Objects)初始紋理對象,

You are strongly encouraged to think of texture 0 as a non-existent texture. 

最終,您將在着色器中獲得的值取決於當時Texture對象0中發生的情況。我真的不能找到除了一個forum post東西,實際上說,這應該是什麼:

The texture 0 represents an actual texture object, the default texture. 
All textures start out as 1x1 white textures. 

我當然不會相信,要在所有GPU驅動程序相一致,你可能有它初始化爲全零,或者它可能會被認爲是一個不完整的質地,在這種情況下的OpenGL規範(2.0及更高版本至少)說:

If a fragment shader uses a sampler whose associated texture object is not 
complete, the texture image unit will return (R, G, B, A) = (0, 0, 0, 1). 

...所以,真正行動的最明智的做法似乎是「不這樣做。 「如果你要運行一個採樣器,確保你有一個有效的(非零id)紋理。

+1

其實我只用vec3測試過(它是(0,0,0)),所以也許最後一個組件實際上是1. – Jerem

+2

我會覺得比實際的規範而不是opengl.org的wiki更引人矚目但是,這更好,我發現我自己。謝謝。 – Jerem

+0

@JeremyLaumon是的,我查看了規範,找不到它:(可能是其他人可以的。) –

2

內森是正確的(但我太新/名聲太低而無法投票)。

我已經/當然/看到在某些OpenGL ES平臺上,使用未綁定紋理會在屏幕上顯示亂碼(隨機內存的圖形內存)。你不能相信所有的驅動程序供應商遵循規範。

永遠不會引用未綁定的OpenGL對象或狀態。