顏色效果圖:html
操做步驟:web
1.建立HTML5 canvascanvas
2.獲取畫布 canvas 的 ID數組
3.獲取WebGL緩存
4.編譯着色器post
5.使用緩衝區對象向頂點傳入多個頂點數據動畫
6.繪製圖像webgl
以上1~3參考:http://www.cnblogs.com/bsman/p/6128447.htmlurl
4.編譯着色器spa
改頂點着色器,片着色器
//頂點着色器程序 var VSHADER_SOURCE = "attribute vec4 a_Position;" + "attribute vec4 a_Color;" + "varying vec4 v_Color;" + "void main(){" + "gl_Position = a_Position;" + "v_Color = a_Color;" + "}"; //片元着色器 var FSHADER_SOURCE = "precision mediump float;" + "varying vec4 v_Color;" + "void main() {" + "gl_FragColor = v_Color;" + "}";
解釋:定義修改顏色的變量 varying,其中"v_Color = a_Color;" 表示將顏色數據傳給片元着色器;"gl_FragColor = v_Color;"表示從頂點着色器接收數據;
5.使用緩衝區對象向頂點傳入多個頂點數據
function initBuffers(gl,shaderProgram) { //頂點座標和顏色 var vertices = new Float32Array([ 0.0, 0.5, 1.0, 0.0, 0.0, -0.5, -0.5, 0.0, 1.0, 0.0, 0.5, -0.5, 0.0, 0.0, 1.0, ]); var n = 3;//點的個數 //建立緩衝區對象 var vertexBuffer = gl.createBuffer(); //將緩衝區對象綁定到目標 gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer); //向緩衝區寫入數據 gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW); //獲取單個字節 var FSIZE = vertices.BYTES_PER_ELEMENT; //獲取座標點 var a_Position = gl.getAttribLocation(shaderProgram, 'a_Position'); //將緩衝區對象分配給a_Position變量 gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, FSIZE*5, 0); //鏈接a_Position變量與分配給它的緩衝區對象 gl.enableVertexAttribArray(a_Position); //獲取Color座標點 var a_Color = gl.getAttribLocation(shaderProgram, 'a_Color'); //將緩衝區對象分配給a_Position變量 gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, FSIZE*5, FSIZE*2); //鏈接a_Position變量與分配給它的緩衝區對象 gl.enableVertexAttribArray(a_Color); return n; }
其中 vertexAttribPointer 方法注意此時數組中有多種數據,有座標和顏色,此時就應該修改第五個(跨度)和第六個參數(位移)的值
第一個參數:指定待分配attribute變量的存儲位置
第二個參數:指定緩存區中每一個頂點的份量個數(1~4)
第三個參數:類型有,gl.UNSIGNED_BYTE無符號字節,gl.SHORT短整數,gl.UNSIGNED_SHORT無符號短整數,gl.INT整型,gl.UNSIGNED_INT無符號整型,gl.FLOAT浮點型。
第四個參數:表示是否將非浮點型的數據歸到[0,1][-1,1]區間
第五個參數:相鄰兩個頂點的字節數。默認爲0
第六個參數:表示緩存區對象的偏移量(以字節爲單位),就是attribute變量從緩衝區中的何處開始存儲。
6.繪製圖像
var n = initBuffers(gl,shaderProgram); if(n<0){ console.log('Failed to set the positions'); return; } // 清除指定<畫布>的顏色 gl.clearColor(0.0, 0.0, 0.0, 1.0); // 清空 <canvas> gl.clear(gl.COLOR_BUFFER_BIT); gl.drawArrays(gl.TRIANGLES, 0, n);