【问题标题】:Is there a more efficient way of drawing a pixel than GL_POINTS?有没有比 GL_POINTS 更有效的像素绘制方法?
【发布时间】:2014-05-15 01:44:18
【问题描述】:

在一个程序中,我打算单独写入大量像素。我猜想使用 vbo、着色器和 GL_POINTS 不是很有效。我的一个想法是在整个屏幕上绘制两个三角形,然后写入片段着色器中的每个像素,尽管我不确定这样做的效率如何?

我使用的是 openGL 3,所以没有使用过时的函数。

【问题讨论】:

  • 这真的取决于你想要达到的目标。这里有 POINTS,有写入纹理并将其 blitting 到屏幕,有片段着色器,以及可能对达到特定目标有用的许多其他路径。
  • @derhass 我有很多“粒子”,我打算绘制它们的大小只有一个像素。
  • 好吧。对每个粒子使用一个 POINT 听起来并不是很糟糕。
  • @derhass 我相信有更有效的方法
  • @Ryxuma:是什么让你这么想?只要这些点分布稀疏,它实际上是一种非常有效的方法。 Heck point sprites 已被引入以允许使用 GL_POINTS 原始渲染操作绘制复杂形状的粒子。

标签: opengl lwjgl


【解决方案1】:

您是否考虑过实例化渲染?甚至绘制 2 个像素大小的三角形也可能比绘制点更快。

看看glDrawArraysInstancedglVertexAttribDivisor(用于应用不同的颜色等)。

如果您的粒子具有加速或任何确定性位置更改算法,您甚至可以在顶点着色器中应用此更改来限制相关 VBO 占用的空间(无需保留位置)和 CPU 时间(只有少数需要调用 GL 来绘制和动画整个粒子系统)。

【讨论】:

  • 是的,你完全正确。我每个绘制 2 个三角形的想法忽略了一个事实,即他显然不想绘制 1 个片段精灵:p 假设使用 VBO 绘制点是最好的方法!
【解决方案2】:

在新的 OpenGL 中,您可以绑定 FBO with no attachment 并使用 image output in a fragment shader 来实现类似的功能。但是,由于(可能)非常不规则的内存访问模式,可以预期性能不佳,这在 GPU 上可能是致命的。但也许您可以获得比栅格化点更好的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多