Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 为什么glBeginTransformFeedback需要指定基元类型?_Opengl_Transform Feedback - Fatal编程技术网

Opengl 为什么glBeginTransformFeedback需要指定基元类型?

Opengl 为什么glBeginTransformFeedback需要指定基元类型?,opengl,transform-feedback,Opengl,Transform Feedback,我在想为什么OpenGL在调用时需要知道原语类型。本质上,它只是存储在缓冲区中的数据 我的猜测是OpenGL不知何故需要它来计算需要多少空间,这样draw命令就可以并行运行,而不必互相践踏数据。但是当您提交绘图命令时,OpenGL应该能够从绘图中指定的原语类型推断出所需的空间 在使用几何体着色器的情况下,我认为所需的空间量不能由隐修会知道,因为每次执行都可能输出不同数量的基本体(我认为在硬件中实现这一点应该是相当困难的!)。但是在这种情况下,我不认为在glBeginTransformFeedba

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

我的猜测是OpenGL不知何故需要它来计算需要多少空间,这样draw命令就可以并行运行,而不必互相践踏数据。但是当您提交绘图命令时,OpenGL应该能够从绘图中指定的原语类型推断出所需的空间

在使用几何体着色器的情况下,我认为所需的空间量不能由隐修会知道,因为每次执行都可能输出不同数量的基本体(我认为在硬件中实现这一点应该是相当困难的!)。但是在这种情况下,我不认为在
glBeginTransformFeedback
中指定原语类型会有任何帮助。输出原语类型也可以从绑定程序中推断出来


因此,在我看来,在
glBeginTransformFeedback
中指定原语类型只会限制您可以渲染的原语类型。为什么会有这种限制?

我认为这是为了避免查询绑定程序的输出类型。指定给“绘制”命令的基本体类型并不总是与存储在变换反馈缓冲区中的基本体类型相同:几何体和细分着色器都可以将三角形/面片转换为点


如果draw命令指定三角形,但程序发出点,程序员希望存储哪个点?通过使用glBeginTransformFeedback指定基元类型,可以在绘制任何内容之前进行检查


转换反馈可以按照您的建议存储程序发出的任何信息,在某些情况下,这可能更可取,但随后必须有一些查询机制“反馈缓冲区中有什么类型的几何体?”您的问题的最终答案是“因为规范这么说”。规范中没有解释其背后的原因。但是在最初引入转换反馈的扩展中,您可以在问题部分找到以下内容:

  • 为什么每次反馈调用只有一个反馈原语模式

    已解决:使用原始令牌会打断流并使其更少 适于作为顶点缓冲区读回。此外,混合多个 基元类型使基元的计数对于 应用程序


  • 实际上没有给出任何严格的技术理由,这只是他们在某一点上做出的设计选择。

    “如果draw命令指定三角形,但程序会发出点,这是程序员希望存储的点?”根据规范,在这种情况下,会捕获程序输出的内容(这也是
    BeginTransformFeedback
    所给出的原语类型被验证的依据),而程序员期望得到规范所说之外的东西,无论如何都是错误的。