使用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.
这也不清楚。答案是否意味着要设置变换反馈变化,应该只使用常规着色器程序?我不明白。
答案 0 :(得分:1)
使用4.4.2.1 Transform Feedback Layout Qualifiers
可能会有什么问题,遗憾的是它是一个OpenGL 4.4功能。它通过GL_ARB_enhanced_layouts
以扩展形式提供,但这是一个相对较新的扩展,目前采用率很低。
它比GLSL中任何更传统的布局限定符复杂得多,因此在可预见的未来,您最好的选择是管理GL API而不是着色器中的变化。
就SSO(可分离着色器对象)程序的变化而言,OpenGL规范声明如下:
如果正在使用可分离的程序对象,则会捕获捕获的属性集 来自处理基元的最后一个着色器阶段上活动的程序对象 通过变换反馈捕获。在变换反馈模式下为先前着色器阶段上活动的任何其他程序捕获的属性集将被忽略。
通常,链接标识在各阶段之间实际使用的变化(在现代GLSL中表示为in
/ out
),并为GLSL程序建立一组“活动”制服。链接修剪不在多个阶段共享的自重,并在阶段之间执行静态界面验证,并且还在设置任何剩余变化或制服的绑定位置时。由于每个程序对象在使用SSO时都可以是单个阶段,因此链接器不会减少输入/输出的数量(变化),您可以忽略规范中的许多语言,这些语言必须在链接之前或之后发生。
由于链接不是创建用于单独着色器对象的程序对象的步骤,因此转换反馈必须相对于单个阶段(这可能意味着不同的程序对象,具体取决于您选择的阶段)。为此,OpenGL使用与管道中启用的最终顶点处理阶段关联的程序;这可以是顶点着色器,曲面细分评估着色器或几何着色器(按此顺序)。无论哪个程序为您的管道提供最终顶点处理阶段,程序对象都会转换反馈变化相对于。