WebGl 利用drawArrays、drawElements畫三角形


效果:

 

代碼:

 

<!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>

 


免責聲明!

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



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