0

从使用 OpenGL变换反馈的一些示例中,我看到 glTransformFeedbackVaryings 在程序编译之后和链接之前被映射。这种方式是否适用于所有 OpenGL 版本?不能像顶点数组一样使用布局限定符来设置索引?我问是因为在我的代码着色器程序中,创建过程是从其他例程中抽象出来的,在将其拆分为可控的编译/链接方法之前,我想知道是否有解决方法。

更新:

使用可分离着色器对象时如何完成?没有明确的链接步骤。

更新:

在使用单独的着色器对象时,我仍然不清楚如何设置 glTransformFeedbackVaryings。

这个解释对我来说完全不清楚:

如果使用可分离程序对象,则捕获的属性集取自在最后一个着色器阶段活动的程序对象,处理由变换反馈捕获的图元。在转换反馈模式中为在前一个着色器阶段活动的任何其他程序捕获的属性集将被忽略。

我实际上以为我可以激活一个管道对象并进行查询。但它似乎没有效果。我的转换反馈什么也没写。然后我在转换反馈文档中找到了这个讨论:

您可以从使用 glCreateShaderProgramEXT 创建的单独着色器程序中输出变量吗?

    RESOLVED:  No.

    glTransformFeedbackVaryings requires a re-link to take effect on a
    program.  glCreateShaderProgramEXT detaches and deletes the shader
    object use to create the program so a glLinkProgram will fail.

    You can still create a vertex or geometry shader program
    with the standard GLSL creation process where you could use
    glTransformFeedbackVaryings and glLinkProgram.

这也不清楚。答案是否意味着设置变换反馈变化应该只使用常规着色器程序?我不明白。

4

1 回答 1

1

您所问的可以使用4.4.2.1 Transform Feedback Layout Qualifiers,不幸的是它是 OpenGL 4.4 功能。它可以通过 扩展形式获得GL_ARB_enhanced_layouts,但这是一个相对较新的扩展,目前采用很少。

它比 GLSL 中任何更传统的布局限定符都要复杂得多,因此在可预见的未来,您最好的选择是通过 GL API 而不是在着色器中管理变化。


至于 SSO(可分离着色器对象)程序的变化,OpenGL 规范规定如下:

OpenGL 4.4(核心配置文件) - 13.2 变换反馈 - 第 392 页

如果使用可分离程序对象,则捕获的属性集取自在最后一个着色器阶段活动的程序对象,处理由变换反馈捕获的图元。在转换反馈模式中为在前一个着色器阶段活动的任何其他程序捕获的属性集将被忽略。

通常链接标识在阶段之间实际使用的变量(在现代 GLSL 中表示为in/ out),并为 GLSL 程序建立一组“活动”制服。链接修剪不跨多个阶段共享的自重,并在阶段之间执行静态接口验证,并且在设置任何剩余变量或统一的绑定位置时也是如此。由于在使用 SSO 时每个程序对象都可以是一个阶段,因此链接器不会减少输入/输出(变化)的数量,并且您可以忽略规范中的许多语言,即它必须在链接之前或之后发生。

由于链接不是创建用于单独着色器对象的程序对象的步骤,因此您的变换反馈必须与单个阶段相关(这可能意味着不同的程序对象,具体取决于您选择的阶段)。为此,OpenGL 使用与管道中启用的最终顶点处理阶段相关的程序;这可以是顶点着色器、曲面细分评估着色器或几何着色器(按此顺序)。无论哪个程序为您的管道提供最终的顶点处理阶段,都是与变换反馈变化相关的程序对象。

于 2013-09-28T15:50:50.950 回答