WebGL - Terjemahan

Sejauh ini, kita telah membahas cara menggambar berbagai bentuk dan menerapkan warna di dalamnya menggunakan WebGL. Di sini, di bab ini, kita akan mengambil contoh untuk menunjukkan bagaimana menerjemahkan segitiga.

Terjemahan

Terjemahan adalah salah satunya affine transformationsdisediakan oleh WebGL. Menggunakan terjemahan, kita bisa memindahkan segitiga (benda apa pun) pada bidang xyz. Misalkan kita memiliki segitiga [a, b, c] dan kita ingin memindahkan segitiga ke posisi 5 unit ke arah sumbu X positif dan 3 unit ke arah sumbu Y positif. Maka simpul baru akan menjadi [a + 5, b + 3, c + 0]. Artinya, untuk menerjemahkan segitiga, kita perlu menambahkan jarak terjemahan, katakanlah, tx, ty, tz ke setiap simpul.

Karena itu adalah per-vertex operation, kita bisa membawanya dalam program shader vertex.

Di vertex shader, bersama dengan atributnya, coordinates(yang memegang posisi puncak), kami mendefinisikan variabel seragam yang memegang jarak terjemahan (x, y, z). Kemudian, kami menambahkan variabel seragam ini ke variabel koordinat dan menetapkan hasilnya kegl_Position variabel.

Note - Karena shader simpul akan dijalankan pada setiap simpul, semua simpul dari segitiga akan diterjemahkan.

Langkah-langkah untuk Menerjemahkan Segitiga

Langkah-langkah berikut diperlukan untuk membuat aplikasi WebGL menggambar segitiga dan kemudian menerjemahkannya ke posisi baru.

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

Pada langkah ini, kita mendapatkan objek konteks Rendering WebGL menggunakan getContext().

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

Karena kita menggambar segitiga, kita harus melewati tiga simpul segitiga, dan menyimpannya dalam buffer.

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

Pada langkah ini, Anda perlu menulis program shader vertex dan shader fragmen, mengompilasinya, dan membuat program gabungan dengan menautkan kedua program ini.

  • Vertex Shader- Di vertex shader program, kami mendefinisikan atribut vektor untuk menyimpan koordinat 3D. Bersamaan dengan itu, kami mendefinisikan variabel seragam untuk menyimpan jarak terjemahan, dan akhirnya, kami menambahkan dua nilai ini dan menetapkannyagl_position yang memegang posisi akhir dari simpul.

var vertCode =
   'attribute vec4 coordinates;' +
   'uniform vec4 translation;'+
   'void main(void) {' +
      ' gl_Position = coordinates + translation;' +
   '}';
  • Fragment Shader - Di shader fragmen, kita cukup menetapkan warna fragmen ke variabel gl_FragColor.

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

Step 4 − Associate the Shader Programs to the Buffer Objects

Pada langkah ini, kami mengaitkan objek buffer dengan program shader.

Step 5 − Drawing the Required Object

Karena kita menggambar segitiga menggunakan indeks, kita akan menggunakan metode ini drawArrays(). Untuk metode ini, kita harus melewatkan jumlah simpul / elemen untuk dipertimbangkan. Karena kita menggambar segitiga, kita akan melewatkan 3 sebagai parameter.

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

Contoh - Terjemahkan Segitiga

Contoh berikut menunjukkan cara menerjemahkan segitiga pada bidang xyz.

<!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(); 
			
         //Create a new buffer
         gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);   
			
         //bind it to the current buffer			
         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); 
			
         // Pass the buffer data
         gl.bindBuffer(gl.ARRAY_BUFFER, null);  
            
         /*========================Shaders============================*/
            
         //vertex shader source code 
         var vertCode =
            'attribute vec4 coordinates;' + 
            'uniform vec4 translation;'+
            'void main(void) {' +
               '  gl_Position = coordinates + translation;' +
            '}';
            
         //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);
   
         /* ===========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); 
   
         /* ==========translation======================================*/
         var Tx = 0.5, Ty = 0.5, Tz = 0.0;
         var translation = gl.getUniformLocation(shaderProgram, 'translation');
         gl.uniform4f(translation, Tx, Ty, Tz, 0.0);
 
         /*=================Drawing the riangle and transforming it========================*/ 

         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>

Jika Anda menjalankan contoh ini, itu akan menghasilkan keluaran berikut -