效果: 代碼: ...
效果:
代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>WebGl 利用drawArrays、drawElements畫三角形</title> </head> <body> <canvas id="myCanvas" width="500" height="300" style="border: 1px solid red"></canvas> </body> <script> window.onload = function () { //第1步 - 準備Canvas和獲取WebGL的渲染上下文 var canvas = document.getElementById('myCanvas'), gl = canvas.getContext('webgl'); //第2步 - 定義幾何並將其存儲在緩衝區對象 var vertices = [ -0.5,0.5,0.0, 0.0,0.5,0.0, -0.25,0.25,0.0, 0.5,0.5,0.0, 0.25,0.25,0.0, ], indices =[0,1,2,1,3,4]; var vertex_buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER,vertex_buffer); gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(vertices),gl.STATIC_DRAW); var Index_Buffer = gl.createBuffer(); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW); //第3步 - 創建和編譯著色器程式 var vertCode = 'attribute vec3 coordinates;' + 'void main(void) {' + ' gl_Position = vec4(coordinates, 1.0);' + '}'; var fragCode = 'void main(void) {' + ' gl_FragColor = vec4(1, 0.5, 0.0, 1);' + '}'; var vertShader = gl.createShader(gl.VERTEX_SHADER); var fragShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(vertShader,vertCode); gl.shaderSource(fragShader,fragCode); gl.compileShader(vertShader); gl.compileShader(fragShader); var shaderProgram = gl.createProgram(); gl.attachShader(shaderProgram,vertShader); gl.attachShader(shaderProgram,fragShader); gl.linkProgram(shaderProgram); gl.useProgram(shaderProgram); //第4步 - 關聯著色器程式到緩衝區對象 var coord = gl.getAttribLocation(shaderProgram,'coordinates'); gl.vertexAttribPointer(coord,3,gl.FLOAT,false,0,0); gl.enableVertexAttribArray(coord); //第5步 - 繪製所需的對象 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,myCanvas.width,myCanvas.height); //gl.drawArrays(gl.TRIANGLES, 0, 3)//畫簡單的三角形 此方法不需要索引 //gl.drawArrays(gl.TRIANGLES, 0, 6)//如果下需要畫兩個三角形 那麼vertices數組中需要增加一個點 gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT,0);//利用drawElements畫三角形 //畫矩形 更改indices即可 //繪圖模式如下: //gl.POINTS:要繪製一系列的點 //gl.LINES:要繪製了一系列未連接直線段(單獨行) //gl.LINE_STRIP:要繪製一系列連接的線段 //gl.LINE_LOOP:要繪製一系列連接的線段。它還連接的第一和最後的頂點,以形成一個環 //TRIANGLES:一系列單獨的三角形;繪製方式:(v0,v1,v2),(v1,v3,v4) //TRIANGLE_STRIP:一系列帶狀的三角形 //TRIANGLE_FAN:扇形繪製方式 } </script> </html>