GLSL点精灵用于粒子系统

5

我正在使用带有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上下文时,这些操作会生成BAD_ACCESS错误。

那么我应该每个PointSprite使用2个三角形吗?但这可能不是很有效率(需要额外的顶点开销)。

编辑: 那么,从https://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528提供的解决方案,我的新问题是如何在批处理调用中传递多个不同的大小。我考虑使用属性而不是Uniform,但这样我就需要始终向我的着色器传递PointSize - 即使我没有绘制GL_POINTS。那么,也许需要第二个着色器(仅用于GL_POINTS)?!我不知道在绘制例程中每帧切换着色器的开销(因为如果使用粒子系统,则自然还要呈现常规的GL_TRIANGLES而不使用pointSize),有什么想法吗?


1
这应该是你要找的内容: http://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528 - rgngl
谢谢!那个链接非常有用。所以,我对这个解决方案唯一的问题是在GLSL上是否有可能做类似于“glPointSizePointerOES”的事情(在链接中建议使用一个uniform来设置点大小-因此许多不同大小的点无法在glDrawArrays的批量调用中绘制)。我考虑使用Attribute而不是Uniform,但是那样我需要始终将PointSize传递到我的着色器中-即使我没有绘制GL_POINTS。那么,也许需要第二个着色器(仅用于GL_POINTS的着色器)?!对此有什么想法吗? - Constantin
1个回答

0

所以,根据我在这里的评论,你需要做的事情是:https://gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接