Android GLES20适用于bionic 4.1.2但不适用于Samsung 4.4.2

时间:2014-10-10 19:19:13

标签: android opengl-es samsung-mobile

我有一个我正在研究的应用程序,它在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个。

如果这没有导致任何结果,这是基本错误。该应用适用于摩托罗拉Bionic,Android 4.1.2,但不适用于三星Galaxy Tab / Pro,Android 4.4.2!当然,我希望它能同时发挥作用。

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()

2 个答案:

答案 0 :(得分:0)

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检查结果。在进行第一次绘制调用之前,最好在设置完所有状态后完成此操作。这可以报告在编译/链接时无法检测到的程序问题,因为它们取决于其他状态的设置。

答案 1 :(得分:0)

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