我的Galaxy S4屏幕边缘点精灵消失(不在Nexus 7上)

时间:2013-12-03 08:34:13

标签: android opengl-es-2.0

我正在尝试基于此代码的粒子发射器:https://code.google.com/p/sravan-work/source/browse/trunk/OpenGL+ES2/es2particles/src/es2/learning/ParticleRenderer.java

目前,粒子发射器在我的Nexus 7上运行良好;点精灵在屏幕中心生成,并且1)淡出或2)飞过屏幕边缘。

不幸的是,在我的Galaxy S4上,一旦它们的中点到达屏幕边缘,点精灵就会从显示屏上消失。这会造成非常不愉快的视觉效果。

这两款设备都运行Android 4.3

问题: 为什么精灵会从(华硕)Nexus 7的屏幕上滑落,但是在Galaxy S4上它们会突然消失?有什么办法可以防止突然失踪吗?

附加说明:

对于Galaxy S4,以下内容以logcat打印:

12-03 00:29:15.288: I/Adreno-EGL(31137): <qeglDrvAPI_eglInitialize:316>: EGL 1.4 QUALCOMM build:  (CL4169980) 
12-03 00:29:15.288: I/Adreno-EGL(31137): OpenGL ES Shader Compiler Version: 17.01.10.SPL 
12-03 00:29:15.288: I/Adreno-EGL(31137): Build Date: 09/26/13 Thu

对于Nexus 7,以下内容打印在logcat中:

12-03 00:14:38.144: D/libEGL(25303): loaded /system/lib/egl/libEGL_tegra.so
12-03 00:14:38.154: D/libEGL(25303): loaded /system/lib/egl/libGLESv1_CM_tegra.so
12-03 00:14:38.174: D/libEGL(25303): loaded /system/lib/egl/libGLESv2_tegra.so
12-03 00:14:38.194: D/OpenGLRenderer(25303): Enabling debug mode 0

1 个答案:

答案 0 :(得分:0)

精灵基于其中心的单个点,围绕该点绘制纹理。如果此点超出渲染区域,则会剪切它们,因为它们的整个几何体在技术上位于视图之外。

可能有一些解决方法可以避免突然消失:

  1. 当精灵接近屏幕边缘时,手动淡化精灵。
  2. 扩展视图/渲染区域,使其“在屏幕外”(不确定是否可行)。
  3. 使用带有四个顶点而不是精灵的正方形(只要顶点在屏幕上,相关的三角形就不会被剪裁)
  4. 对于选项3:
    首先,您必须为每个粒子定义一个正方形而不是单个点:

    float verts[] = {-1, 1, 0,  1, 1, 0,  1,-1, 0,  -1,-1, 0};
    

    根据您希望粒子的行为方式,您可以移除每个顶点的第三个坐标,并将其设置为顶点着色器中的适当值。

    其次,不是绘制GLES20.GL_POINTS,而是必须绘制三角形,使用我发布的数组,GLES20.GL_TRIANGLE_FAN将创建一个正方形。

    您还必须在顶点着色器中设置粒子的位置和大小。像a_Position*size*0.5 + translate这样的东西可以做到这一点。 如果您使用较小的尺寸或使verts[]数组中的顶点值更小,您当然可以避免尺寸减半。 translate将是粒子的计算位置。

    注意1:请记住glPointSize设置大小(以像素为单位),但在此示例中,大小以世界空间为单位。大小为10可能会大于此示例中的屏幕

    注意2:由于您现在使用的是实际几何而不是点,因此可以使用perspective matrix使更远的粒子显得更小。