GLSL(OpenGL ES2)的“整数常量溢出”

时间:2011-01-26 17:36:09

标签: iphone opengl-es glsl shader opengl-es-2.0

我需要在不使用OpenGL纹理的情况下将纹理数据传递给着色器程序,因为我没有使用两种纹理的功能,但我得到了这个片段着色器的错误。

varying highp vec2 texcoord;
uniform ivec4 texdata[172800];
void main(){
 int pixel = int(360.0 * texcoord.y + texcoord.x);
 gl_FragColor = vec4(texdata[pixel].x,texdata[pixel].y,texdata[pixel].z,1);
}

如何传递此数据?

3 个答案:

答案 0 :(得分:4)

OpenGL / ES 2规范只要求GLSL整数至少为17位(能够表示范围[-2 ^ 16,2 ^ 16)),并且整数用于数组索引,所以你不能可靠地创建一个包含超过65535个元素的数组。在任何情况下,您可能无法创建一个大的,因为统一数据的总量可能要低得多。如果要访问大量数据,则需要使用纹理。

此错误可能来自您的整数常量172800,这对于您的平台的GLSL实现来说显然太大了。

答案 1 :(得分:2)

实际上,支持OpenGL ES 2.0的较新iOS模型能够使用非二次幂纹理,因为OpenGL ES 2.0规范中提供了这种模式。这些设备还允许通过GL_APPLE_texture_2D_limited_npot扩展在OpenGL ES 1.1中使用非二次幂纹理,我在答案here中对此进行了更详细的描述。

Apple对这些非二次幂纹理的限制是它们不能被mipmap,并且必须使用GL_CLAMP_TO_EDGE进行包装:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

我在OpenGL ES 2.0示例应用程序here中使用了这样的纹理。

您不需要找到另一种方法将纹理传递到这些设备上的着色器。

答案 2 :(得分:0)

有2个非幂2纹理目标,所以没有理由这样做。 http://www.opengl.org/registry/specs/ARB/texture_rectangle.txt

或者您只需将非2次幂数据填充为2的幂格式。