我正在使用分离的着色器对象程序,现在正在尝试集成子程序。
我使用glGetSubroutineIndex()获取子程序索引。然后我将当前子程序设置为:
glUniformSubroutinesuiv(GL_FRAGMENT_SHADER,1,&( _subrotines.find(method)->second));
我收到以下OpenGL错误消息:
“ID:1282,严重性:高,消息:GL_INVALID_OPERATION错误 生成。可以注意获取指定着色器的子例程信息 类型。 “
以下是我在片段着色器中定义子程序的方法:
subroutine vec4 RenderMode();
subroutine uniform RenderMode renderMode;
subroutine (RenderMode)
vec4 lightsMode(){
// returns some color
}
subroutine (RenderMode)
vec4 colorMode(){
// returns some color
}
void main(void){
vec4 fragout =renderMode();
OUTPUT= fragout;
}
当我使用常规着色器程序时它确实工作正常,但似乎不适用于单独的。
答案 0 :(得分:1)
在选择glUniformSubroutinesuiv()
子程序之前,您需要使用着色器程序。步骤将是:
glUseProgram(program);
glUniformSubroutinesuiv(...);
glUseProgram(0);
请记住 unusing 程序将重置子程序选择。因此,您必须再次致电glUniformSubroutinesuiv()
。