我正在尝试在顶点(或几何)着色器中计算我的一些顶点。当我最终绘制顶点时,它们丢失了我给顶点数组对象(使用 GL_ELEMENT_ARRAY_BUFFER)的顺序。glDrawElements 函数在这种情况下不起作用,我必须使用 glDrawArrays。我错了吗?
如何保存变换反馈的三角形索引顺序?
我正在尝试在顶点(或几何)着色器中计算我的一些顶点。当我最终绘制顶点时,它们丢失了我给顶点数组对象(使用 GL_ELEMENT_ARRAY_BUFFER)的顺序。glDrawElements 函数在这种情况下不起作用,我必须使用 glDrawArrays。我错了吗?
如何保存变换反馈的三角形索引顺序?
你没有错。顶点按照顶点(或几何)着色器处理的顺序写入变换反馈缓冲区。我没有看到一个简单的解决方法。
这意味着如果您想在捕获的缓冲区中绘制顶点,您将使用glDrawArrays()
. 或者在 GL 4.0 及更高版本中,您也可以使用glDrawTransformFeedback()
.
如果您正在绘制索引,并且需要将顶点恢复为原始顺序,则您必须自己重新排列它们。如果您的索引缓冲区填充了n
来自 array的索引idxA
,您的输入缓冲区具有来自 arrayinVertexA
的顶点,并且来自捕获缓冲区的顶点在 arraycapturedVertexA
中,则原始顺序中的转换顶点可以写入outVertexA
为:
for (int k = 0; k < n; ++k) {
outVertexA[idxA[k]] = capturedVertexA[k];
}
只要绘图是原始类型,这将起作用GL_TRIANGLES
。如果您使用类似的东西进行绘制GL_TRIANGLE_STRIP
,则索引逻辑会稍微复杂一些,因为变换反馈会产生单独的三角形。
我想您可以通过再次通过变换反馈运行输出并使用作为原始索引数组的反向映射的索引数组来让 GPU 重新调整顶点。
无论如何,它看起来有点尴尬。您可能需要再次考虑您的用例,并确保您确实需要以原始顺序返回顶点。
免责声明:我从未使用过变换反馈,并且只在驱动程序中完成/修复它的工作非常少。以上都是我阅读规范的理解。