В некоторых WebGL приложения, давайте предположим, что у нас есть вершинный шейдер GLSL, которая начинается так:WebGL: Как привязать значения к атрибуту mat4?
attribute vec4 foo1;
attribute vec4 foo2;
attribute vec4 foo3;
attribute vec4 foo4;
и некоторые соответствующий Javascript код для привязки структуры данных для этих атрибутов:
var buf = gl.createBuffer(), loc;
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([…]));
loc = gl.getAttribLocation(program, 'foo1');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc, 4, gl.FLOAT, false, 16, 0);
loc = gl.getAttribLocation(program, 'foo2');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc, 4, gl.FLOAT, false, 16, 4);
loc = gl.getAttribLocation(program, 'foo3');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc, 4, gl.FLOAT, false, 16, 8);
loc = gl.getAttribLocation(program, 'foo4');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc, 4, gl.FLOAT, false, 16, 12);
сейчас , в соответствии со спецификациями GL ES 2.0 атрибут вершинного шейдера может быть определен как float
, vec2
, vec3
, vec4
, mat2
, mat3
или mat4
.
Так что, если изменить код вершинного шейдера определить только один атрибут mat4
, как так ...
attribute mat4 foo;
... вопрос в том , что соответствующий JS-код, чтобы связать некоторые указатели на mat4
атрибут?
Я нашел вопрос mat3 attribute in WebGL, но ответ не достаточно явный. Читая ответы и некоторые другие документы, то кажется, что правильное решение по линиям:
loc = gl.getAttribLocation(program, 'foo');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc , 4, gl.FLOAT, false, 16, 0);
gl.vertexAttribPointer(loc+1, 4, gl.FLOAT, false, 16, 4);
gl.vertexAttribPointer(loc+2, 4, gl.FLOAT, false, 16, 8);
gl.vertexAttribPointer(loc+3, 4, gl.FLOAT, false, 16, 12);
я прав в предположении, что расположение 4 vec4
компонентов mat4
соседствовали всегда и в порядке возрастания? Является ли это документированным где-то?
Помимо этих местоположений, считающихся с пределом MAX_VERTEX_ATTRIBS
(обычно 16 в WebGL), есть ли какая-либо другая хорошая практика, о которой нужно знать?
Спасибо - что особенно немного спецификации ускользала от меня ! (также я скопировал код слишком быстро, чтобы указать байты из 4-байтных групп отдельно) – IvanSanchez