WebGL - Ölçeklendirme

Bu bölümde, WebGL kullanarak bir üçgenin ölçeğini nasıl değiştireceğimizi göstermek için bir örnek alacağız.

Ölçeklendirme

Ölçeklendirme, bir nesnenin boyutunu büyütmekten veya küçültmekten başka bir şey değildir. Örneğin, bir üçgenin [a, b, c] boyutunda köşeleri varsa, [2a, 2b, 2c] köşeli üçgen, boyutunun iki katı olacaktır. Bu nedenle, bir üçgeni ölçeklemek için, her bir köşeyi ölçekleme faktörüyle çarpmanız gerekir. Ayrıca belirli bir tepe noktasını ölçekleyebilirsiniz.

Bir üçgeni ölçeklemek için, programın köşe gölgelendiricisinde, tek tip bir matris oluşturup koordinat değerlerini bu matrisle çarpıyoruz. Daha sonra çapraz konumlarda (son köşegen konum 1) x, y, z koordinatlarının ölçeklendirme faktörlerine sahip 4 × 4 diyagonal bir matrisi geçiyoruz.

Gerekli Adımlar

Bir üçgeni ölçeklemek için bir WebGL uygulaması oluşturmak için aşağıdaki adımlar gereklidir.

Step 1 − Prepare the Canvas and Get the WebGL Rendering Context

Bu adımda, WebGL Rendering bağlam nesnesini kullanarak elde ederiz. getContext().

Step 2 − Define the Geometry and Store it in the Buffer Objects

Bir üçgen çizdiğimiz için, üçgenin üç köşesini geçmeli ve bunları tamponlarda saklamalıyız.

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

Step 3 − Create and Compile the Shader Programs

Bu adımda, köşe gölgelendiricisi ve parça gölgelendirici programlarını yazmanız, bunları derlemeniz ve bu iki programı birbirine bağlayarak birleşik bir program oluşturmanız gerekir.

  • Vertex Shader- Programın köşe gölgelendiricisinde, 3B koordinatları depolamak için bir vektör niteliği tanımlarız. Bununla birlikte, ölçeklendirme faktörlerini depolamak için tek tip bir matris tanımlıyoruz ve son olarak bu iki değeri çarpıp,gl_position köşelerin son konumunu tutan.

var vertCode =
   'attribute vec4 coordinates;' +
   'uniform mat4 u_xformMatrix;' +
   'void main(void) {' +
      ' gl_Position = u_xformMatrix * coordinates;' +
   '}';
  • Fragment Shader - Parça gölgelendiricide, parça rengini basitçe gl_FragColor değişken.

var fragCode = 'void main(void) {' +' gl_FragColor = vec4(1, 0.5, 0.0, 1);' +'}';

Step 4 − Associate the Shader Programs with the Buffer Objects

Bu adımda tampon nesnelerini gölgelendirici programı ile ilişkilendiriyoruz.

Step 5 − Drawing the Required Object

Üçgeni indisler kullanarak çizdiğimiz için, drawArrays()yöntem. Bu yönteme, dikkate alınacak köşe / eleman sayısını iletmeliyiz. Üçgen çizdiğimiz için parametre olarak 3'ü geçeceğiz.

gl.drawArrays(gl.TRIANGLES, 0, 3);

Örnek - Üçgeni Ölçekleme

Aşağıdaki örnek bir üçgenin nasıl ölçekleneceğini gösterir -

<!doctype html>
<html>
   <body>
      <canvas width = "300" height = "300" id = "my_Canvas"></canvas>

      <script>
         /*=================Creating a canvas=========================*/
         var canvas = document.getElementById('my_Canvas');
         gl = canvas.getContext('experimental-webgl'); 

         /*===========Defining and storing the geometry==============*/
         var vertices =  [
            -0.5,0.5,0.0, 	
            -0.5,-0.5,0.0, 	
            0.5,-0.5,0.0,   
         ];

         //Create an empty buffer object and store vertex data

         var vertex_buffer = gl.createBuffer();                                                     
         gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);                                                
         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);           
         gl.bindBuffer(gl.ARRAY_BUFFER, null);  

         /*========================Shaders============================*/

         //Vertex shader source code
         var vertCode =
            'attribute vec4 coordinates;' + 
            'uniform mat4 u_xformMatrix;' +
            'void main(void) {' +
               '  gl_Position = u_xformMatrix * coordinates;' +
            '}';

         //Create a vertex shader program object and compile it                
         var vertShader = gl.createShader(gl.VERTEX_SHADER);
         gl.shaderSource(vertShader, vertCode);
         gl.compileShader(vertShader);

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

         //Create a fragment shader program object and compile it 
         var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
         gl.shaderSource(fragShader, fragCode);
         gl.compileShader(fragShader);

         //Create and use combiened shader program
         var shaderProgram = gl.createProgram();
         gl.attachShader(shaderProgram, vertShader);
         gl.attachShader(shaderProgram, fragShader);
         gl.linkProgram(shaderProgram);

         gl.useProgram(shaderProgram); 

         /*===================scaling==========================*/

         var Sx = 1.0, Sy = 1.5, Sz = 1.0;
         var xformMatrix = new Float32Array([
            Sx,   0.0,  0.0,  0.0,
            0.0,  Sy,   0.0,  0.0,
            0.0,  0.0,  Sz,   0.0,
            0.0,  0.0,  0.0,  1.0  
         ]);

         var u_xformMatrix = gl.getUniformLocation(shaderProgram, 'u_xformMatrix');
         gl.uniformMatrix4fv(u_xformMatrix, false, xformMatrix);

         /* ===========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);

         /*=================Drawing the Quad========================*/ 
         gl.clearColor(0.5, 0.5, 0.5, 0.9);
         gl.enable(gl.DEPTH_TEST);

         gl.clear(gl.COLOR_BUFFER_BIT);
         gl.viewport(0,0,canvas.width,canvas.height);
         gl.drawArrays(gl.TRIANGLES, 0, 3);
      </script>
   </body>
</html>

Bu örneği çalıştırırsanız, aşağıdaki çıktıyı üretir -