シェーダー可変変数と均一変数は、個別のアプリケーション間で一意ですか?
1 つのユニフォームを除いて、同じ変数名を持つシェーダー コードを使用する複数のプロセス (実際には個別のプログラム) が必要な状況があります。各プロセスでは、シェーダーが他のプロセスから独立している必要があります。glCreateProgram() と glCreateShader() を呼び出すと、各プロセスのプログラムとシェーダーの ID 番号が同じになるため、プロセス「a」はプロセス「b」について何も知らないように見えます。ただし、プロセス 'b' で一意のユニフォームを使用すると、プロセス 'b' で画像が正しく表示されません。プロセス「a」のシェーダー コードに、プロセス「b」で使用されるユニフォームが含まれている場合、すべて正常に動作します。プロセス「a」で何かを変更すると、プロセス「b」に影響するのはなぜですか?
すべてのプロセスで同じシェーダー ソースを使用する必要があります。ただし、最初のプロセスではなく、他のすべてのプロセスで使用する必要がある 1 つのユニフォームを使用します。
すべてのアプリケーションで:
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);
すべての意見は正しいです。私は何が欠けていますか?
長い投稿で申し訳ありませんが、問題を適切に説明するのに苦労しました。