Передача массивов недлинной длины в gl.uniform3fv - PullRequest
0 голосов
/ 11 мая 2019

Кажется, что при использовании WebGL uniform3fv вы ДОЛЖНЫ передать массив длины, равный 3 , если ваша форма шейдера равна vec3 ИЛИ массив, имеющий длину, равную , кратную 3 если ваша шейдерная униформа является массивом vec3.

Делаем это:

var data = new Float32Array([ 1, 2, 3, 4 ]);
gl.uniform3fv( uniformLocation, data );

когда ваша униформа объявлена ​​как:

uniform vec3 some_uniform;

приведет к some_uniform получению (0,0,0) значения.

Я искал в Интернете, SO, MDN, форумах и прочем (одним из них является спецификация WebGL), и я не могу найти требование (или упомянуть) для этого ограничения.

Мой вопрос: требуется ли это согласно спецификации WebGL (и если да, не могли бы вы указать на это) или это просто какое-то недокументированное поведение, о котором вы должны знать?

Если это необходимо, мы изменим код для поддержки его как требования, если это недокументированная причуда, мы изменим код для поддержки этой причуды с возможностью отключить / удалить поддержку после того, как утечка исчезла.

1 Ответ

1 голос
/ 12 мая 2019

С раздел спецификации WebGL 5.14.10

Если массив, переданный в любую из векторных форм (заканчивающихся на v), имеет недопустимую длину, будет сгенерирована ошибка INVALID_VALUE. Длина недопустима, если она слишком коротка для или не является целым числом, кратным назначенному типу .

Вы проверили свою консоль JavaScript? Когда я попробовал это, я ясно увидел ошибку INVALID_VALUE в консоли.

код ниже

const gl = document.querySelector('canvas').getContext('webgl');
const vs = `
attribute vec4 position;
void main() {
  gl_Position = position;
}
`;
const fs = `
precision mediump float;
uniform vec3 color;
void main() {
  gl_FragColor = vec4(color, 1);
}
`;
const program = twgl.createProgram(gl, [vs, fs]);
const loc = gl.getUniformLocation(program, 'color');
gl.useProgram(program);
gl.uniform3fv(loc, [1, 2, 3, 4]);  // generates INVALID_VALUE
<script src="https://twgljs.org/dist/4.x/twgl.min.js"></script>
<canvas></canvas>

печать

enter image description here

в консоли JavaScript

Другими словами, ваша форма не была установлена ​​на 0,0,0. Вместо этого ваша gl.uniform3fv функция не была выполнена, так как она получила ошибку, и поэтому униформа была оставлена ​​с тем значением, которое она уже имела. Униформа по умолчанию равна 0, так что отсюда и пришли 0s

Если вы хотите перехватить ошибки такого рода во время отладки, попробуйте использовать эту вспомогательную библиотеку . В общем, я нахожу, что одного лишь взгляда на консоль JavaScript мне достаточно, чтобы понять причину проблемы.

...