WebGL - Örnek Uygulama

WebGL ve WebGL ardışık düzeninin (Grafik uygulamalarını işlemek için izlenen bir prosedür) temellerini tartıştık. Bu bölümde, WebGL'yi kullanarak bir üçgen oluşturmak için örnek bir uygulama alacağız ve uygulamada izlenen adımları izleyeceğiz.

WebGL Uygulamasının Yapısı

WebGL uygulama kodu, JavaScript ve OpenGL Shader Language kombinasyonudur.

  • CPU ile iletişim kurmak için JavaScript gereklidir
  • GPU ile iletişim kurmak için OpenGL Shader Language gereklidir.

Örnek Uygulama

Şimdi, 2B koordinatlarla basit bir üçgen çizmek için WebGL'nin nasıl kullanılacağını öğrenmek için basit bir örnek alalım.

<!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>

Aşağıdaki sonucu verecektir -

Yukarıdaki programı dikkatlice gözlemlerseniz, WebGL kullanarak basit bir üçgen çizmek için ardışık beş adımı izledik. Adımlar aşağıdaki gibidir -

Step 1 − Prepare the canvas and get WebGL rendering context

Mevcut HTML canvas nesnesini alıyoruz ve WebGL oluşturma bağlamını elde ediyoruz.

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

Köşeler, indeksler, renk vb. Geometrinin niteliklerini tanımlıyor ve bunları JavaScript dizilerinde saklıyoruz. Ardından, bir veya daha fazla tampon nesnesi oluştururuz ve verileri içeren dizileri ilgili tampon nesnesine geçiririz. Örnekte, üçgenin köşelerini bir JavaScript dizisinde saklıyoruz ve bu diziyi bir köşe tampon nesnesine geçiriyoruz.

Step 3 − Create and compile Shader programs

Vertex shader ve fragment shader programları yazıyor, derliyor ve bu iki programı birbirine bağlayarak kombine bir program oluşturuyoruz.

Step 4 − Associate the shader programs with buffer objects

Tampon nesnelerini ve birleşik gölgelendirici programını ilişkilendiriyoruz.

Step 5 − Drawing the required object (triangle)

Bu adım, rengi temizleme, arabellek bitini temizleme, derinlik testini etkinleştirme, görünüm bağlantı noktasını ayarlama vb. Gibi işlemleri içerir. Son olarak, yöntemlerden birini kullanarak gerekli temelleri çizmeniz gerekir - drawArrays() veya drawElements().

Tüm bu adımlar bu öğreticide daha ayrıntılı açıklanmıştır.