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


前面文章:

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);

 


免責聲明!

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



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