gpt4 book ai didi

c++ - OpenGL 退化 GL_TRIANGLES 共享相同的顶点

转载 作者:搜寻专家 更新时间:2023-10-31 00:58:58 28 4
gpt4 key购买 nike

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

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

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

是否有任何标志可以“激活”退化或我缺少什么?

GL_PRIMITIVES_GENERATEDglQuery 也始终打印所有网格面的数量。

最佳答案

您缺少的是您尝试使用的优化实际上是如何工作的。

您所说的特定优化是 post-caching of T&L .也就是说,如果同一个顶点要处理两次,您只需处理一次并使用结果两次。

你不明白的是,“同一个顶点”究竟是如何确定的。它不是由您的顶点着色器可以计算的任何东西决定的。为什么?好吧,缓存的全部意义在于避免运行顶点着色器。如果顶点着色器用于确定该值是否已缓存...您没有保存任何内容,因为您必须重新计算它才能确定。

“相同的顶点”实际上是通过匹配顶点索引和顶点实例来确定的。顶点数组中的每个顶点都有一个与之关联的唯一索引。如果您两次使用相同的索引(当然只能使用 indexed rendering),那么顶点着色器将接收相同的输入数据。因此,它会产生相同的输出数据。因此您可以使用缓存的输出数据。

实例 ID 也参与其中,因为在执行 instanced rendering 时,相同的顶点索引并不一定意味着 VS 的相同输入。但即便如此,如果您获得相同的顶点索引 相同的实例 ID,那么您将获得相同的 VS 输入,因此也会获得相同的 VS 输出。所以在一个实例中,相同的顶点索引代表相同的值。

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

因此,如果您想“将一些顶点捕捉到相同的坐标以简化大型网格”,您必须您的渲染命令之前执行此操作。如果您想在着色器中“即时”执行此操作,那么您将需要某种 compute shadergeometry shader/transform feedback计算新网格的过程。然后您需要渲染这个新网格。

您可以在几何着色器中丢弃图元。但是您仍然必须对其进行 T&L。另外,完全使用 GS 会减慢速度,所以我非常怀疑这样做是否会提高性能。

关于c++ - OpenGL 退化 GL_TRIANGLES 共享相同的顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34422774/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com