0

我目前的渲染实现如下:

  • 将所有顶点信息存储为四边形而不是三角形
  • 对于三角形,只需重复最后一个顶点(即v0 v1 v2 v2
  • 将顶点信息传递lines_adjacency给几何着色器
  • 检查是四边形还是三角形,输出为triangle_strip

我走这条路的原因是因为我正在实现一个线框着色器,并且我想绘制没有对角线穿过它们的四边形。但是,我已经放弃了这个功能。

我现在想知道是否应该回到简单的绘图GL_TRIANGLES,并将几何着色器排除在等式之外。但这让我开始思考......从性能的角度来看,实际上什么更有效?

  • 平均而言,我的场景由等量的四边形和三角形组成。
  • 绘制所有三角形意味着:每个四边形 6 个顶点,每个三角形 3 个。
  • 使用lines_adjacency 绘制意味着:每个四边形4 个顶点,每个三角形4 个。
  • (这是索引绘图,因此它们的顶点缓冲区大小相同)

所以顶点比率是 9:8(三角形:lines_adjacency)。

假设使用索引绘图,每个顶点仅由顶点着色器处理一次(而不是每个索引一次),我是否正确?在这种情况下,绘制三角形会更有效(因为不需要执行额外的几何着色器步骤),唯一的缺点是索引占用的额外内存量很小。

再说一次,如果顶点确实每个索引处理一次,我可以看到边缘使用 lines_adjacency 方法,考虑到几何转换非常简单,而顶点着色器可能正在运行更密集的光照计算。

所以这几乎总结了我的问题:如何用索引绘图处理顶点,如果包含一个简单的几何着色器,可以预期什么样的性能影响?

4

1 回答 1

1

在这种情况下,几何着色器永远不会提高效率,它们只会使原始组装过程复杂化。当您使用几何着色器时,后 T&L 缓存不再按照最初设计的方式工作。

虽然几何着色器确实会在需要获取顶点数据时重用在顶点着色器阶段转换的任何共享(索引)顶点,但几何着色器仍会计算并发出每个输出基元的唯一顶点集。

此外,由于几何着色器可以发射可变数量的数据点,因此它们与其他着色器阶段不同。并行化几何着色器比并行化顶点或片段要困难得多。几何着色器有太多负面的东西,我建议使用它们,除非你真的需要它们。

于 2013-11-29T21:52:36.170 回答