2013-08-24 71 views
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?對我來說聽起來不合適。片段着色器應該在運行時失敗。

+1

確切位置在哪裏,你會喜歡的OpenGL產生一個無效操作?着色器不像其他API函數那樣進行評估; GLSL編譯器的靜態分析能夠檢測出你使用的是超出範圍的樣本,而這可能永遠不會發生。它可能在運行時「失敗」,它只是在這種情況下的行爲是未定義的,所以在此之後發生的任何事情在技術上是正確的:P –

+0

至少如果不是無效的操作錯誤,我期望顏色輸出是垃圾或全部在這種情況下i> = 8時,零(0,0,0,0)。或至少當我> = GL_MAX_SAMPLES。 – viktorzeid

+0

是的,你不應該期望這些東西。當需要移植軟件的時候,你會被燒得更多 - 未定義的行爲通常只有在不同的實現行爲不同時纔會知道。 –

回答

2

我應該指出,通常情況下超出範圍的緩衝區訪問在OpenGL中有未定義的行爲。然而,隨着OpenGL 4.x爲提高健壯性而推出,有一個擴展可以讓你在這些情況下定義行爲。

GL_ARB_robust_buffer_access_behavior

這種擴展的工作原理是通過一個新的標誌,當你創建它,然後緩衝區,超出範圍的訪問將導致在明確規定的值的OpenGL上下文。

在你的情況下,texelFetch (...)是超出範圍將返回vec4 (0.0, 0.0, 0.0, 0.0)