Le passage d'un tableau de vecteurs d'un uniforme
Je suis en train de mettre en œuvre plusieurs lumières dans mon shader, mais j'ai de la difficulté à remplir l'uniforme avec ma lumière des données.
Mon 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);
}
}
}
De Code qui montre que la dernière lumière:
for (var light in this.lightsDirection) {
gl.uniform3fv(this.shaderProgram.pointLightingLocationUniform, this.lightsDirection[light]);
gl.uniform3fv(this.shaderProgram.pointLightingColorUniform, this.lightsColor[light]);
}
Comme l'uniforme uPointLightingLocation
est un vec3 tableau avec la taille de 16 ans, j'ai pensé qu'il serait possible de passer à la gamme complète de l'uniforme, mais je n'ai pas de solution de travail.
Quand j'ai essayer de passer à la gamme complète this.lightsColor
(sans index) je ne vois pas la lumière à tous.
- Je ne vois pas pourquoi cette question a été rejeté. Semble parfaitement raisonnable.
Vous devez vous connecter pour publier un commentaire.
gl.uniform3fv s'attend à une stagnation de la gamme de flotteurs. Aussi, vous êtes en l'appelant plusieurs fois avec le même uniforme emplacement. Donc, la dernière que l'on gagne. Imaginez que uniform3fv est un bas niveau de commande de copie, et vous donner (destination, source). Il copie seulement un tampon d'un endroit à un autre.
En supposant que votre exemple n'a que 3 lumières, vous pouvez affecter l'emplacement de l'uniforme de cette façon:
Je vous recommande également à l'aide d'une simple shader lorsque vous déboguez des problèmes de ce genre. Avec quelque chose comme ce qui suit dans le vertex shader:
Et le fragment shader:
Ensuite, si votre polygones sont de couleur jaune, vous savez qu'il est de travail.