变换反馈丢失了三角形网格的顺序

Transform Feedback lost order of triangle mesh

本文关键字:三角形 网格 顺序 变换      更新时间:2023-10-16

我正在尝试在顶点(或几何体(着色器中计算我的一些顶点。当我最终绘制顶点时,它们失去了我给顶点数组对象的顺序(带有GL_ELEMENT_ARRAY_BUFFER(。函数 glDrawElements 在这种情况下不起作用,相反,我必须使用 glDrawArrays。我错了吗?

如何保存转换反馈的三角形索引的顺序?

你没有错。顶点按照顶点(或几何图形(着色器的处理顺序写入转换反馈缓冲区。我看不出一个简单的解决方法。

这意味着如果要在捕获的缓冲区中绘制顶点,则将使用 glDrawArrays() .或者在 GL 4.0 及更高版本中,您也可以使用 glDrawTransformFeedback() .

如果您正在绘制索引,并且需要将顶点恢复到其原始顺序,则必须自己重新洗牌。如果您的索引缓冲区填充了数组 idxA 中的 n 个索引,输入缓冲区包含来自数组 inVertexA 的顶点,并且来自捕获缓冲区的顶点位于数组 capturedVertexA 中,则按原始顺序转换的顶点可以写入outVertexA

for (int k = 0; k < n; ++k) {
    outVertexA[idxA[k]] = capturedVertexA[k];
}

只要绘图是基元类型 GL_TRIANGLES,这将起作用。如果您使用类似 GL_TRIANGLE_STRIP 的东西绘制,索引逻辑会稍微复杂一些,因为变换反馈会产生单独的三角形。

我想你可以让 GPU 重新洗牌顶点,方法是再次通过转换反馈运行输出,并使用索引数组作为原始索引数组的反向映射。

无论如何,它看起来有点尴尬。您可能需要再次考虑您的用例,并确保确实需要按原始顺序恢复顶点。

免责声明:我从未使用过转换反馈,并且在驱动程序中实现/修复它的工作非常少。以上都是我通过阅读规范的理解。