WebGL: aplicación de muestra

Hemos discutido los conceptos básicos de WebGL y la canalización de WebGL (un procedimiento que se sigue para renderizar aplicaciones de gráficos). En este capítulo, vamos a tomar una aplicación de muestra para crear un triángulo usando WebGL y observar los pasos seguidos en la aplicación.

Estructura de la aplicación WebGL

El código de la aplicación WebGL es una combinación de JavaScript y OpenGL Shader Language.

  • Se requiere JavaScript para comunicarse con la CPU
  • Se requiere OpenGL Shader Language para comunicarse con la GPU.

Aplicación de muestra

Tomemos ahora un ejemplo simple para aprender a usar WebGL para dibujar un triángulo simple con coordenadas 2D.

<!doctype html>
<html>
   <body>
      <canvas width = "300" height = "300" id = "my_Canvas"></canvas>
		
      <script>
         /* Step1: Prepare the canvas and get WebGL context */

         var canvas = document.getElementById('my_Canvas');
         var gl = canvas.getContext('experimental-webgl');

         /* Step2: Define the geometry and store it in buffer objects */

         var vertices = [-0.5, 0.5, -0.5, -0.5, 0.0, -0.5,];

         // Create a new buffer object
         var vertex_buffer = gl.createBuffer();

         // Bind an empty array buffer to it
         gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
         
         // Pass the vertices data to the buffer
         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);

         // Unbind the buffer
         gl.bindBuffer(gl.ARRAY_BUFFER, null);

         /* Step3: Create and compile Shader programs */

         // Vertex shader source code
         var vertCode =
            'attribute vec2 coordinates;' + 
            'void main(void) {' + ' gl_Position = vec4(coordinates,0.0, 1.0);' + '}';

         //Create a vertex shader object
         var vertShader = gl.createShader(gl.VERTEX_SHADER);

         //Attach vertex shader source code
         gl.shaderSource(vertShader, vertCode);

         //Compile the vertex shader
         gl.compileShader(vertShader);

         //Fragment shader source code
         var fragCode = 'void main(void) {' + 'gl_FragColor = vec4(0.0, 0.0, 0.0, 0.1);' + '}';

         // Create fragment shader object
         var fragShader = gl.createShader(gl.FRAGMENT_SHADER);

         // Attach fragment shader source code
         gl.shaderSource(fragShader, fragCode);

         // Compile the fragment shader
         gl.compileShader(fragShader);

         // Create a shader program object to store combined shader program
         var shaderProgram = gl.createProgram();

         // Attach a vertex shader
         gl.attachShader(shaderProgram, vertShader); 
         
         // Attach a fragment shader
         gl.attachShader(shaderProgram, fragShader);

         // Link both programs
         gl.linkProgram(shaderProgram);

         // Use the combined shader program object
         gl.useProgram(shaderProgram);

         /* Step 4: Associate the shader programs to buffer objects */

         //Bind vertex buffer object
         gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);

         //Get the attribute location
         var coord = gl.getAttribLocation(shaderProgram, "coordinates");

         //point an attribute to the currently bound VBO
         gl.vertexAttribPointer(coord, 2, gl.FLOAT, false, 0, 0);

         //Enable the attribute
         gl.enableVertexAttribArray(coord);

         /* Step5: Drawing the required object (triangle) */

         // Clear the canvas
         gl.clearColor(0.5, 0.5, 0.5, 0.9);

         // Enable the depth test
         gl.enable(gl.DEPTH_TEST); 
         
         // Clear the color buffer bit
         gl.clear(gl.COLOR_BUFFER_BIT);

         // Set the view port
         gl.viewport(0,0,canvas.width,canvas.height);

         // Draw the triangle
         gl.drawArrays(gl.TRIANGLES, 0, 3);
      </script>
   </body>
</html>

Producirá el siguiente resultado:

Si observa el programa anterior con atención, hemos seguido cinco pasos secuenciales para dibujar un triángulo simple usando WebGL. Los pasos son los siguientes:

Step 1 − Prepare the canvas and get WebGL rendering context

Obtenemos el objeto de lienzo HTML actual y obtenemos su contexto de representación WebGL.

Step 2 − Define the geometry and store it in buffer objects

Definimos los atributos de la geometría como vértices, índices, color, etc., y los almacenamos en las matrices de JavaScript. Luego, creamos uno o más objetos de búfer y pasamos las matrices que contienen los datos al objeto de búfer respectivo. En el ejemplo, almacenamos los vértices del triángulo en una matriz de JavaScript y pasamos esta matriz a un objeto de búfer de vértice.

Step 3 − Create and compile Shader programs

Escribimos programas de sombreado de vértices y de fragmentos, los compilamos y creamos un programa combinado al vincular estos dos programas.

Step 4 − Associate the shader programs with buffer objects

Asociamos los objetos de búfer y el programa de sombreado combinado.

Step 5 − Drawing the required object (triangle)

Este paso incluye operaciones como borrar el color, borrar el bit del búfer, habilitar la prueba de profundidad, configurar el puerto de visualización, etc. Finalmente, debe dibujar las primitivas requeridas utilizando uno de los métodos: drawArrays() o drawElements().

Todos estos pasos se explican con más detalle en este tutorial.