【问题标题】:android, strange error in opengles 2.0 calling glUniformMatrix4fv(uMatrixLocation, 10, false, matrix, 0)android,opengles 2.0调用glUniformMatrix4fv(uMatrixLocation,10,false,matrix,0)中的奇怪错误
【发布时间】:2014-01-14 11:44:53
【问题描述】:

在某些设备上(到目前为止,三星 Galaxy Note 2 和 3 + Xperia Z1)我通过调用 glUniformMatrix4fv(uMatrixLocation, 10, false, matrix, 0) 来设置转换矩阵而引发此错误。

错误是:

java.lang.IllegalArgumentException: length - offset < count*16 < needed
    at android.opengl.GLES20.glUniformMatrix4fv(Native Method)

这是由我的 textureShaderProgram 代码中的这一行引起的:

glUniformMatrix4fv(uMatrixLocation, 10, false, matrix, 0);

uMatrixLocation是矩阵var的位置指针 10是变换矩阵的个数(所以ma​​trix.length() = 10 * 16 = 160) matrix 是包含所有转换数据的 float[] 变量 而0是矩阵中的偏移量

我试图增加计数变量以解决它,但没有成功。

产生此错误的 google 源代码位于:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/jni/android_opengl_GLES20.cpp

这些特定的行进行检查并抛出上述错误:

   _remaining = _env->GetArrayLength(value_ref) - offset;
   if (_remaining < count*16) {
       _exception = 1;
       _exceptionType = "java/lang/IllegalArgumentException";
      _exceptionMessage = "length - offset < count*16 < needed";
      goto exit;
   }

关于这些设备为什么会抛出错误的任何线索? 这些设备上的 cpp 文件会与其他设备不同吗?

添加 20140114 18:47 这些是在矩阵变量中传递给glUniformMatrix4fv(uMatrixLocation, 10, false, matrix, 0) 的浮点值:

my float is: 0.5625
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 1.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: -1.0
my float is: 0.0
my float is: 0.0
my float is: -0.8425926
my float is: 0.0
my float is: 1.0
my float is: 0.5625
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 1.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: -1.0
my float is: 0.0
my float is: 0.098958336
my float is: -1.1574074
my float is: 0.0
my float is: 1.0
my float is: 0.5625
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 1.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: -1.0
my float is: 0.0
my float is: -0.296875
my float is: -1.1574074
my float is: -0.0
my float is: 1.0
my float is: 0.5625
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 1.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: -1.0
my float is: 0.0
my float is: -0.098958336
my float is: -1.1574074
my float is: -0.0
my float is: 1.0
my float is: 0.5625
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 1.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: -1.0
my float is: 0.0
my float is: 0.296875
my float is: -1.1574074
my float is: 0.0
my float is: 1.0
my float is: 0.5625
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 1.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: -1.0
my float is: 0.0
my float is: 0.9010416
my float is: -0.8240741
my float is: 0.0
my float is: 1.0
my float is: 0.5625
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 1.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: -1.0
my float is: 0.0
my float is: 0.9010416
my float is: 0.8240741
my float is: 0.0
my float is: 1.0
my float is: 0.5625
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 1.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: -1.0
my float is: 0.0
my float is: 0.9010416
my float is: 0.0
my float is: 0.0
my float is: 1.0
my float is: 0.5625
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 1.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: 0.0
my float is: -1.0
my float is: 0.0
my float is: 0.0
my float is: -1.1574074
my float is: 0.0
my float is: 1.0

这是我的顶点着色器:

uniform mat4 u_Matrix[10]; 

attribute lowp float a_MatrixIndex;

attribute vec4 a_Position;  
attribute vec2 a_TextureCoordinates;
attribute vec3 a_Color;

varying vec3 v_Color;
varying vec2 v_TextureCoordinates;

void main()                    
{                    
v_Color = a_Color;        
int MatrixIndex = int(a_MatrixIndex);

    v_TextureCoordinates = a_TextureCoordinates;          
    gl_Position = u_Matrix[MatrixIndex] * a_Position;    
}

【问题讨论】:

  • 检查您发送到着色器或绘制方法中的类型。
  • 你好,deathember,看看我在原帖中添加的内容。你能看到任何奇怪的浮点值吗(我看不到),也许某些设备无法处理我发送的浮点数的精度?
  • 为什么你认为浮点数包含 16 个字节? (matrix.length() = 10 * 16 = 160))
  • 对不起,我的拼写错误... Matrix 是一个 float[] 数组。它由几个包含 16 个浮点分量的矩阵组成。实际上我的矩阵 float[] 数组长度是 144,根据错误消息,它应该被比较并且不如 count * 16 = 160 所以我不明白错误消息。 (以及为什么它只出现在某些手机型号上)
  • 是的,但您定义的矩阵有 10 个元素。

标签: android opengl-es matrix


【解决方案1】:

如果 matrix1 是包含浮点值的对象,则需要将其转换为如下所示的数组。

context.uniformMatrix4fv(loc, false, new Float32Array(matrix1.getAsArray()) );

【讨论】:

  • 我的矩阵变量实际上是 float[] 类型,这是 uniformMatrix4fv 方法的预期类型“Open Declaration void android.opengl.GLES20.glUniformMatrix4fv(int location, int count, boolean transpose, float [] 值,整数偏移)"
【解决方案2】:

现在已经解决了。问题实际上是在 Android > 4.2 上的实现:

glUniformMatrix4fv(uMatrixLocation, count, false, matrix, 0);

必须已更改。 计数变量必须与矩阵变量内的变换矩阵的“数量”完全匹配。 (正如deathember在上面的一条评论中暗示的那样)

所以解决方案就是将一个计数变量传递给这个函数,而不是硬编码它。

您仍然可以使用相同的 texture_vertex 代码!! 就我而言,它看起来像这样: (虽然我用这个程序处理长度为 1 到 9 的矩阵数组,你可以在这里设置最大的矩阵数)

uniform mat4 u_Matrix[9]; 

attribute lowp float a_MatrixIndex;

attribute vec4 a_Position;  
attribute vec2 a_TextureCoordinates;
attribute vec3 a_Color;

varying vec3 v_Color;
varying vec2 v_TextureCoordinates;

void main()                    
{                    
v_Color = a_Color;        
int MatrixIndex = int(a_MatrixIndex);

    v_TextureCoordinates = a_TextureCoordinates;          
    gl_Position = u_Matrix[MatrixIndex] * a_Position;    
}

如果你想了解更多我是如何测试这个的,你可以在这里查看我的博客:

Android device fragmentation, it finally happened

【讨论】:

  • 我遇到了同样的错误。我尝试传递一个计数变量,但没有用。
猜你喜欢
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多