Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WebGL using gl-matrix library mat4.translate not running

I have this segment of code:

function setupWebGL() {
    gl.clearColor(0.1, 0.5, 0.1, 1.0);
    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.viewport(0,0,400,300);

    mat4.perspective(45, 400 / 300, 0.1, 100.0, pMatrix);
    mat4.identity(mvMatrix);
    mat4.translate(mvMatrix, [0, 0, -2.0]);
  }

And everything in the code runs except the very last line

mat4.translate(mvMatrix, [0, 0, -2.0]);

I know this because I put alert functions after every line until they failed to run (I need a better way of debugging in chrome, any suggestions?)

I'm using the gl-Matrix library found here https://github.com/toji/gl-matrix/blob/master/dist/gl-matrix-min.js

Any ideas on why that line is stopping the code execution?

Here is the full code:

<!doctype html>
    <html>
      <head>
       <title>WebGL - Chapter One - Lol</title>

<style>
  body{ background-color: grey; }
  canvas{ background-color: white; }
</style>
<script src = "gl-matrix-min.js"></script>
<script src = "raf_polyfill.js"></script>
<script id="shader-vs" type="x-shader/x-vertex">
  attribute vec3 aVertexPosition;
  attribute vec3 aVertexColor;

  uniform mat4 uMVMatrix;
  uniform mat4 uPMatrix;

  varying highp vec4 vColor;
  void main(void){
    gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
    vColor = vec4(aVertexColor, 1.0);
  }
</script>

<script id="shader-fs" type="x-shader/x-fragment">
  varying highp vec4 vColor;
  void main(void){
    gl_FragColor = vColor;
  }
</script>

<script>
  var gl = null,
      canvas = null,
      glProgram = null,
      fragmentShader = null,
      vertexShader = null;

  var vertexPositionAttribute = null,
      trianglesVerticeBuffer = null,
      vertexColorAttribute = null,
      trianglesColorBuffer = null;

  var angle = 0.0;

  var mvMatrix = mat4.create(),
      pMatrix = mat4.create();


  function initWebGL(){
    var canvas = document.getElementById("my-canvas");
    try{
      gl = canvas.getContext("experimental-webgl");
    }catch(e){}

    if(gl){

      initShaders();
      setupBuffers();

      getMatrixUniforms();

      animLoop();



    }else{
      alert("Error: Your browser does not appear to support WebGL.");
    }
  }
  function animLoop(){

          setupWebGL();

          setupDynamicBuffers();

          setMatrixUniforms();
          drawScene();
          requestAnimationFrame(animLoop,canvas);
  }

  function setupWebGL() {
    //sets the clear color to red lol
    gl.clearColor(0.1, 0.5, 0.1, 1.0);
    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.viewport(0,0,400,300);

    mat4.perspective(45, 400 / 300, 0.1, 100.0, pMatrix);
    mat4.identity(mvMatrix);
mat4.translate(mvMatrix, [0, 0, -2.0]);  

  }

  function initShaders(){
    var fs_source = document.getElementById("shader-fs").innerHTML;
    var vs_source = document.getElementById("shader-vs").innerHTML;


    //compile shaders
    vertexShader = makeShader(vs_source, gl.VERTEX_SHADER);
    fragmentShader = makeShader(fs_source, gl.FRAGMENT_SHADER);
    //create program
    glProgram = gl.createProgram();

    //attach and link shaders to the program
    gl.attachShader(glProgram, vertexShader);
    gl.attachShader(glProgram, fragmentShader);
    gl.linkProgram(glProgram);

    if (!gl.getProgramParameter(glProgram, gl.LINK_STATUS)) {
      alert("Unable to initialize the shader program.");
    }

    //use program
    gl.useProgram(glProgram);
  }

  function makeShader(src, type) {
    //compile the vertex shader
    var shader = gl.createShader(type);
    gl.shaderSource(shader, src);
    gl.compileShader(shader);

    if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
      alert("Error compiling shader: " + gl.getShaderInfoLog(shader));
    }

    return shader;
  }

  function getMatrixUniforms(){
      glProgram.pMatrixUniform = gl.getUniformLocation(glProgram, "uPMatrix");
      glProgram.mvMatrixUniform = gl.getUniformLocation(glProgram, "uMVMatrix");
  }
  function setMatrixUniforms(){
      gl.unifromMatrix4fv(glProgram.pMatrixUniform, false, pMatrix);
      gl.unifromMatrix4fv(glProgram.mvMatrixUniform, false, mvMatrix); 
  }

  function setupBuffers() {
    var triangleVerticeColors = [
         1.0, 0.0, 0.0,
         1.0, 1.0, 1.0,
         1.0, 0.0, 0.0,

         0.0, 0.0, 1.0,
         1.0, 1.0, 1.0,
         0.0, 0.0, 1.0
    ];

    trianglesColorBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, trianglesColorBuffer);
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVerticeColors), gl.STATIC_DRAW);
  }

  function setupDynamicBuffers(){

    var xTran = Math.sin(angle)/2.0;
    var triangleVertices = [
        -0.5 + xTran, 0.5, -0.5,
         0.0 + xTran, 0.0, -0.5,
        -0.5 + xTran, -0.5, -0.5,

         0.5 + xTran, 0.5, -0.5,
         0.0 + xTran, 0.0, -0.5,
         0.5 + xTran, -0.5, -0.5
    ];
    angle += 0.05;

    trianglesVerticeBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, trianglesVerticeBuffer);
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.DYNAMIC_DRAW);

  }

  function drawScene() {
    vertexPositionAttribute = gl.getAttribLocation(glProgram, "aVertexPosition");
    gl.enableVertexAttribArray(vertexPositionAttribute);
    gl.bindBuffer(gl.ARRAY_BUFFER, trianglesVerticeBuffer);
    gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);

    vertexColorAttribute = gl.getAttribLocation(glProgram, "aVertexColor");
    gl.enableVertexAttribArray(vertexColorAttribute);
    gl.bindBuffer(gl.ARRAY_BUFFER, trianglesColorBuffer);
    gl.vertexAttribPointer(vertexColorAttribute, 3, gl.FLOAT, false, 0, 0);
    gl.drawArrays(gl.TRIANGLES, 0, 6);
  }
</script>



</head>
<body onload="initWebGL()">
<canvas id="my-canvas" width="400" height="300">
    Your browser does not support the HTML5 canvas element.
</canvas>
</body>
</html>
like image 488
Jeremy Sayers Avatar asked Feb 09 '13 02:02

Jeremy Sayers


2 Answers

Use the new API:

Old API

mat4.translate(mvMatrix, [0, 0, -2.0]);

New API

var translation = vec3.create();
vec3.set (translation, 0, 0, -2.0);
mat4.translate (mvMatrix, mvMatrix, translation);
like image 166
circuitBurn Avatar answered Sep 30 '22 14:09

circuitBurn


You have a typo:

unifromMatrix4fv should be uniformMatrix4fv in function setMatrixUniforms.

I'm not sure if this fixes your problem or not, or why you thought your problem was with mat4.translate. You can always open the JavaScript console (F12 if you're running Chrome in Windows) and it'll tell you what the error is.

like image 20
Andrew Rasmussen Avatar answered Sep 30 '22 13:09

Andrew Rasmussen