Opengl Can';t获取指定着色器类型的子例程信息

Opengl Can';t获取指定着色器类型的子例程信息,opengl,glsl,Opengl,Glsl,我正在使用分离的着色器对象程序,现在尝试集成子例程 我使用glGetSubroutineIndex()获取子例程索引。然后我使用以下设置当前子例程: glUniformSubroutinesuiv(GL_FRAGMENT_SHADER,1,&( _subrotines.find(method)->second)); 我收到以下OpenGL错误消息: ID:1282,严重性:高,消息:GL\U无效\U操作错误 已生成。请注意,无法获取指定着色器的子例程信息 类型。“ 下面是我如何定

我正在使用分离的着色器对象程序,现在尝试集成子例程

我使用glGetSubroutineIndex()获取子例程索引。然后我使用以下设置当前子例程:

glUniformSubroutinesuiv(GL_FRAGMENT_SHADER,1,&( _subrotines.find(method)->second));
我收到以下OpenGL错误消息:

ID:1282,严重性:高,消息:GL\U无效\U操作错误 已生成。请注意,无法获取指定着色器的子例程信息 类型。“

下面是我如何定义片段着色器中的子例程:

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;
}

当我使用常规着色器程序时,它确实可以正常工作,但似乎无法与单独的着色器程序一起工作。

在使用
glUniformSubroutinesuiv()
选择子例程之前,需要先使用着色器程序。这些步骤将是:

glUseProgram(program);
glUniformSubroutinesuiv(...);
glUseProgram(0);

请记住,使用您的程序将重置您的子程序选择。因此,您必须再次调用
glUniformSubroutinesuiv()

如果在调用
glUniformSubroutines
之前用
glBindProgramPipeline
绑定0,会出现什么错误?您仍然会得到一个
GL_INVALID_OPERATION
错误,但我正在尝试查看当您更改它时,错误的文本是什么。您的意思是,当与单独的程序或常规程序一起使用时,它将重置?它将重置您对包含子例程的GLSL程序的子例程选择(假设这就是你所说的独立程序)。没有子程序的GLSL程序没有什么可重置的。