OpenGL在可分离着色器程序中更改不同的位置

时间:2015-09-28 14:10:12

标签: c++ c opengl glsl shader

我正在尝试将着色器与OpenGL的着色器程序管道混合/匹配。 对于可分离的程序(以及管道),变化由位置而不是名称匹配。 '干净'的解决方案是从C代码设置位置,但我无论如何都找不到你做的那样。 glGetProgramResource ...允许获取程序输出位置,但我没有找到如何设置它们。有没有办法在核心中做到这一点?如果不是为什么不可能?

2 个答案:

答案 0 :(得分:1)

(注意:我实际上并没有使用可分离的着色器;这是基于我对the ARB_separate_shader_objects spec的阅读。)

ARB_separate_shader_objects需要ARB_explicit_attrib_location扩展名,该扩展名会添加layout(location=N)语法,用于在着色器本身中指定顶点着色器输入和片段着色器输出的位置,之前使用{{{分别为1}}和glBindAttribLocationglBindFragDataLocation将此扩展到所有输入/输出。

我没有看到用于设置位置的C函数(ARB_separate_shader_objectsglBindAttribLocation除外),因此您必须使用布局限定符。确保您设置了相应的GLSL版本/扩展程序,并且您使用的是glBindFragDataLocation / in个关键字,而不是out / attribute

答案 1 :(得分:0)

  

使用可分离的程序(以及管道),变化是按位置而不是按名称匹配。

事实并非如此。

接口变量(你称之为"变化")may or may not be matched based on location in separate programs

在GLSL中指定的layout(location)的单独程序中的接口变量将与该位置匹配。没有位置的接口变量将按名称匹配。

主要区别在于不匹配时会发生什么。如果名称在另一侧没有匹配,则会导致未定义的行为。但这导致所有命名接口变量的未定义行为,而不仅仅是不匹配的接口变量。

但是,如果位置在另一侧不匹配,则位置输入具有未定义的值,或者位置输出被丢弃。

因此,如果您愿意,可以将命名匹配与单独的程序一起使用。您只需要确保匹配完全。基于位置的匹配用于非精确匹配。