android,opengles 2.0中的奇怪错误调用gluniformmatrix4fv(umatrixLocation,10,false,false,矩阵,0)

问题描述 投票:0回答:2

在某些设备(到目前为止,三星Galaxy Note 2和3 + Xperia Z1)中,我通过呼叫GluniformMatrix4Fv(UmatrixLocation,10,false,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是转换矩阵的数量(so
matrix.length()= 10 * 16 =160 矩阵是float []可变性,包含所有转换数据 0是矩阵中的偏移量 我试图增加计数变量以解决它,但没有成功。 从Google生成此错误的Google源代码为:

https://android.googlesource.com/platform/frameworks/base/+/refs/refs/heads/master/core/jni/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文件可以与其他设备不同吗? ADDED 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; }

    

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

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

    
android opengl-es matrix
2个回答
0
投票
现在解决了这个问题。实际上是在Android上> 4.2实施:

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

必须改变。
计数变量必须与矩阵变量内的转换矩阵的“数字”完全匹配。 (正如Deathember在上面的一条评论中所暗示的)

因此,解决方案只是将计数变量传递给此函数而不是硬编码。 您仍然可以使用相同的texture_vertex代码! 就我而言,看起来像这样: (即使我将此程序用于长度为1到9的Matrice阵列,您也可以在此处设置最高的矩阵编号)

0
投票
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设备碎片,它终于发生了

检查yout矩阵源不会遏制一个空元素。
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.