0

我试图思考为什么 OpenGL 在调用glBeginTransformFeedback时需要知道原始类型。本质上,它只是存储在缓冲区中的数据。

我的猜测是 OpenGL 以某种方式需要它来计算需要多少空间,因此绘制命令可以并行运行,而不会影响彼此的数据。但是当你提交一个绘图命令时,OpenGL 应该能够从绘图中指定的图元类型推断出所需的空间。

在使用几何着色器的情况下,我认为无法预先知道所需的空间量,因为每个单独的执行都可能输出不同数量的图元(我想在硬件中实现这应该是相当具有挑战性的!)。但在那种情况下,我认为指定原始类型glBeginTransformFeedback无论如何都没有帮助。输出原语类型也可以从绑定的程序中推断出来。

所以在我看来,指定原始类型glBeginTransformFeedback只是限制了您可以渲染的原始类型。为什么会有这个限制?

4

2 回答 2

1

您问题的最终答案是“因为规范是这样说的”。规范中没有解释其背后的原因。但是在最初引入转换反馈的扩展中NV_transform_feedback,你会在问题EXT_transform_feedback部分找到以下内容:

  1. 为什么每次反馈调用只有一种反馈原语模式?

    已解决:拥有原始标记会破坏流,使其不太适合作为顶点缓冲区读回。此外,混合多种基元类型会使应用程序的基元计数不太清楚。

确实没有给出硬性的技术原因,这只是他们在某个时候做出的设计选择。

于 2020-09-27T12:34:32.980 回答
0

我认为是避免从绑定程序中查询输出类型。赋予绘图命令的图元类型并不总是与存储在变换反馈缓冲区中的图元类型相同:几何和镶嵌着色器都可以将三角形/补丁转换为点。

如果 draw 命令指定了三角形,但程序发出了点,那么程序员希望存储哪些点?使用 glBeginTransformFeedback 指定原始类型可以在绘制任何内容之前进行检查。

转换反馈可以通过按照您的建议存储程序发出的任何内容来工作,在某些情况下甚至可能更可取,但是随后将需要一些查询机制“反馈缓冲区中的几何类型是什么?” 然后。

于 2020-09-27T10:55:56.807 回答