Android API 22和23更改导致OpenGL 3d对象变平

时间:2016-09-04 00:11:37

标签: android opengl-es opengl-es-2.0

我编写了使用OpenGL ES的应用程序。我在模拟和真实的Nexus 5上测试它,其上安装了Android 6(API 23)。

在测试较旧的Android版本(API 22-)时,它出现了,我的3d对象缺少一个维度。

在statring应用程序之后,在两种情况下看起来都是这样(视图设置为-z,y轴在这里):

view when it seems to be working

但是当旋转它时,API 22(或更低)和23中的行为存在差异。

Case API 22(或更低版本):

API 22 case - z axis on model is missing

物体是平的 - 模型上的Z轴似乎缺失,但是光线正确计算(具有适当的Z值)。

Case API 23(所需的):

API 23 case - rotation works

所有截图均来自模拟器;我只使用API​​ 23(Nexus 5)在一台真实设备上进行了测试,并在那里工作。

旋转由触摸事件完成,并由以下代码处理:

case one===1

OpenGL版本在AndroidManifest中设置:

Matrix.rotateM(mCurrentRotation, 0, mDeltaRotationY, 1.0f, 0.0f, 0.0f);
Matrix.multiplyMM(mModelMatrix, 0, mModelMatrix, 0, mCurrentRotation, 0);

对我而言,模特或视图martix的行为似乎发生了变化。

修改 根据评论要求: 矩阵是在我的渲染中创建的,它扩展了GLSurfaceView.Renderer 我正在关注http://www.learnopengles.com/教程来准备这个。

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

1 个答案:

答案 0 :(得分:1)

我知道这个问题已经过时了,但我今天遇到了同样的问题。 所以,万一有人遇到这个,我发现了问题。

每当您致电Matrix.multiplyMM(float[] result, ...)时,结果&#39; float数组既不能与左侧矩阵相等,也不能与右侧矩阵相等。

在Android Marshmallow(或更高版本)上,这似乎不是一个问题......但是在下面最好先调用结果矩阵上的.clone()并将其传递给左边/右手边的矩阵代替。

长话短说,对于Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);,第二个mMVPMatrix需要替换为mMVPMatrix.clone()才能使其正常工作。