前面文章:
WebGL入門教程(一)-初識webgl
WebGL入門教程(二)-webgl繪制三角形
WebGL入門教程(三)-webgl動畫
顏色效果圖:
操作步驟:
1.創建HTML5 canvas
2.獲取畫布 canvas 的 ID
3.獲取WebGL
4.編譯着色器
5.使用緩沖區對象向頂點傳入多個頂點數據
6.繪制圖像
以上1~3參考:http://www.cnblogs.com/bsman/p/6128447.html
4.編譯着色器
改頂點着色器,片着色器
//頂點着色器程序 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);