【发布时间】: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是变换矩阵的个数(所以matrix.length() = 10 * 16 = 160)
matrix 是包含所有转换数据的 float[] 变量
而0是矩阵中的偏移量
我试图增加计数变量以解决它,但没有成功。
产生此错误的 google 源代码位于:
这些特定的行进行检查并抛出上述错误:
_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 个元素。