无法在三星设备上分配变化[OpenGL ES]

时间:2015-09-01 08:39:59

标签: android opengl-es fragment-shader

在三星设备上编辑模糊着色器失败,并显示错误:无法分配更改

着色器代码如下:

#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()
{
     ...
}

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

2 个答案:

答案 0 :(得分:4)

您似乎只是超出了实施所支持的变化数量。可以使用以下方式查询变化矢量的最大数量:

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

合规实施的最低要求限制为8.这意味着支持至少8种类型vec4的变更。

您的案例很有意思,因为您总共使用了16种vec2类型的变体。您可能认为这将适合8 vec4个值的空间,因此应该适用于所有设备。但它比那更复杂。

关于这个主题的毛茸茸的细节可以在GLES 1.00规范的第111页开始的附录A.7中找到,标题为"计算变量和制服"。它是关于2.5页非常技术性的描述,我在这里无法重复。但实质上,它描述了一种可能的打包算法,实现可以在兼容时使用。他们可以使用更有效的包装,但他们没有必要。

此打包算法中适用于您的案例的一个关键部分如下:

  

向量总是占用一行中的寄存器。数组的元素必须位于不同的行中。例如。 vec4总是占据一排; float [8]将占据一列。由于不允许拆分变量,大型数组,例如......用于变换,因此使用此算法,float [16]将始终失败。

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

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

答案 1 :(得分:1)

这个问题确实帮助了我。

我最后拆开阵列并且工作正常:

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;