在支持WebGL的瀏覽器中,WebGL的名字爲 "experimental-webgl",這是因爲 webgl 的規範仍未制定完成web
制定完成後名字就會改成簡單的 "webgl"canvas
若是瀏覽器不支持,那麼在獲取webgl上下文的時候瀏覽器會返回 null 因此在使用前須要檢測返回值數組
基本的獲取 WebGL 代碼以下:瀏覽器
let drawing = document.getElementById("drawing"); // 檢測瀏覽器是否支持canvas if(drawing.getContext){ let gl = drawing.getContext("experimental-webgl"); if(gl){ // code } }
此外在獲取 webgl 上下文時能夠經過傳入第二個參數對象來設置一些選項學習
支持的配置對象屬性以下:webgl
在部分瀏覽器中若是 getContext() 沒法獲取webgl上下文會拋出錯誤,因此最好將調用封裝到 try-catch 塊中spa
let drawing = document.getElementById("drawing");
let gl; // 檢測瀏覽器是否支持canvas if(drawing.getContext){ try{ gl = drawing.getContext("experimental-webgl"); }catch(e){} if(gl){ // code }else{ alert("WebGL context could not be created"); } }
若是使用過 OpenGL 的小夥伴可能對其中常常使用的常量都有所瞭解code
WebGL中的常量都保存在剛纔獲取到的 WebGL 上下文中,這些常量的名稱與 OpenGL的常量有所區別即沒有 GL_ 前綴orm
例如 GL_COLOR_BUFFER_BIT 在WebGL中爲 gl.COLOR_BUFFER_BIT 對象
WebGL經過這種方式來支持大多數 OpenGL 常量(有一部分的常量不提供支持)
在開始WebGL的具體操做的學習以前,有一些WebGL\OpenGL的小常識須要瞭解
其中比較重要的就是方法的命名方式了
這些方法的命名經過後綴會告訴咱們這個方法接收幾個參數,以及這幾個參數的類型
例如: gl.uniform4f() 的 4f 則表示接受4個浮點數, gl.uniform3i()則表示接受3個整數
此外 gl.uniform3iv() 的 3iv 最後的 v 則表示 vector 因此即該方法接收 3個整數類型的數組
在開始使用 WebGL 進行繪圖以前,通常來講都須要使用某種實色來清空 canvas,爲繪圖作準備
步驟須要如下兩行代碼:
gl.clearColor(0,0,0,1); // 設置用於清除的實色 gl.clear(gl.COLOR_BUFFER_BIT);// 使用剛剛設置的實色來清空 canvas
在清除canvas後,下一個步驟則須要定義 WebGL的視口
默認狀況下,WebGL可以使用整個 canvas 的區域
若是須要改變視口的大小,那麼能夠調用 viewport 方法來調整視口大小
gl.viewport(0,0,drawing.width/2,drawing.height/2);
須要注意的是 這裏的 (0,0)點和一般的網頁座標不一致這裏的 0,0 在canvas 的左下角,通常的網頁座標在左上角
此外在 WebGL 視口的內部,(0,0)點則在 剛纔定義的視口的正中心,在繪製過程當中,若是使用了超出視口範圍的座標那麼該部分會被剪切掉
在操做中通常來講數據都是保存在 JS 的類型化數組中
不過在使用時不能直接經過 JS 類型化數組來進行使用,須要先將輸入放入 WebGL 的緩衝區
整體步驟爲: 建立緩衝區->綁定緩衝區->填充緩衝區
代碼以下:
let buffer = gl.createBuffer(); gl.bindBuffer (gl.ARRAY_BUFFER,buffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0,0.5,1]),gl.STATIC_DRAW);
其中 bufferData()的第三個參數用於指定使用緩衝區的方式
取值範圍是以下幾個常量:
而釋放緩衝區則簡單得多,調用 deleteBuffer() 便可
gl.deleteBuffer(buffer);