2

着色器变量和统一变量在不同的应用程序中是唯一的吗?

我有一种情况,我需要有几个进程(实际上是单独的程序),这些进程使用具有相同变量名称的着色器代码,但一个制服除外。每个进程都需要使其着色器独立于其他进程。当我调用 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);

所有观点都是正确的。我错过了什么?

很抱歉,这篇文章很长,但我很难对问题做出充分的描述。

4

0 回答 0