【问题标题】:GLSL PointSprite for particle system用于粒子系统的 GLSL PointSprite
【发布时间】:2011-12-04 10:11:11
【问题描述】:

我正在使用带有 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)...对此有什么想法吗?

【问题讨论】:

  • 谢谢!该链接非常有用。所以,我对这个解决方案的唯一问题是有可能在 GLSL 上做类似“glPointSizePointerOES”的事情(在链接上,它建议使用统一的点大小 - 这么多不同大小的不同点在批量调用中是不可绘制的与 glDrawArrays)。我想过使用属性而不是统一,但是我需要始终将 PointSize 传递给我的着色器——即使我没有绘制 GL_POINTS。那么,也许是第二个着色器(仅用于 GL_POINTS 的着色器)?!对此有何想法?

标签: opengl-es glsl particle-system point-sprites


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2012-06-28
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    相关资源
    最近更新 更多