OpenGL退化的GL_TRIANGLES共享相同的顶点

OpenGL degenerate GL_TRIANGLES sharing same vertices

本文关键字:共享 顶点 TRIANGLES GL OpenGL      更新时间:2023-10-16

我通过glDrawElements()向GPU发送一个GL_TRIANGLES的VertexBuffer+IndexBuffer。

在顶点着色器中,我想将一些顶点捕捉到相同的坐标,以在运行中简化大型网格。结果,我得到了很大的性能提升,因为很多三角形都会塌陷到同一点,然后退化。但我没有获得任何fps增益。

由于测试,我将顶点着色器设置为gl_Position(vec4(0)),以退化所有三角形,但仍然没有区别。。。

有没有任何标志可以"激活"退化,或者我缺少什么?

GL_PRIMITIVES_GENERATEDglQuery也总是打印所有网格面的数量。

您缺少的是您尝试使用的优化的实际工作方式。

您正在讨论的特定优化是T&L.也就是说,如果同一个顶点要处理两次,你只处理一次,然后使用两次结果。

你不明白的是"同一个顶点"实际上是如何确定的。它不是由顶点着色器可以计算的任何东西决定的。为什么?缓存的全部目的是避免运行顶点着色器。如果顶点着色器用于确定该值是否已缓存。。。您没有保存任何东西,因为您必须重新计算来确定这一点。

"同一个顶点"实际上是通过匹配顶点索引和顶点实例来确定的。顶点数组中的每个顶点都有一个唯一的索引。如果您使用相同的索引两次(当然只有索引渲染才可能),则顶点着色器将接收相同的输入数据。因此,它将产生相同的输出数据。因此,您可以使用缓存的输出数据。

实例id也起到了作用,因为在进行实例化渲染时,相同的顶点索引并不一定意味着VS的输入相同。但即使如此,如果您获得相同的顶点指数相同的实例id,那么您也会获得相同的VS输入,因此也会获得同样的VS输出。因此,在一个实例中,相同的顶点索引表示相同的值。

实例计数和顶点索引都是渲染过程的一部分。它们不是来自顶点着色器可以计算的任何东西。顶点着色器可以生成相同的位置、法线或其他任何东西,但实际的变换后缓存基于顶点索引和实例。

因此,如果您想"将一些顶点捕捉到相同的坐标以简化大型网格",则必须在执行渲染命令之前执行。如果你想在着色器中"动态"执行,那么你需要某种计算着色器或几何体着色器/变换反馈过程来计算新网格。然后需要渲染这个新网格。

可以丢弃几何体着色器中的基本体。但你仍然必须做T&L。另外,使用GS会减慢速度,所以我非常怀疑你这样做会获得多大的性能。