2014-10-10 109 views
0

我有一个应用程序,我正在使用Android设备上的openGL ES 2.0。该应用程序包含一些使用编程式布局控件显示的按钮。此按钮板叠加在OpenGl表面视图上。当我在平板电脑上运行应用时,会出现按钮,但表面视图是灰色的,即我创建的3D模型的背景颜色。这导致我相信我的着色器出了问题。我在片段着色器中使用了许多统一的vec2。我在看这个网站:Android GLES20适用于仿生4.1.2,但不适用于三星4.4.2

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

我不得不提到,应该在按钮下方可见的GLSurfaceViewRenderer会在灰色消失之前显示一秒。我没有注意过。看起来,那个短暂的时刻是完整的。换句话说,GL组件可能实际上正在工作,但我无法确定。 – 2014-10-14 17:30:44

+0

我在这里发布了一个新问题:http://stackoverflow.com/questions/26455589/works-on-bionic-4-1-2-but-not-on-samsung-4-4-2请拿一个看。 – 2014-10-24 23:59:17

回答

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

+0

有趣的是我得到'GLES20。GL_NO_ERROR'来自glGetError()。该怎么办?如果问题不是GL,我的选择是什么?我最终可能会问另一个问题。这个答案很好但是不能解决我的问题!三星设备上的制服数量为224。知道这是有帮助的。 – 2014-10-14 16:37:41

相关问题