Html5中 SVG Canvas,WebGl 的區別


 

SVG

SVG 是一種使用 XML 描述 2D 圖形的語言。

SVG 基於 XML,這意味着 SVG DOM 中的每個元素都是可用的。您可以為某個元素附加 JavaScript 事件處理器。

在 SVG 中,每個被繪制的圖形均被視為對象。如果 SVG 對象的屬性發生變化,那么瀏覽器能夠自動重現圖形。

Canvas

Canvas 通過 JavaScript 來繪制 2D 圖形。

Canvas 是逐像素進行渲染的。

在 canvas 中,一旦圖形被繪制完成,它就不會繼續得到瀏覽器的關注。如果其位置發生變化,那么整個場景也需要重新繪制,包括任何或許已被圖形覆蓋的對象。

Canvas 與 SVG 的比較

下表列出了 canvas 與 SVG 之間的一些不同之處。

Canvas

  • 依賴分辨率
  • 不支持事件處理器
  • 弱的文本渲染能力
  • 能夠以 .png 或 .jpg 格式保存結果圖像
  • 最適合圖像密集型的游戲,其中的許多對象會被頻繁重繪

SVG

  • 不依賴分辨率
  • 支持事件處理器
  • 最適合帶有大型渲染區域的應用程序(比如谷歌地圖)
  • 復雜度高會減慢渲染速度(任何過度使用 DOM 的應用都不快)
  • 不適合游戲應用

以上來自:http://www.w3school.com.cn/html5/html_5_canvas_vs_svg.asp

WebGL

WebGL(全寫Web Graphics Library)是一種3D繪圖協議,這種繪圖技術標准允許把JavaScript和OpenGL ES 2.0結合在一起,通過增加OpenGL ES 2.0的一個JavaScript綁定,WebGL可以為HTML5 Canvas提供硬件3D加速渲染,這樣Web開發人員就可以借助系統顯卡來在瀏覽器里更流暢地展示3D場景和模型了,還能創建復雜的導航和數據視覺化。顯然,WebGL技術標准免去了開發網頁專用渲染插件的麻煩,可被用於創建具有復雜3D結構的網站頁面,甚至可以用來設計3D網頁游戲等等。

簡單來說,WebGL 就是基於canvas的一個渲染框架,可以在canvas上繪制2D,3D圖像

