2014-12-20 58 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有权拒绝接受您的代码。

相关问题