我正在尝试基于此代码的粒子发射器: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
答案 0 :(得分:0)
精灵基于其中心的单个点,围绕该点绘制纹理。如果此点超出渲染区域,则会剪切它们,因为它们的整个几何体在技术上位于视图之外。
可能有一些解决方法可以避免突然消失:
对于选项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
使更远的粒子显得更小。