5

我正在使用带有 PointSprites 的 ParticleSystem(受 Cocos2D Source 启发)。但我想知道如何重建 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

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

4

1 回答 1

0

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

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

于 2011-10-23T15:44:10.723 回答