将整数值传递给glUniformSubroutinesuiv

时间:2016-03-04 11:14:18

标签: c++ opengl glsl

我正在收集GLSL着色器中子程序的第一次体验。我使用了两遍边缘检测着色器,它在第一遍中将场景渲染为纹理,然后在第二遍中覆盖边缘。片段着色器具有以下两个子例程,如下所示:

#version 430

/* Subroutines */
subroutine vec4 RenderPassType();
layout (location = 0) subroutine uniform RenderPassType renderPass;
...

layout (index = 1) subroutine(RenderPassType)
vec4 pass1()
{
    ...
}

layout (index = 2) subroutine(RenderPassType)
vec4 pass2()
{
    ...
}

void main()
{
    out_color = renderPass();
}

在我的OpenGL代码中,我检索子程序的索引并按以下方式设置子程序的统一:

GLuint subroutineIndexPass1{0};
GLuint subroutineIndexPass2{0};
subroutineIndexPass1 = glGetSubroutineIndex(prg_phongShading->GetProgramHandle(), GL_FRAGMENT_SHADER, "pass1");       
subroutineIndexPass2 = glGetSubroutineIndex(prg_phongShading->GetProgramHandle(), GL_FRAGMENT_SHADER, "pass2");

glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, 1, &subroutineIndexPass1);

但是,我已经将着色器中的索引定义为布局说明符!我无法做到这一点:

glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, 1, 1);

因此我的问题是:如何将整数字面值传递给glUniformSubroutinesuiv?有没有比指定GLuint index = 1更优雅的解决方案并将其作为参数传递给函数?

1 个答案:

答案 0 :(得分:1)

  

是否有比指定{{1}}更优雅的解决方案并将其作为参数传递给函数?

没有