準備WebGL Canvas - OpenHome.cc

文章推薦指數: 80 %
投票人數:10人

透過WebGL,瀏覽器可以將大部份的繪圖渲染運算,送進專司影像運算的圖形處理器(Graphics Processing Unit,GPU),從而增加瀏覽器上的繪圖效率,若對HTML5 Canvas ... 回WebGL 最近玩3D建模發現了SculptGL,一個簡單、基於瀏覽器的雕塑應用程式,執行之流暢令人驚奇。

SculptGL的底層是基於WebGL,WebGL則是基於OpenGLES(OpenGLforEmbeddedSystems),這是OpenGL(OpenGraphicsLibrary)的嵌入式系統特化版本,至於OpenGL應該不用多做解釋了,玩2D、3D渲染的開發者,都知道的高效程式庫。

透過WebGL,瀏覽器可以將大部份的繪圖渲染運算,送進專司影像運算的圖形處理器(GraphicsProcessingUnit,GPU),從而增加瀏覽器上的繪圖效率,若對HTML5CanvasAPI、SVG繪圖等在效率上不滿意的話,可以試著使用基於WebGL的程式庫,像是PixiJS、Three.js等,或者直接玩WebGL。

WebGL常被誤解為一套JavaScriptAPI,確實地,開發者可以透過JavaScript來處理HTML頁面、與使用者的互動等,並呼叫WebGL制訂的JavaScriptAPI與著色器程式進行溝通,然而,撰寫著色器程式需要GLSL(OpenGLShadingLanguage),這是一個類似C語言的程式語言。

開發者需要使用GLSL撰寫著色器(Shader),透過JavaScriptAPI編譯、為Canvas繫結、建立著色器並送入GPU,之後透過JavaScript將繪圖需要的資料透過API送給著色器程式來渲染,也就是說,想要認識WebGL,對GLSL的認識也是不可少的。

圖像最後是在Canvas上渲染的,因此起手式就是準備一個Canvas,就WebGL第一個範例來說,目標就設定在令Canvas使用整個瀏覽器視埠(viewport),背景為黑色,暫時不會涉及GLSL與著色器! 無論如何,先有個Canvas再說:

HelloCanvas 在這邊,Canvas的大小是640x480對吧!?你指的是哪個大小?DOM元素本身的尺寸還是顯示尺寸呢?因為這個HTML頁面沒有任何CSS設置,因此DOM元素本身尺寸是640x480,顯示尺寸也會是640x480,不過,若是使用了CSS來調整其寬高: HelloCanvas 這個HTML頁面中的Canvas,像素是640x480,然而顯示尺寸也會是1024x768,這會如何?若在上頭繪圖,顯示的結果就會像是將一張640x480的點陣圖拉大兩倍,結果可能就會出現鋸齒狀的圖像。

也就是說,HTML標籤的width、height調整的DOM元素的尺寸,也可以透過DOM元素的width、height特性取得或設定值;CSS的width、height調整的是顯示尺寸,可以透過DOM元素的clientWidth、clientHeight特性取得或設定值,或者是透過window.getComputedStyle取得運算樣式(Computedstyle)。

如果會使用CSS來放大Canvas顯示尺寸,並希望不希望有鋸齒狀的顯示結果,可以在取得Canvas顯示尺寸之後,設定DOM元素的width、height特性,例如,想要使用整個瀏覽器視埠的話,基本上可以這麼做: HelloCanvas 將margin設為0,overflow設為hidden,而Canvas使用CSS設定整個視埠尺寸,這樣顯示上Canvas就會是整個視埠,接著用顯示大小來設定DOM元素大小。

接著,可以從Canvas取得支援WebGL的Context物件,這是透過CanvasDOM物件的getContext方法指定Context類型來取得,對於支援WebGL第一版的瀏覽器要傳入字串'webgl',這系列的文件,若沒有特別提醒,討論的對象就是指WebGL第一版,對於WebGL第二版要傳入'webgl2',如果不支援的話,getContext傳回null,如果支援的話,傳回WebGLRenderingContext實例。

第一次建立WebGL的Context物件時,視埠的大小與Canvas大小是一樣的,如果需要自行設定視埠大小,或者在Canvas改變大小時,重新設定視埠大小,可以使用viewport方法: gl.viewport(0,0,canvas.width,canvas.height); 想要設定背景為黑色,方式是設定清除色為黑,並用清除色來清除色彩緩衝區。

設定清除色可以使用WebGLRenderingContext的clearColor方法,其前三個參數為RGB設定,最後一個參數為不透明度,都是接受0.0到1.0的值;清除色彩緩衝區的話,可使用clear方法傳入WebGLRenderingContext上的COLOR_BUFFER_BIT常數。

因此整個範例可以寫為: HelloCanvas 按我觀看結果


請為這篇文章評分?