8

シェーダーに複数のライトを実装しようとしていますが、ユニフォームをライト データで埋めるのに問題があります。

私の頂点シェーダー:

attribute vec3 aVertex;
attribute vec3 aNormal;
attribute vec2 aTexture;

uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
uniform mat4 uNMatrix;

uniform vec3 uAmbientColor;
uniform vec3 uPointLightingLocation[16];
uniform vec3 uPointLightingColor[16];

varying vec2 vTexture;
varying vec3 vLightWeighting;

void main(void) {
    vec4 mvPosition = uMVMatrix * vec4(aVertex, 1.0);
    gl_Position = uPMatrix * mvPosition;
    vTexture = aTexture;

    int i;
    for (i = 0; i < 16; i++) {
        vec3 lightDirection = normalize(uPointLightingLocation[i] - mvPosition.xyz);
        vec4 transformedNormal = uNMatrix * vec4(aNormal, 1.0);
        float directionalLightWeighting = max(dot(transformedNormal.xyz, lightDirection), 0.0);
        if (i == 0) {
            vLightWeighting = uAmbientColor + uPointLightingColor[i] * directionalLightWeighting;
        } else {
            vLightWeighting = vLightWeighting * (uAmbientColor + uPointLightingColor[i] * directionalLightWeighting);
        }
    }
}

最新のライトのみを表示するコード:

for (var light in this.lightsDirection) {
    gl.uniform3fv(this.shaderProgram.pointLightingLocationUniform, this.lightsDirection[light]);
    gl.uniform3fv(this.shaderProgram.pointLightingColorUniform, this.lightsColor[light]);
}

ユニフォームuPointLightingLocationはサイズが 16 の vec3 配列であるため、完全な配列をユニフォームに渡すことは可能であると考えましたが、有効な解決策がありません。

完全な配列 (インデックスなし) を渡そうとすると、this.lightsColorまったく光が見えません。

4

1 に答える 1

18

gl.uniform3fv は、平坦化された float の配列を想定しています。また、同じ均一な場所で複数回呼び出しています。したがって、最後のものが勝ちます。uniform3fv が低レベルのコピー コマンドであり、(コピー先、コピー元) を指定するとします。バッファをある場所から別の場所にコピーするだけです。

例に 3 つのライトしかないと仮定すると、次の方法で場所を一様に割り当てることができます。

var locations = [
  1.0, 0, 0,
  0, 1.0, 0,
  0, 0, 0
];
gl.uniform3fv(shaderProgram.pointLightingLocationUniform, locations);

このような問題をデバッグする場合は、より単純なシェーダーを使用することもお勧めします。頂点シェーダーで次のようなものを使用します。

for (int i = 0; i < 3; i++) {
  vColor += uPointLightingLocation[i];
}

そしてフラグメントシェーダー:

gl_FragColor = vec4(vColor, 1);

次に、ポリゴンが黄色の場合、機能していることがわかります。

于 2011-01-19T05:34:22.733 に答える