2014-12-20 98 views
1

我有一個片段着色器,將顏色降採樣爲4種不同的顏色。 要做到這一點,我計算基於從0變化到3。 顏色索引然後我查找在vec4的均勻陣列的最終顏色的值:OpenGL ES 2.0中統一陣列中的片段着色器讀取值

陣列的聲明:

uniform vec4 u_colors[4]; 

查找:

gl_FragColor = u_colors[int(index)]; 

這非常適用於一些設備,但在某些設備(在Tegra的4個這樣的)似乎我不能用可變訪問數組,並且輸出是垃圾。唯一的變通,我發現是這樣的:

index = floor(index); 
if (index < 2.0) { 
    if (index == 0.0) { 
    gl_FragColor = u_colors[0]; 
    } else { 
    gl_FragColor = u_colors[1]; 
    } 
} else { 
    if (index == 2.0) { 
    gl_FragColor = u_colors[2]; 
    } else { 
    gl_FragColor = u_colors[3]; 
    } 
} 

這工作,和令人驚訝的表現還是相當不錯的,但它顯然並不理想。

我做錯了什麼或者這是GPU驅動程序/編譯器中的錯誤?我有什麼有效的替代品?

回答

2

GLSL ES 1.00OpenGL ES 2.0spec具有這一行:

制服(不包括採樣器)

在頂點着色器,支持所有形式的數組索引是 授權。在片段着色器中,索引支持僅支持 ,因此需要使用常量索引表達式。

大多數驅動程序在片段着色器中實現此功能,但並非必需,所以Tegra 4有權拒絕接受您的代碼。

相關問題