1

我需要在不使用 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);
}

我怎样才能传递这些数据?

4

3 回答 3

4

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

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

于 2011-01-26T18:06:32.787 回答
2

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

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 示例应用程序中使用此类纹理。

您不需要寻找其他方法将纹理传递到这些设备上的着色器。

于 2011-01-26T22:05:22.237 回答
0

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

或者您只需将非 2 次幂数据填充到 2 次幂帧中。

于 2011-01-26T17:56:18.693 回答