1

これは私のフラグメントシェーダーで、以下を含みますuniform:

precision highp float;

uniform sampler2D uSampler;
varying vec2 vPosition;

void main() {
    gl_FragColor = texture2D(uSampler, vPosition);
}

ここで関数を呼び出しますgetUniformLocation:

var uniformLocation = gl.getUniformLocation(program, 'uSampler')

WebGLUniformLocation一見プロパティが添付されていないように見えます:

for(a in uniformLocation) { console.log(a); } // prints no results

WebGLUniformLocationオブジェクトにプロパティがないのはなぜですか?

4

1 に答える 1

5

AWebGLUniformLocationは、ユニフォームを設定できるように、ユニフォームの位置に対する不透明なハンドルです。実際のOpenGLでは、均一な場所は整数です。残念ながら、多くのプログラマーはこれらの整数に対して数学を行います。たとえば、彼らはこのようなことをするかもしれません

//--shader--
uniform float a;
uniform float b;
...

// C
GLint location_a = glGetUniformLocation(program, "a");
GLint location_b = a + 1;   // ILLEGAL BUT MIGHT WORK ON SOME CARDS

同様に彼らはこれをするかもしれません

//--shader--
uniform float a[2];
...

// C
GLint location_a0 = glGetUniformLocation(program, "a[0]");
GLint location_a1 = a + 1;   // ILLEGAL BUT MIGHT WORK ON SOME CARDS

または彼らはこれを行うことができます

//--shader #1--
uniform float a;
...

//--shader #2--
uniform float a;
...


// C
GLint program_1 = CompileShadersAndLinkProgram(shader_1_src, ..);
GLint program_2 = CompileShadersAndLinkProgram(shader_2_src, ..);

// Get the location from program 1
GLint location_a = glGetUniformLocation(program_1, "a");

// Use a location from program 1 with program 2
glUseProgram(program_2);
glUnform1f(location_a, 123);  // ILLEGAL BUT MIGHT WORK ON SOME CARDS

OpenGLの仕様によれば、これらはすべて違法で間違っています。時々それは大丈夫です。OpenGLプログラムを作成していて、それが個人のマシンまたは固定ハードウェアでのみ機能する必要がある場合は、それが機能する場合でも、それが間違っているかどうかは気にしないでしょう。

WebGLの場合、それだけでは十分ではありません。可能であれば、コードを1回記述して、どこでも実行できるようにします。この種のエラーを防ぐために、WebGLはを返します。WebGLUniformLocationこれにより、数学を実行できず、あるプログラムの場所を別のプログラムで使用できなくなります。

于 2012-10-12T02:09:40.337 に答える