我正在尝试将着色器与OpenGL的着色器程序管道混合/匹配。 对于可分离的程序(以及管道),变化由位置而不是名称匹配。 '干净'的解决方案是从C代码设置位置,但我无论如何都找不到你做的那样。 glGetProgramResource ...允许获取程序输出位置,但我没有找到如何设置它们。有没有办法在核心中做到这一点?如果不是为什么不可能?
答案 0 :(得分:1)
(注意:我实际上并没有使用可分离的着色器;这是基于我对the ARB_separate_shader_objects
spec的阅读。)
ARB_separate_shader_objects
需要ARB_explicit_attrib_location
扩展名,该扩展名会添加layout(location=N)
语法,用于在着色器本身中指定顶点着色器输入和片段着色器输出的位置,之前使用{{{分别为1}}和glBindAttribLocation
。 glBindFragDataLocation
将此扩展到所有输入/输出。
我没有看到用于设置位置的C函数(ARB_separate_shader_objects
和glBindAttribLocation
除外),因此您必须使用布局限定符。确保您设置了相应的GLSL版本/扩展程序,并且您使用的是glBindFragDataLocation
/ in
个关键字,而不是out
/ attribute
。
答案 1 :(得分:0)
使用可分离的程序(以及管道),变化是按位置而不是按名称匹配。
事实并非如此。
接口变量(你称之为"变化")may or may not be matched based on location in separate programs。
在GLSL中指定的layout(location)
的单独程序中的接口变量将与该位置匹配。没有位置的接口变量将按名称匹配。
主要区别在于不匹配时会发生什么。如果名称在另一侧没有匹配,则会导致未定义的行为。但这导致所有命名接口变量的未定义行为,而不仅仅是不匹配的接口变量。
但是,如果位置在另一侧不匹配,则位置输入具有未定义的值,或者位置输出被丢弃。
因此,如果您愿意,可以将命名匹配与单独的程序一起使用。您只需要确保匹配完全。基于位置的匹配用于非精确匹配。