Перевести 3d объект в WebGL - PullRequest
       9

Перевести 3d объект в WebGL

0 голосов
/ 20 октября 2018

Я пытаюсь переместить 3d-объект в приложении WebGL, проблема в том, что я получаю сообщение об ошибке:

ОШИБКА GL: GL_INVALID_OPERATION: glUniformMatrix4fv: неправильная универсальная функция для типа

// Vertex Shader

    var vertCode =
        'attribute vec4 coordinates;' + 
        'uniform vec4 translation;'+
        'void main(void) {' +
        'gl_Position = coordinates * translation;' +
    '}';

...

// Associating shaders to buffer objects 

         gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);    
         var coordinatesVar = gl.getAttribLocation(shaderProgram, "coordinates");
         gl.vertexAttribPointer(coordinatesVar, 3, gl.FLOAT, false, 0, 0);   
         gl.enableVertexAttribArray(coordinatesVar); 

// Translation
        var Tx = 0.5, Ty = 0.5, Tz =-0.5;
        var translationMatrix = new Float32Array([
            1,0,0,0,
            0,1,0,0,
            0,0,1,0,
            Tx,Ty,Tz,1
         ]);

         var translation = gl.getUniformLocation(shaderProgram, 'translation');
         gl.uniformMatrix4fv(translation, false, translationMatrix);

// Draw

    gl.clearColor(0.5, 0.5, 0.5, 0.9);
    gl.enable(gl.DEPTH_TEST);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    gl.viewport(0,0,canvas.width,canvas.height);
    gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0);

1 Ответ

0 голосов
/ 20 октября 2018

Тип униформы translation должен быть mat4, а не vec4.Это вызывает ошибку GL_INVALID_OPERATION, поскольку glUniformMatrix4fv не соответствует типу vec4.

Далее, вектор должен быть умножен на матрицу справа в вершинном шейдере:

attribute vec4 coordinates; 
uniform mat translation;
void main(void) {
    gl_Position = translation * coordinates; 
}

См. Программирование GLSL / Операции с векторами и матрицами :

Кроме того, * -оператор может использоваться для матрично-векторных произведений соответствующего измерения, например:

vec2 v = vec2(10., 20.);
mat2 m = mat2(1., 2.,  3., 4.);
vec2 w = m * v; // = vec2(1. * 10. + 3. * 20., 2. * 10. + 4. * 20.)

Обратите внимание, что вектор должен быть умножен наматрица справа .Если вектор умножается на матрицу слева, результат соответствует умножению вектора столбца на транспонированную матрицу справа.Это соответствует умножению вектора столбца на транспонированную матрицу справа:Таким образом, умножение вектора слева на матрицу соответствует умножению его справа на транспонированную матрицу:

vec2 v = vec2(10., 20.);
mat2 m = mat2(1., 2.,  3., 4.);
vec2 w = v * m; // = vec2(1. * 10. + 2. * 20., 3. * 10. + 4. * 20.)

Обратите внимание, если вы хотите умножить вектор на матрицуФорма справа,

gl_Position = coordinates * translation; 

, затем вы должны транспонировать матрицу.uniformMatrix4fv будет транспонировать матрицу, если будет установлен второй аргумент true:

gl.uniformMatrix4fv(translation, true, translationMatrix); 
...