Domanda

Sto cercando di implementare più luci nella mia Shader, ma ho difficoltà a riempire la divisa con la mia luce dei dati.

Il mio vertex shader:

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);
        }
    }
}

Il codice che mostra solo l'ultima luce:

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

Come uPointLightingLocation uniforme è una matrice vec3 con le dimensioni di 16, ho pensato che fosse possibile passare la matrice completa l'uniforme, ma non ho soluzione di lavoro.

Quando provo per passare la this.lightsColor matrice completa (senza indice) vedo alcuna luce.

È stato utile?

Soluzione

gl.uniform3fv prevede una matrice bidimensionale di carri. Inoltre, si sta chiamando è più volte con la stessa posizione uniforme. Così, l'ultimo vince. Immaginate che uniform3fv è un comando di copia di basso livello, e vi dare (destinazione, fonte). E 'solo copie di un buffer da un luogo ad un altro.

Supponendo tuo esempio ha solo 3 luci, è possibile assegnare la divisa posizione in questo modo:

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

Vorrei inoltre consiglia di utilizzare un più semplice di shader quando si esegue il debug problemi come questo. Con qualcosa di simile a quanto segue nel vertex shader:

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

E frammento di shader:

gl_FragColor = vec4(vColor, 1);

Quindi, se i poligoni sono di colore giallo si sa che sta lavorando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top