三、在Canvas中使用WebGL


  上一篇介紹了如何在<canvas>標簽中繪制2d圖形;接下來,我們看看如何在<canvas>中使用WebGL來繪制3d圖形。

  我們開始編寫一個最短的WebGL程序:Hello WebGL;這個程序的功能非常簡單,使用指定顏色清空<canvas>標簽的繪圖區;下圖顯示了程序運行的效果,清空(用黑色)了<canvas>定義的矩形區域。

 

  我們來看下代碼,先看一下Hello WebGL.html:

 1 <!doctype html>
 2 <html>
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="Generator" content="EditPlus®">
 6     <meta name="Author" content="Mirror">
 7     <meta name="Keywords" content="">
 8     <meta name="Description" content="">
 9     <title>Document</title>
10     <!--《WebGL編程指南》的作者為讀者編寫的WebGL輔助函數-->
11     <script src="lib/webgl-utils.js"></script>
12     <script src="lib/webgl-debug.js"></script>
13     <script src="lib/cuon-utils.js"></script>
14     <script>
15         function main() { 16             //獲取<canvas>標簽。
17             var canvas = document.getElementById("myCanvas"); 18             //獲取WebGL繪圖上下文。
19             var gl = getWebGLContext(canvas); 20             //如果瀏覽器不支持WebGL則提示錯誤。
21             if (!gl) { 22  console.log("Failed to get the rendering context for WebGL."); 23                 return; 24  } 25             //指定清除顏色緩沖區的顏色。
26  gl.clearColor(0,0,0,1); 27             //用指定的顏色清除顏色緩沖區。
28  gl.clear(gl.COLOR_BUFFER_BIT); 29  } 30     </script>
31 </head>
32 <body onload="main()">
33     <!--定義<canvas>標簽,通過width屬性和height屬性規定它是一片400×400的繪制區域-->
34     <canvas id="myCanvas" width="400" height="400">
35         <!--當瀏覽器不支持時,會直接忽略<canvas>標簽,而直接顯示下面這一行提示-->
36  Please use the browser supporting "canvas". 37     </canvas>
38 </body>
39 </html>
Hello WebGL.html

  文件結構很簡單:首先使用<canvas>元素定義繪圖區域;然后指定當頁面加載完成時,調用main()函數。

  在main()函數中,我們通過id找到<canvas>標簽;直到這一步,我們發現,跟繪制2d圖形的步驟是一模一樣的。但是下一句,獲取繪圖上下文,好像有點不一樣了;在繪制2d圖形的時候,我們是通過調用canvas的getContext方法,傳入“2d”參數來獲取2d圖形的回繪圖上下文的;這里需要解釋一下,通常來說,我們應該使用canvas.getContext()函數來獲取繪圖上下文(就像之前那樣)。但是在獲取WebGL繪圖上下文時,canvas.getContext()函數接收的參數,在不同瀏覽器中會不同(雖然大部分瀏覽器都接收字符串“expeimental-webgl”或“webgl”,但並非所有瀏覽器都這樣),所以我們使用getWebGLContext(canvas)來隱藏不同瀏覽器之間的差異。getWebGLContext(canvas, opt_debug)函數位於cuon-utils.js文件中。在代碼里,通過<script>標簽引入了3個js文件,這3個js文件是《WebGL編程指南》的作者寫的,里面包含了一些對WebGL編程有用的輔助函數;

  getWebGLContext(canvas, opt_debug)函數的功能是:獲取WebGL繪圖上下文;如果開啟了debug屬性,遇到錯誤時將在控制台顯示錯誤消息。以下是該函數的具體說明:

 

  在獲取到繪圖上下文以后,我們就可以繪制圖形了,並且可以繪制3d圖形了;這也說明,WebGL已經調用成功,我們現在可以使用WebGL函數了。我們將上下文放到名為gl的變量中。有了這個上下文,我們就可以設置顏色來清除<canvas>標簽指定的繪圖區了。在之前繪制2d圖形時,我們在繪制之前就指定了繪圖顏色。在WebGL中,是相似的,清空繪圖區之前也需要指定顏色。gl.clearColor(RGBA)函數通過傳入RGBA格式的顏色參數指定顏色。我們在代碼中指定了黑色,也可以隨意指定其他顏色。在繪制2d圖形時,RGBA每個分量的取值范圍是0-255之間;但是在WebGL中,每個分量的取值范圍是0-1,這和OpenGL保持了一致。一旦指定了顏色,這個顏色就會駐存在WebGL系統中,直到你重新指定新的顏色。在這之前,你可以無數次的使用該顏色進行清除繪圖區而無須重新指定。

  清除繪圖區我們使用 gl.clear(gl.COLOR_BUFFER_BIT)函數;你可能覺得很奇怪,參數不應該是表示繪圖區的<canvas>嗎?這是由於gl.Clear()函數繼承自OpenGL,它基於多基本緩沖區模型,比二維繪圖上下文要復雜得多。清空繪圖區,實際上是在清空顏色緩沖區(通過指定的顏色去擦除已經繪制的內容),傳遞gl.COLOR_BUFFER_BIT參數就是在告訴WebGL清空顏色緩沖區。如果在使用該函數之前我們沒有指定任何顏色,那么默認會以RGBA(0,0,0,0)作為清除顏色,這個顏色是全透明的,替換出來的結果就是什么顏色都沒有,顯示為瀏覽器本身的顏色。

  這一章我們介紹了如何建立一個WebGL程序以及使用一些簡單的WebGL相關函數,下一章我們介紹如何使用WebGL繪制基本圖形。

  原文中引用的的js包 點擊下載】 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM