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

时间:2014-12-18 16:50:51

标签: c++ opengl shader transform-feedback

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

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

1 个答案:

答案 0 :(得分:0)

你没错。顶点按顶点(或几何)着色器处理它们的顺序写入变换反馈缓冲区。我没有看到一个简单的方法。

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

如果您正在绘制索引,并且需要按原始顺序返回顶点,则必须自行重新调整它们。如果索引缓冲区填充了数组n中的idxA索引,则包含数组inVertexA顶点的输入缓冲区和捕获缓冲区中的顶点位于数组capturedVertexA中,原始顺序中的变换顶点可以写为outVertexA

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

只要图纸使用基本类型GL_TRIANGLES,这将有效。如果您使用GL_TRIANGLE_STRIP之类的东西进行绘制,则索引逻辑会稍微复杂一些,因为变换反馈会生成单独的三角形。

我猜你可以让GPU通过再次通过变换反馈运行输出,并使用索引数组来重新调整顶点,索引数组是原始索引数组的反向映射。

无论如何,这看起来有点尴尬。您可能需要再次考虑用例,并确保确实需要以原始顺序返回顶点。

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