【问题标题】:Render different OpenGL point sprite at each vertex在每个顶点渲染不同的 OpenGL 点精灵
【发布时间】:2014-08-12 22:56:20
【问题描述】:

基本问题:对于 OpenGL,是否可以让着色器程序使用单个 glDrawArrays 调用(使用 GL_POINTS)在每个顶点绘制不同的点精灵?

更多信息: 我有一个可以显示数千个 2D 轨道的 OpenGL 桌面程序(在 WPF 应用程序中使用 SharpGL)。部分地,轨迹是一系列时间戳点,并且根据可变 CurrentTime 周围的时间跨度显示部分点。每个点的其他属性决定了该点的颜色。每个轨道绑定它的顶点数组、颜色数组和时间戳数组,并调用 glDrawArrays 来渲染它的点。着色器程序会完成剩下的工作。

我最近开始使用点精灵来为不同类型的轨道赋予不同的符号来表示它们的点。我想根据每个点的其他属性在轨道上给出不同的符号。我想为每个轨道调用一个 glDrawArrays 来做到这一点。所以想法是一个精灵数组可以解决问题(对每个顶点应用不同的精灵)。这可能吗?我错过了更好的解决方案吗?

【问题讨论】:

    标签: opengl point-sprites


    【解决方案1】:

    当然。 OpenGL 会自动在每个精灵中生成从 0.0 到 1.0 的纹理坐标,但没有理由您的片段着色器不能更改它们。我会将所有精灵图像放入一个大型纹理图集,并将确定要使用哪个图像的属性传递给片段着色器。

    在 OpenGL 3.3 或更高版本中,您可以在片段着色器中使用一个内置的 gl_PrimitiveID 变量,它是一个针对绘制的每个点、线或三角形递增的计数器。 (几何或曲面细分着色器会稍微复杂一些。)这也可能有用。

    希望这会有所帮助。

    【讨论】:

    • gl_PrimitiveID 实际上是为从 GL 3.2 开始的片段着色器定义的(当几何着色器出现时它成为核心)。
    • 感谢您的回复!纹理别名听起来很有希望。我会检查一下。 +1,一旦我研究过,我会接受这个答案。
    • 哎呀... alias = atlas 在之前的评论中。
    • 这是让我走上正轨的答案。我最终使用了一个精灵表(是的,仍然学习了很多关于 OpenGL 的知识)。 to this question给出的答案也很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多