3

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

我使用 glGetSubroutineIndex() 获取子程序索引。然后我将当前子程序设置为:

glUniformSubroutinesuiv(GL_FRAGMENT_SHADER,1,&( _subrotines.find(method)->second));

我收到以下 OpenGL 错误消息:

“ID:1282,SEVERITY:HIGH,消息: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;
}

当我使用常规着色器程序时它确实工作正常,但似乎不适用于单独的着色器程序。

4

1 回答 1

1

在选择带有glUniformSubroutinesuiv(). 步骤是:

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

请记住,不使用您的程序将重置您的子程序选择。所以你将不得不glUniformSubroutinesuiv()再次打电话。

于 2014-09-05T00:43:23.093 回答