【问题标题】:Android GLES20 works on bionic 4.1.2 but not on Samsung 4.4.2Android GLES20 适用于仿生 4.1.2 但不适用于三星 4.4.2
【发布时间】:2014-11-27 05:59:49
【问题描述】:

我正在开发一个在 Android 设备上使用 openGL ES 2.0 的应用程序。该应用程序包含一些使用编程布局控件显示的按钮。此按钮板叠加在 OpenGL 表面视图上。当我在平板电脑上运行应用程序时,会出现按钮,但 Surface View 是灰色的,这是我创建的 3d 模型的背景颜色。这让我相信我的着色器有问题。我在片段着色器中使用了许多统一的 vec2。我在看这个网站:

http://www.shaderific.com/glsl-variables/

它说有一个内置函数,您可以使用它来判断您的 GL 实现使用了多少统一向量。如何在 android 中运行此代码?

gl_MaxFragmentUniformVectors 

我打印出 GLES20.GL_MAX_FRAGMENT_UNIFORM_VECTORS 的内容,得到数字 36349。我的着色器使用了大约 20。

如果这不会导致任何结果,这就是基本错误。该应用程序适用于 Android 4.1.2 的 Motorola Bionic,但不适用于 Android 4.4.2 的三星 Galaxy Tab/Pro!当然,我希望它同时适用于两者。

W/ApplicationPackageManager﹕ getCSCPackageItemText()
E/MoreInfoHPW_ViewGroup﹕ Parent view is not a TextView

以下是三星设备的日志。

10-10 14:27:03.723  30456-30462/org.android.airplane D/dalvikvm﹕ Debugger has detached; object registry had 1 entries
10-10 14:38:55.833    1269-1269/org.android.airplane I/SELinux﹕ Function: selinux_android_load_priority [0], There is no sepolicy file.
10-10 14:38:55.833    1269-1269/org.android.airplane I/SELinux﹕ Function: selinux_android_load_priority , loading version is VE=SEPF_SM-T320_4.4.2_0018
10-10 14:38:55.833    1269-1269/org.android.airplane I/SELinux﹕ selinux_android_seapp_context_reload: seapp_contexts file is loaded from /seapp_contexts
10-10 14:38:55.843    1269-1269/org.android.airplane D/dalvikvm﹕ Late-enabling CheckJNI
10-10 14:38:55.943    1269-1269/org.android.airplane W/ApplicationPackageManager﹕ getCSCPackageItemText()
10-10 14:38:55.983    1269-1269/org.android.airplane E/MoreInfoHPW_ViewGroup﹕ Parent view is not a TextView
10-10 14:38:56.083    1269-1269/org.android.airplane I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build:  ()
    OpenGL ES Shader Compiler Version: E031.24.00.07
    Build Date: 01/22/14 Wed
    Local Branch: base_au149_adreno_au169_patches
    Remote Branch:
    Local Patches:
    Reconstruct Branch:
10-10 14:38:56.113    1269-1269/org.android.airplane D/OpenGLRenderer﹕ Enabling debug mode 0
10-10 14:38:58.823    1269-1269/org.android.airplane W/ApplicationPackageManager﹕ getCSCPackageItemText()

【问题讨论】:

  • 我不得不提一下,应该在按钮下可见的 GLSurfaceViewRenderer 在消失为灰色之前会显示一秒钟。我之前没有注意到。看来,这短暂的时刻已经完成了。换句话说,GL 组件可能确实在工作,但我无法确定。
  • 我在这里发布了一个新问题:stackoverflow.com/questions/26455589/… 请看一下。

标签: android opengl-es samsung-mobile


【解决方案1】:

GL_MAX_FRAGMENT_UNIFORM_VECTORS 不是支持的制服数量。它是一个枚举值,允许您查询该值。您可以通过调用获得实际值:

int valA[] = new int[1];
GLES20.glGetIntegerv(GLES20.GL_MAX_FRAGMENT_UNIFORM_VECTORS, valA, 0);
int maxUniforms = valA[0];

ES 2.0 规范要求实现至少支持 16 个统一向量。因此,理论上,如果您使用 20,您可能会超过限制。如果现代设备上的限制真的那么低,我会感到惊讶,但您一定要检查一下。

与任何其他类型的 OpenGL 问题一样,我确定您已经致电 glGetError() 并检查了结果。

除此之外,请确保检查着色器编译结果并与glGetShaderiv()glGetShaderInfoLog()glGetProgramiv()glGetProgramInfoLog() 链接。一些 GLSL 编译器在执行标准合规性方面比其他编译器更严格,因此即使它们包含错误,您的着色器也可以在某些设备上工作是很常见的。

您可以尝试的另一件事是调用glValidateProgram(),然后使用glGetProgramiv()GL_VALIDATE_STATUS 参数检查结果。这最好在你设置好所有状态之后,在第一次绘制调用之前完成。这可以报告在编译/链接时无法检测到的程序问题,因为它们依赖于其他状态的设置。

【讨论】:

  • 有趣的是我从 glGetError() 得到了“GLES20.GL_NO_ERROR”。该怎么办?如果问题不是 GL,我的选择是什么?!!我可能最终会问另一个问题。这个答案很好,但不能解决我的问题!三星设备上的制服数量为 224。知道这一点很有帮助。
【解决方案2】:

更新解决了这个问题。我的三星设备现在可以使用了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2021-08-08
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多