WebGL入門教程(四)-webgl顏色

前面文章:

WebGL入門教程(一)-初識webgl

WebGL入門教程(二)-webgl繪製三角形

WebGL入門教程(三)-webgl動畫

顏色效果圖: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);
相關文章
相關標籤/搜索