我试图在顶点(或几何)着色器中计算一些顶点。当我最终绘制顶点时,它们丢失了我给顶点数组对象的顺序(使用GL_ELEMENT_ARRAY_BUFFER)。函数glDrawElements在这种情况下不起作用,而是我必须使用glDrawArrays。我错了吗?
如何保存变换反馈的三角形索引的顺序?
答案 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通过再次通过变换反馈运行输出,并使用索引数组来重新调整顶点,索引数组是原始索引数组的反向映射。
无论如何,这看起来有点尴尬。您可能需要再次考虑用例,并确保确实需要以原始顺序返回顶点。
免责声明:我从未使用转换反馈,并且只在驱动程序中实现/修复它的工作非常少。以上所有内容都是我从阅读规范的理解。