在三星设备上分配变量失败[OpenGL ES]



在三星设备上编译模糊着色器失败,错误:Failed to allocate changes

着色器代码如下:
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 v_texCoord;
varying vec2 v_blurTexCoords[14];
varying vec2 pixel_size;
uniform vec2 v_resolution;
uniform sampler2D u_texture;
uniform mat4 u_projTrans;
void main()
{
     ...
}

在其他设备上运行良好,三星设备可能有什么问题?

看起来您只是超出了实现所支持的变量数量。可使用以下命令查询变化向量的最大数目:

GLint maxVarying == 0;
glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVarying);

兼容实现的最小要求限制是8。这意味着至少支持8种类型的vec4

您的案例很有趣,因为您总共使用了16种vec2类型的变体。您可能认为这将适合8个vec4值的空间,因此应该在所有设备上工作。但实际情况远比这复杂。

关于这个主题的细节可以在附录A.7中找到,从gles1.00规范的第111页开始,标题为"变化和制服的计数"。大概有2.5页的技术性描述在这里我就不赘述了。但本质上,它描述了一种可能的打包算法,实现可以在兼容的情况下使用。他们可以使用更有效包装的东西,但他们不必这样做。

适用于您的情况的这个打包算法的一个关键部分如下:

向量总是占用单行寄存器。数组的元素必须在不同的行中。例如,vec4总是占用一行;Float[8]将占用一列。由于不允许拆分变量,大型数组例如…对于变量,float[16]在此算法中总是失败。

这意味着对于只支持8个不同向量的实现,并且使用这个兼容的算法,您可以而不是适合14个vec2值的数组。它可以容纳16个类型为vec2的单个值。或者,如果我正确理解规范,例如一个包含8个vec2值和8个vec2类型的单个值的数组。但是没有一个数组的大小大于8。

对于你的着色器安全编译,你将需要一个实现,为GL_MAX_VARYING_VECTORS限制返回至少14。

这个问题真的帮了我大忙。

我将数组拆分,它工作得很好:

varying vec2 v_blurTexCoords0;
varying vec2 v_blurTexCoords1;
varying vec2 v_blurTexCoords2;
varying vec2 v_blurTexCoords3;
varying vec2 v_blurTexCoords4;
varying vec2 v_blurTexCoords5;
varying vec2 v_blurTexCoords6;
varying vec2 v_blurTexCoords7;
varying vec2 v_blurTexCoords8;
varying vec2 v_blurTexCoords9;
varying vec2 v_blurTexCoords10;
varying vec2 v_blurTexCoords11;
varying vec2 v_blurTexCoords12;
varying vec2 v_blurTexCoords13;

最新更新