变换反馈变化
Posted
技术标签:
【中文标题】变换反馈变化【英文标题】:Transform Feedback varyings 【发布时间】:2013-09-28 14:06:58 【问题描述】:从使用 OpenGL 的一些 examples transform feedback 我看到 glTransformFeedbackVaryings 在程序编译之后和链接之前被映射。这种方式是否适用于所有 OpenGL 版本?不能使用布局限定符来设置索引就像顶点数组一样?我问是因为在我的代码着色器程序中,创建过程是从其他例程中抽象出来的,在将其拆分为可控的编译/链接方法之前,我想知道是否有解决方法。
更新:
使用separable shader objects时是怎么做的?没有明确的链接步骤。
更新:
我仍然不清楚在使用单独的着色器对象时如何设置 glTransformFeedbackVaryings。
这个解释我完全不清楚:
如果使用可分离的程序对象,则属性集 捕获的取自在最后一个着色器上活动的程序对象 阶段处理由变换反馈捕获的图元。这 在变换反馈模式下为任何其他捕获的属性集 在前一个着色器阶段活动的程序将被忽略。
我其实以为我可以激活一个管道对象并进行查询。但它似乎没有效果。我的转换反馈什么也没写。然后我在Transform Feedback docs找到了这个讨论:
您可以从创建的单独着色器程序中输出变化吗 使用 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.
这也不清楚。答案是否意味着设置应该只使用常规着色器程序?我不明白。
【问题讨论】:
您的目标是什么版本的 OpenGL?众所周知,EXT 扩展与核心 OpenGL 不同步。在将这些东西引入核心之前,通常的过程是 EXT/vendor -> ARB -> core。如果你的目标是一个以变换反馈为核心的 OpenGL 版本,你应该远离 EXT 扩展文档。在 OpenGL 3.0 中您应该避免使用 EXT FBO。 我使用的是GL4.2兼容模式。 【参考方案1】:您的问题可以使用4.4.2.1 Transform Feedback Layout Qualifiers
,不幸的是它是 OpenGL 4.4 功能。它可以通过GL_ARB_enhanced_layouts
以扩展形式获得,但这是一个相对较新的扩展,目前采用的很少。
它比 GLSL 中任何更传统的布局限定符都要复杂得多,因此在可预见的未来,最好的办法是通过 GL API 而不是在着色器中管理变化。
至于 SSO(可分离着色器对象)程序的变化,OpenGL 规范规定如下:
OpenGL 4.4 (Core Profile) - 13.2 变换反馈 - 第 392 页
如果正在使用可分离的程序对象,则采用捕获的属性集 从在最后一个着色器阶段激活的程序对象处理图元 由变换反馈捕获。在转换反馈模式下为在前一个着色器阶段活动的任何其他程序捕获的属性集将被忽略。
通常链接标识实际在阶段之间使用的变量(在现代 GLSL 中表示为 in
/out
),并为 GLSL 程序建立一组“活动”制服。链接修剪不跨多个阶段共享的自重,并在阶段之间执行静态接口验证,并且在设置任何剩余变量或统一的绑定位置时也是如此。由于在使用 SSO 时每个程序对象都可以是一个阶段,因此链接器不会减少输入/输出(变化)的数量,并且您可以忽略规范中的许多语言,即它必须在链接之前或之后发生。
由于链接不是创建用于单独着色器对象的程序对象的步骤,因此您的变换反馈必须与单个阶段相关(这可能意味着不同的程序对象,具体取决于您选择的阶段)。为此,OpenGL 使用与管道中启用的最终顶点处理阶段相关的程序;这可以是顶点着色器、曲面细分评估着色器或几何着色器(按此顺序)。无论哪个程序为您的管道提供最终顶点处理阶段,都是与变换反馈变化相关的程序对象。
【讨论】:
@MichaelIV:请参阅我更新的答案,它应该解释这种情况。 我明白你在说什么。我确实使用了相对于包含这些输入的 geom 着色器阶段的查询。但是 TF 什么也没写。而且我没有收到任何 OpenGL 错误... 我还没有弄清楚这个问题。使用常规程序 TF 可以工作,而使用单独的程序则不行。 我需要查看一些代码,尽管我知道这会使问题严重复杂化。如前所述,TF 输出来自管道中处于活动状态的最后阶段,因此它对单独的着色器对象的工作方式略有不同,但 确实 工作。以上是关于变换反馈变化的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL ES之变换反馈Transform Feedback的使用流程