在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ WebGL平移
WebGL Context上下文
WebGL圖形管線
WebGL示例程序
WebGL交互式立方體
WebGL繪制三角形
WebGL幾何體
WebGL繪制模型
WebGL基礎(chǔ)
WebGL平移
WebGL教程
WebGL繪圖的模式
WebGL縮放
WebGL繪制點(diǎn)
WebGL顏色
WebGL旋轉(zhuǎn)
WebGL繪制四邊形
WebGL著色器程序
WebGL基本圖形概念
WebGL立方體旋轉(zhuǎn)
WebGL關(guān)聯(lián)屬性和緩沖區(qū)對(duì)象
Html5 Canvas介紹
WebGL著色器

WebGL平移

到目前為止,我們討論了如何繪制各種形狀和使用 WebGL 應(yīng)用它們的顏色。在本章中,我們將舉個(gè)例子來說明如何平移一個(gè)三角形。


平移

平移是由 WebGL 提供的仿射變換之一。使用平移,我們可以繼續(xù)在XYZ平面三角形(任何對(duì)象)。假設(shè)我們有一個(gè)三角形[A,B,C],我們想的三角形移動(dòng)到的位置上是5個(gè)單位向著X軸正和3個(gè)單位向正Y軸。然后將新的頂點(diǎn)。將[A +5,B +3,C +0]。這意味著,平移三角形,我們需要添加平移距離,比方說,tx, ty, tz 到每個(gè)頂點(diǎn)。
既然是每個(gè)頂點(diǎn)的操作,我們可以在頂點(diǎn)著色器程序?qū)崿F(xiàn)它。
在頂點(diǎn)著色器,伴隨著屬性,坐標(biāo)(持有頂點(diǎn)位置),我們定義了容納平移距離(X,Y,Z)變量。之來我們這個(gè)統(tǒng)一的變量添加到變量中的坐標(biāo)和分配結(jié)果到gl_Position 變量。
注 - 由于頂點(diǎn)著色器將在每個(gè)頂點(diǎn)上運(yùn)行,三角形的所有頂點(diǎn)將被平移。

轉(zhuǎn)換一個(gè)三角形步驟

下面的步驟是必需的,以建立一個(gè)WebGL的應(yīng)用來繪制三角形,然后將其平移到一個(gè)新的位置。


第1步 - 準(zhǔn)備Canvas和獲取WebGL渲染上下文

在此步驟中,我們使用getContext()得到 WebGL 渲染上下文對(duì)象。


第2步 - 定義幾何并將其存儲(chǔ)在緩沖區(qū)對(duì)象
因?yàn)槲覀儺嬕粋€(gè)三角形,我們必須通過三角形的三個(gè)頂點(diǎn),并將它們存儲(chǔ)在緩沖區(qū)中。
var vertices = [ -0.5,0.5,0.0, -0.5,-0.5,0.0, 0.5,-0.5,0.0, ];
第3步 - 創(chuàng)建和編譯著色器程序
在這一步中,你需要編寫的頂點(diǎn)著色器和片段著色器程序,編譯它們,并通過連接這兩個(gè)程序?qū)?chuàng)建一個(gè)合并程序。
  • 頂點(diǎn)著色器 - 在程序的頂點(diǎn)著色器,我們定義一個(gè)向量屬性來存儲(chǔ)三維坐標(biāo)。除了它,我們定義存儲(chǔ)平移的距離一個(gè)統(tǒng)一變量,最后,我們添加這兩個(gè)值并將其分配給 gl_position 它保存頂點(diǎn)的最終位置。
var vertCode =
   'attribute vec4 coordinates;' +
   'uniform vec4 translation;'+
   'void main(void) {' +
      ' gl_Position = coordinates + translation;' +
   '}';
  • 片段著色器 - 在片段著色器,我們只分配片段顏色變 gl_FragColor。
var fragCode = 'void main(void) {' +' gl_FragColor = vec4(1, 0.5, 0.0, 1);' +'}';
第4步 - 關(guān)聯(lián)著色器程序到緩沖區(qū)對(duì)象

在這一步,我們關(guān)聯(lián)著色器程序到緩沖器的對(duì)象。


第5步 - 繪制所需的對(duì)象
由于我們使用索引繪制三角形,我們將使用 drawArrays() 方法。該方法,我們必須通過被認(rèn)為是對(duì)頂點(diǎn)/元件的數(shù)目。因?yàn)槲覀儺嬕粋€(gè)三角形,我們將通過傳遞 3 作為一個(gè)參數(shù)。
gl.drawArrays(gl.TRIANGLES, 0, 3);

示例 - 平移三角形

下面的例子演示了如何在 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.vertexAttribYiibaier(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>

這將產(chǎn)生以下結(jié)果 -