Opengl es 粒子系统的GLSL点精灵

Opengl es 粒子系统的GLSL点精灵,opengl-es,glsl,particle-system,point-sprites,Opengl Es,Glsl,Particle System,Point Sprites,我正在使用一个带有PointSprites的ParticleSystem(灵感来源于Cocos2D源代码)。但我想知道如何重建OpenGL ES 2.0的功能 glEnable(GL_POINT_SPRITE_OES); glEnableClientState(GL_POINT_SIZE_ARRAY_OES); glPointSizePointerOES(GL_FLOAT,sizeof(PointSprite),(GLvoid*) (sizeof(GL_FLOAT)*2)); glDisable

我正在使用一个带有PointSprites的ParticleSystem(灵感来源于Cocos2D源代码)。但我想知道如何重建OpenGL ES 2.0的功能

glEnable(GL_POINT_SPRITE_OES);
glEnableClientState(GL_POINT_SIZE_ARRAY_OES);
glPointSizePointerOES(GL_FLOAT,sizeof(PointSprite),(GLvoid*) (sizeof(GL_FLOAT)*2));
glDisableClientState(GL_POINT_SIZE_ARRAY_OES);
glDisable(GL_POINT_SPRITE_OES);
当使用OpenGL ES 2.0上下文时,这些会生成错误的_访问。 我是否应该简单地为每个PointSprite设置2个三角形?但这可能不是很有效(额外顶点的开销)

编辑: 因此,我的新问题和建议的解决方案来自:


可以在批处理调用中传递许多不同的大小。我曾想过使用一个属性而不是统一属性,但之后我需要始终向着色器传递一个PointSize,即使我没有绘制GL_点。那么,也许是第二个着色器(仅用于GL_点的着色器)?!我不知道在绘制例程中每帧切换着色器的开销(因为如果使用粒子系统,我自然也希望渲染没有点大小的常规GL_三角形)。。。对此有什么想法吗?

因此,在这里做我已经说过的事情就是你需要的:


对于哪种方法,我可以告诉您在应用程序中为不同类型的可绘制对象使用不同的着色器,或者在着色器中使用另一种布尔统一,并通过着色器代码启用和禁用更改
gl_PointSize
。通常由你决定。您需要记住的是,更改着色器程序是最耗时的操作之一,因此在这种情况下,成批绘制相同类型的对象会更好。我不确定在着色器代码中使用if语句是否会对性能产生巨大影响。

这应该是您想要的:谢谢!这个链接非常有用。因此,这个解决方案的唯一问题是可能会在GLSL上执行类似的操作,如“GLPOINTSIZEPOINTEROOS”(在链接上,建议使用统一的点大小-在使用glDrawArrays的批处理调用中无法绘制许多不同大小的点)。我曾想过使用一个属性而不是统一属性,但之后我需要始终向着色器传递一个PointSize,即使我没有绘制GL_点。那么,也许是第二个着色器(仅用于GL_点的着色器)?!有什么想法吗?