下面代碼是用原生 js 寫webgl,來繪制圖形

  1 <!DOCTYPE html>
  2 <html>
  3     <head>
  4         <meta charset="utf-8" />
  5         <title>webgl</title>
  6         <!-- 防止被緩存-->
  7         <meta http-equiv="Pragma" content="no-cache" />
  8         <meta http-equiv="Cache-Control" content="no-cache" />
  9         <meta http-equiv="Expires" content="0" />
 10         <!-- 極速模式-->
 11         <meta name="renderer" content="webkit" />
 12         <meta name="viewport" content="width=device-width,initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no" />
 13         <meta name="apple-mobile-web-app-capable" content="yes" />
 14         <meta name="full-screen" content="true" />
 15         <meta name="screen-orientation" content="portrait" />
 16         <meta name="x5-fullscreen" content="true" />
 17         <meta name="360-fullscreen" content="true" />
 18     </head>
 19     <body>
 20         <canvas id="drawing" width="800" height="800">您的瀏覽器不支持canvas標簽;</canvas>
 21         <!--WebGL使用着色器信息繪圖,着色器使用OpenGL ES(GLSL)編寫,
 22             着色器分為頂點着色器(Vertex shader)和片元着色器(Fragment shader),頂點着色器描述位置信息,片元着色器描述顏色信息。
 23             gl_Position、gl_PointSize、gl_FragColor均為GLSL內置變量名,
 24             vec4描述了數據類型為4個浮點數,相應的vec1表示1個浮點數,vec2表示2個浮點數,vec3表示3個浮點數
 25             在gl_Position中的4個數值中,前3個應該是三維坐標的x、y、z,目前還不太明白最后一個數值的意義
 26             有了着色器信息后,就可以使用這些信息開始繪制了
 27         -->
 28         <script type="x-webgl/x-shader" id="vertex-shader">
 29             #ifdef GL_ES
 30             precision mediump float;
 31             #endif
 32             attribute vec2 aVertexPosition;
 33             void main() {
 34                 gl_Position = vec4(aVertexPosition, 0.0, 1.0);
 35             }
 36         </script>
 37         <script type="x-webgl/x-shader" id="fragment-shader">
 38             #ifdef GL_ES
 39             precision mediump float;
 40             #endif
 41             uniform vec4 uColor;
 42             void main() {
 43                 gl_FragColor = uColor;
 44             }
 45         </script>
 46         <!--結束使用腳本script標簽編寫片段着色器文本;-->
 47         <!--結束04.使用腳本script標簽編寫着色器文本;-->
 48         <script>
 49             var drawing = document.getElementById('drawing');
 50             var theContextSetting;
 51             var gl;
 52             var buffer;
 53             var vertices;
 54             var thisProgram;
 55             var vertexShader;
 56             var fragmentShader;
 57             var node;
 58 
 59             if (drawing.getContext) {
 60                 try {
 61                     theContextSetting = {
 62                         alpha: true,
 63                         depth: true,
 64                         stencil: false,
 65                         antialias: true,
 66                         premultipliedAlpha: true,
 67                         preserveDrawingBuffer: false,
 68                     };
 69 
 70                     gl = drawing.getContext('experimental-webgl', theContextSetting);
 71                 } catch (ex) {
 72                     console.log('瀏覽器無法創建WebGL上下文並拋出錯誤,此時拋出的錯誤參數ex--->', ex);
 73                 }
 74 
 75                 if (gl) {
 76                     //開始01.准備繪圖;
 77                     gl.clearColor(1.0, 0.0, 1.0, 1.0); //首先必須使用clearColor()方法來指定要使用的顏色值,該方法接收4個參數: 紅、綠、藍和透明度;每個參數必須是一個0到1之間的數值,表示每種分量在最終顏色中的強度;
 78                     gl.clear(gl.COLOR_BUFFER_BIT); //調用了clear()方法,傳入的參數gl.COLOR_BUFFER_BIT告訴WebGL上下文對象使用之前定義的顏色來填充相應區域;
 79                     //結束01.准備繪圖;
 80 
 81                     //開始02.定義WebGL上下文對象的視口;
 82                     gl.viewport(0, 0, drawing.width, drawing.height);
 83                     //結束02.定義WebGL上下文對象的視口;
 84 
 85                     //開始03.設置緩沖區;
 86                     buffer = gl.createBuffer();
 87                     vertices = new Float32Array([0, 1, 1, -1, -1, -1]);
 88                     //開始將數據放入緩沖區;
 89                     gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
 90                     gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
 91                     //結束將數據放入緩沖區;
 92                     //結束03.設置緩沖區;
 93 
 94                     //開始05.編寫着色器對象並鏈接到着色器程序中;
 95                     //開始編寫頂點着色器對象;
 96                     node = document.getElementById('vertex-shader');
 97                     vertexShader = gl.createShader(gl.VERTEX_SHADER);
 98                     gl.shaderSource(vertexShader, node.text);
 99                     gl.compileShader(vertexShader);
100                     //結束編寫頂點着色器對象;
101 
102                     //開始編寫片段着色器對象;
103                     node = document.getElementById('fragment-shader');
104                     fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
105                     gl.shaderSource(fragmentShader, node.text);
106                     gl.compileShader(fragmentShader);
107                     //結束編寫片段着色器對象;
108 
109                     //開始創建着色器程序並把兩個着色器對象鏈接到到着色器程序中;
110                     thisProgram = gl.createProgram();
111                     gl.attachShader(thisProgram, vertexShader);
112                     gl.attachShader(thisProgram, fragmentShader);
113                     gl.linkProgram(thisProgram);
114                     gl.useProgram(thisProgram);
115                     //結束創建着色器程序並把兩個着色器對象鏈接到到着色器程序中;
116                     //結束05.編寫着色器對象並鏈接到着色器程序中;
117 
118                     //開始06.為着色器傳入值;
119 
120                     var vertexSetSize = 2;
121                     var vertexSetCount = vertices.length / vertexSetSize;
122                     var uColor;
123                     var aVertexPosition;
124 
125                     //開始為片段着色器進行賦值;
126                     uColor = gl.getUniformLocation(thisProgram, 'uColor');
127                     var uColorValue = [1.0, 1.0, 0.0, 1.0];
128                     gl.uniform4fv(uColor, uColorValue);
129                     //結束為片段着色器進行賦值;
130 
131                     //開始為頂點着色器進行賦值;
132                     aVertexPosition = gl.getAttribLocation(thisProgram, 'aVertexPosition');
133                     gl.enableVertexAttribArray(aVertexPosition);
134                     gl.vertexAttribPointer(aVertexPosition, vertexSetSize, gl.FLOAT, false, 0, 0);
135                     //結束為頂點着色器進行賦值;
136                     //結束06.為着色器傳入值;
137 
138                     //開始07.繪圖;
139                     gl.drawArrays(gl.TRIANGLES, 0, vertexSetCount);
140                     //結束07.繪圖;
141                 } else {
142                     console.log('您的瀏覽器不支持WebGL畫圖;');
143                 }
144             }
145         </script>
146     </body>
147 </html>

 更多webgl學習可參考鏈接:https://www.cnblogs.com/etopx/p/6535638.html

其他 SVG,Canvas,WebGL的簡單學習可以參考下面鏈接

https://www.cnblogs.com/best/p/6107565.html

 


免責聲明!

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



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