着色器变化和统一变量在不同的应用程序中是唯一的吗?
我有一种情况,我需要有几个进程(实际上是单独的程序),它们使用具有相同变量名的着色器代码,但一个统一除外。每个进程都需要使着色器独立于其他进程。当我调用glCreateProgram()和glCreateShader()时,我得到每个进程中程序和着色器的相同id号,所以看起来进程'a'对进程'b'一无所知。但是,如果使用过程'b'中的独特均匀,则图像在过程'b'中无法正确显示。如果进程'a'中的着色器代码包含进程'b'中使用的统一,则一切正常。为什么在流程'a'中改变某些东西会影响流程'b'?
我们想要为所有过程使用相同的着色器源,除了使用一个不在第一个过程中但需要是所有其他过程的制服。
在所有应用程序中:
first call to glCreateShader() returns 1
second call to glCreateShader() returns 2
first call to glCreateProgram() returns 3
等等。
在流程'a'的着色器代码中:
uniform vec2 first;
uniform vec4 second;
uniform vec4 third;
varying float forth;
...
main()
{
gl_Position = second * third;
forth = somecalculation; // used in fragment shader
}
在其他进程的着色器代码中:
uniform vec2 first;
uniform vec4 second;
uniform vec4 third;
varying float forth;
uniform vec2 unique;
...
main()
{
gl_Position = second * third;
gl_position.x += unique.x;
gl_position.y += unique.y;
forth = somecalculation; // used in fragment shader
}
上述方法产生无效视图,颜色错误。如果应用程序'a'中的代码包含唯一的统一,并且统一值设置为0.0f,则没有问题。 因此,如果所有进程的着色器代码如下所示:
uniform vec2 first;
uniform vec4 second;
uniform vec4 third;
varying float forth;
uniform vec2 unique;
...
main()
{
gl_Position = second * third;
gl_position.x += unique.x;
gl_position.y += unique.y;
forth = somecalculation; // used in fragment shader
}
并且CPU上的应用程序'a'执行:
GLfloat unique[2];
GLint location = glGetUniformLocation(program, "unique");
unique[0] = 0.0f;
unique[1] = 0.0f;
glUniform2fv(location, 1, unique);
所有观点都是正确的。我错过了什么?
很抱歉这篇文章很长,但我很难对问题进行充分的描述。