Code Monkey home page Code Monkey logo

gl-utils's Introduction

glUtils

glUtils is a bare-bones WebGL library abstracting away the more common boilerplate WebGL code, while still allowing one to use the API directly.

Demonstrations of glUtils functionality can be found in the examples directory and in most of my WebGL experiments.

Usage

The WebGL context is acquired using glUtils.getGL(), passing a canvas element to it as argument (it is assumed the canvas has already had its width and height set):

  var gl = glUtils.getGL(document.getElementById("webgl"));

A program is set up using glUtils.getProgram() and passing it the WebGL context, and the ids of elements in the page containing the vertex and fragment shader code:

  var program = glUtils.getProgram(gl, "vertex-shader", "fragment-shader");

Any errors in the compilation or linking will be printed to the console.

References to shader attributes and uniforms can be acquired using glUtils.getGLVars():

  var gl_vars = glUtils.getGLVars(gl, program, {
    attributes: ["aPosition", "aColor"],
    uniforms: ["uMVP"]
  });

glUtils.getGLVars() returns an object containing the variable names as keys and their references as values, e.g. gl_vars.aPosition, gl_vars.uMVP.

Attribute buffers can be prepared using glUtils.setBuffer(), passing the WebGL context, attribute reference, data and item size as arguments. The created buffer object is returned:

  var position_buffer = glUtils.setBuffer(gl, gl_vars.aPosition, vertices, 3);

When switching between programs, it might be necessary to rebind buffer objects, and this can be done using glUtils.enableBuffer(), passing the WebGL context, attribute reference, buffer object and item size as arguments:

  glUtils.enableBuffer(gl, gl_vars.aPosition, position_buffer, 3);

Textures can be loaded using glUtils.loadTexture(), which takes the WebGL context, texture unit and image object as arguments:

  glUtils.loadTexture(gl, gl.TEXTURE0, texture_image);

glUtils.loadTexture() defaults to common options for filtering and wrap modes. These can be overridden by passing it additional options:

  glUtils.loadTexture(gl, gl.TEXTURE0, texture_image, {
    min_filter: gl.LINEAR,
    mag_filter: gl.LINEAR,
    wrap_s: gl.CLAMP_TO_EDGE,
    wrap_t: gl.CLAMP_TO_EDGE
  });

glUtils also provides two utility methods for creating the geometry of basic shapes:

  var sphere = glUtils.createSphere({
    long_bands: 32,
    lat_bands: 32,
    radius: 1
  });

  var box = glUtils.createBox({
    dimensions: [1, 2, 1]
  });

Both return objects containing properties vertices, the vertex positions, normals, the vertex normals, and texture_coords, the texture coordinates.

Math Modules

glUtils provides two modules, glUtils.vec3 and glUtils.mat4, to help with common mathematical operations on the typed arrays used by WebGL. The API for these modules is heavily influenced by gl-matrix.

glUtils.vec3 provides the following functions:

  • vec3.create(x, y, z): create a vec3 (a 3-element Float32Array). Elements will default to 0.
  • vec3.copy(v1, v2): copy elements of v2 into v1.
  • vec3.clone(v): create a clone of v.
  • vec3.length(v): calculate the length of vector v.
  • vec3.scale(v, s): scale vector v by a factor of s.
  • vec3.normalize(v): normalize vector v.
  • vec3.add(out, v1, v2): add vectors v1 and v2, store result in out.
  • vec3.sub(out, v1, v2): subtract vector v2 from vector v1, store result in out.
  • vec3.dot(v1, v2): calculate the dot product of vectors v1 and v2.
  • vec3.cross(out, v1, v2): calculate the cross product of vectors v1 and v2, store result in out.
  • vec3.applyMat4(out, m, v, vector_transform): apply transformation represented by matrix m to the vector or point represented by v, store result in out. If vector_transform is set to true, the multiplication will occur as if v had a fourth element set to 0. Otherwise, it will occur as if v had a fourth element set to 1. The matrix m is represented by a 16-element array in column-major order.
  • vec3.random(): create a vec3 with elements set to random numbers between 0 and 1.

glUtils.mat4 provides the following functions:

  • mat4.create(m0, m1, m2...): create a mat4 (a 16-element Float32Array in column-major order). Elements will default to elements of the identity matrix.
  • mat4.copy(m1, m2): copy elements of m2 into m1.
  • mat4.clone(m): create a clone of m.
  • mat4.identity(m): set m to the identity matrix.
  • mat4.translation(m, x, y, z): set m to a matrix that translates points by (x, y, z).
  • mat4.scaling(m, x, y, z): set m to a matrix that scales points or vectors by (x, y, z). If only one scaling factor is given, it will be used for all three axes.
  • mat4.rotationX(m, theta): set m to a matrix that rotates points or vectors around the x-axis by theta radians.
  • mat4.rotationY(m, theta): set m to a matrix that rotates points or vectors around the y-axis by theta radians.
  • mat4.rotationZ(m, theta): set m to a matrix that rotates points or vectors around the z-axis by theta radians.
  • mat4.mult(out, m1, m2): multiply matrices m1 and m2, store result in out.
  • mat4.transpose(m): find the transpose of m (occurs in-place).
  • mat4.det(m): calculate the determinant of m.
  • mat4.invert(m): find the inverse of m (occurs in-place).
  • mat4.lookAt(m, eye, at, up): set m to a view matrix for a camera described by the point eye, and the vectors at and up (all 3-element arrays).
  • mat4.ortho(m, left, right, bottom, top, near, far): set m to an orthographic projection matrix.
  • mat4.perspective(m, yfov, aspect, near, far): set m to a perspective projection matrix.
  • mat4.random(): create a mat4 with elements set to random numbers between 0 and 1.

gl-utils's People

Contributors

tsherif avatar

Watchers

James Cloos avatar aseaboyer avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.