繁体   English   中英

GLSL / OpenGL重用顶点着色器的输出

[英]GLSL / OpenGL Reusing output from vertex shader

我正在3D空间中渲染精灵,其中每个四边形由两个三角形组成。 我画了GL_TRIANGLES(见下文)。 由于在此结构中重复了2个顶点,因此顶点着色器执行两次相同的计算。

    5    3, 4
     *---*
     |  /|
     |/  |
     *---* 
  1, 6    2

我想通过使用几何着色器重复两个顶点来优化此效果。 这是因为顶点着色器很昂贵,并且场景中存在大量三角形。 经过大量的黑客攻击后,我设法将其关闭。 它被关闭是非常低效的。 实际上,这在我的机器上慢了45%。 我认为这是由于原始装配体执行了两次,并且在几何着色器中发生了很多不必要的数据复制这一事实。 我无法查看汇编代码,因此只能猜测。

现在我的问题是,有没有比所有其他额外的顶点着色器操作更快的更好方法呢?

不需要几何着色器。

您需要的是索引渲染:每个顶点仅在VBO中存储一次 然后,创建其他缓冲区对象(与GL_ELEMENT_ARRAY_BUFFER绑定),该对象存储实际VBO中存储的顶点索引

可视化效果:(来源: in2gpu.com

在此处输入图片说明

请注意,你的情况并不 例如,考虑绘制一个圆:假设您使用360个三角形绘制它(看起来很合理)。 在这种情况下,每个三角形将复制中心顶点-这将导致359 * 4(组件数+对齐)* 4( sizeof(float)通常值)= 5744字节的不必要数据:

在此处输入图片说明

进一步阅读:


更新

由于在此结构中重复了2个顶点,因此顶点着色器执行两次相同的计算。

不,它肯定不会。 所有重复的顶点肯定会命中顶点缓存(我想这是您所说的“缓存”的意思吗?),并将被重用。 这是一种非常常见的用法-请记住,有时索引渲染不是解决方案(例如,当您对同一位置使用不同的属性时-是的,您可以将位置数据移动到单独的VBO中,但这通常是不值得的,因此,我们就不用说了),因此GPU必须有效地处理这种情况。 GPU供应商负责此事。

所以不要优化它。 如果您知道索引渲染,但是您不能使用它或没有任何改进,那么让GPU hadle渲染成为可能的最佳方法。

由于在此结构中重复了2个顶点,因此顶点着色器执行两次相同的计算。

不,在几乎所有现有的实现方式(即GPU)上都没有。

重复的顶点将到达顶点缓存,并且先前在同一顶点上进行的计算的现有结果将重新用于管道中的后续步骤。

试图优化这一点尚无定论,GPU已经针对系统的使用模式和性能进行了严格优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM