gl.uniform3fv ожидает сглаженный массив чисел с плавающей точкой. Кроме того, вы вызываете его несколько раз в одном и том же месте. Итак, последний выигрывает. Представьте, чтоiform3fv - это команда низкоуровневого копирования, и вы даете ее (место назначения, источник). Он просто копирует буфер из одного места в другое.
Предполагая, что в вашем примере только 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);
Тогда, если ваши полигоны желтые, вы знаете, что это работает.