0
假設我創建了包含8個採樣的多采樣紋理。如何從多采樣紋理獲取紋理超出其樣本數量
我的片段着色器是
out vec4 color;
uniform sampler2DMS tex;
in vec2 txcoords;
void main()
{
vec4 col;
ivec2 txSize = ivec2(textureSize(tex)* txcoords);
for(int i=0;i<8;i++)
col += texelFetch(tex, txSize, i);
color = col/8;
}
這工作得很好。 但是如果我更換了循環以上
for(int i=10050;i<10058;i++)
這仍然有效。 (通過作品,我的意思是我仍然得到正確的形象)
爲什麼?不應該OpenGL產生了一個無效的操作錯誤。
同樣,即使紋理有8個樣本,我仍然可以獲取第9個樣本,如果我= 9?對我來說聽起來不合適。片段着色器應該在運行時失敗。
確切位置在哪裏,你會喜歡的OpenGL產生一個無效操作?着色器不像其他API函數那樣進行評估; GLSL編譯器的靜態分析能夠檢測出你使用的是超出範圍的樣本,而這可能永遠不會發生。它可能在運行時「失敗」,它只是在這種情況下的行爲是未定義的,所以在此之後發生的任何事情在技術上是正確的:P –
至少如果不是無效的操作錯誤,我期望顏色輸出是垃圾或全部在這種情況下i> = 8時,零(0,0,0,0)。或至少當我> = GL_MAX_SAMPLES。 – viktorzeid
是的,你不應該期望這些東西。當需要移植軟件的時候,你會被燒得更多 - 未定義的行爲通常只有在不同的實現行爲不同時纔會知道。 –