在多个进程中使用相同的着色器代码

时间:2014-12-10 19:12:28

标签: opengl glsl multiple-processes

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

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

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

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

0 个答案:

没有答案