WebGL

WebGL

使用戶 繪制和渲染3D圖形
使用戶 通過頁面與三維圖形交互
技術(shù)棧: HTML、HTML5玩焰、JavaScript东臀、GLSL ES語言

手動(dòng)繪制圖形

<body>
  <canvas
  id="cvs"
  width="200"
  height="200"
  style="border: solid 1px gray">
    瀏覽器不支持canvas
  </canvas>
  <script type="text/javascript">
    // 獲取畫布元素
    var cvs = document.getElementById('cvs')
    // 獲取元素的上下文環(huán)境對(duì)象
    var context = cvs.getContext('webgl')
    // 設(shè)置繪制圖形填充顏色,rgb诅愚,最大值是1
    context.clearColor(0.8, 0, 0, 1)
    // 調(diào)用緩存中值填充圖形
    context.clear(context.COLOR_BUFFER_BIT)
  </script>
</body>

WebGL坐標(biāo)系統(tǒng)

畫布中心為原點(diǎn)表蝙,向四周擴(kuò)散


著色器

著色器是程序(使用OpenGL ES Shading Language語言編寫的程序)
著色器記錄像素點(diǎn)的 位置 和 顏色
著色器由 頂點(diǎn)著色器 和 片段著色器 組成

著色器繪制WebGL圖形

著色器MDN

        //獲取畫布元素
        var cvs=document.getElementById("cvs");
        //獲取到元素的上下文環(huán)境對(duì)象
        var gl=cvs.getContext('webgl');
        
        //頂點(diǎn)著色器變量
        var VSHADER_SOURCE =

           'void main() {' +

           //定義點(diǎn)的坐標(biāo)并轉(zhuǎn)換成變量保存
           'gl_Position = vec4(0.0, 0.0, 0.0, 1.0); ' +
           //設(shè)置縮放距離的直徑
           'gl_PointSize = 10.0; '+

           '} ';

        //片段著色器變量
        var FSHADER_SOURCE =
           
           'void main() {' +
           //設(shè)置圖形像素的顏色并保存
           'gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);' +

           '}';

        //新建一個(gè)用于裝頂點(diǎn)字符串的著色器對(duì)象
        var vertShader = gl.createShader(gl.VERTEX_SHADER);
        //加載保存好的頂點(diǎn)代碼字符串變量
        gl.shaderSource(vertShader, VSHADER_SOURCE);
        //編譯頂點(diǎn)著色器
        gl.compileShader(vertShader);

        //新建一個(gè)用于裝片段字符串的著色器對(duì)象
        var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
        //加載保存好的片段代碼字符串變量
        gl.shaderSource(fragShader, FSHADER_SOURCE);
        //編譯片段著色器
        gl.compileShader(fragShader);

        //新建一個(gè)程序
        var shaderProgram = gl.createProgram();

        //分別附加兩個(gè)已編譯好的著色器對(duì)象
        gl.attachShader(shaderProgram, vertShader);
        gl.attachShader(shaderProgram, fragShader);
        
        //鏈接兩個(gè)附件加好的著色器程序
        gl.linkProgram(shaderProgram);
        //開啟程序的使用
        gl.useProgram(shaderProgram);
        
        //繪制指定位置的圖形
        gl.drawArrays(gl.POINTS, 0, 1);   

繪制三角形

attributes

        //獲取畫布元素
        var cvs=document.getElementById("cvs");
        //獲取到元素的上下文環(huán)境對(duì)象
        var gl=cvs.getContext('webgl');
        
        //頂點(diǎn)著色器變量
        var VSHADER_SOURCE =
            // 使用存儲(chǔ)限定符定義一個(gè)接受頂點(diǎn)坐標(biāo)的變量
            'attribute vec4 a_Position;' +
            'void main() {' +

            //定義點(diǎn)的坐標(biāo)并轉(zhuǎn)換成變量保存
            'gl_Position = a_Position; ' +

            '} ';

        //片段著色器變量
        var FSHADER_SOURCE =
           
           'void main() {' +
           //設(shè)置圖形像素的顏色并保存
           'gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);' +

           '}';

        //新建一個(gè)用于裝頂點(diǎn)字符串的著色器對(duì)象
        var vertShader = gl.createShader(gl.VERTEX_SHADER);
        //加載保存好的頂點(diǎn)代碼字符串變量
        gl.shaderSource(vertShader, VSHADER_SOURCE);
        //編譯頂點(diǎn)著色器
        gl.compileShader(vertShader);

        //新建一個(gè)用于裝片段字符串的著色器對(duì)象
        var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
        //加載保存好的片段代碼字符串變量
        gl.shaderSource(fragShader, FSHADER_SOURCE);
        //編譯片段著色器
        gl.compileShader(fragShader);

        //新建一個(gè)程序
        var shaderProgram = gl.createProgram();

        //分別附加兩個(gè)已編譯好的著色器對(duì)象
        gl.attachShader(shaderProgram, vertShader);
        gl.attachShader(shaderProgram, fragShader);
        
        //鏈接兩個(gè)附件加好的著色器程序
        gl.linkProgram(shaderProgram);
        //開啟程序的使用
        gl.useProgram(shaderProgram);
        
        // 定義一個(gè)類型數(shù)組保存頂點(diǎn)坐標(biāo)值
        // 數(shù)字對(duì)應(yīng)三角形三個(gè)點(diǎn)的坐標(biāo)
        var vertices = new Float32Array([
          0.0,  0.5,
          -0.5, -0.5,
          0.5, -0.5
        ])
        // 創(chuàng)建緩存對(duì)象
        var vertexBuffer = gl.createBuffer()
        // 說明緩存對(duì)象保存的類型
        gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
        // 寫入坐標(biāo)數(shù)據(jù)
        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)
        // 獲取到頂點(diǎn)著色器中變量
        var a_Position = gl.getAttribLocation(shaderProgram, 'a_Position')
        // 將坐標(biāo)值賦值給變量
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)
        // 開啟變量值的使用
        gl.enableVertexAttribArray(a_Position)
        
        //繪制指定位置的圖形
        gl.drawArrays(gl.TRIANGLES, 0, 3);   

webGL動(dòng)畫

平移三角形

uniform類型變量
用于保存和傳輸一致的數(shù)據(jù)拴测,頂點(diǎn)著色器和片段著色器都可用。

        //獲取畫布元素
        var cvs=document.getElementById("cvs");
        //獲取到元素的上下文環(huán)境對(duì)象
        var gl=cvs.getContext('webgl');
        
        //頂點(diǎn)著色器變量
        var VSHADER_SOURCE =
            // 使用存儲(chǔ)限定符定義一個(gè)接受頂點(diǎn)坐標(biāo)的變量
            'attribute vec4 a_Position;' +
            // 使用存儲(chǔ)限定符定義一個(gè)接受一致偏移量的變量
            'uniform vec4 u_Translation;' +
            'void main() {' +

            //定義點(diǎn)的坐標(biāo)并轉(zhuǎn)換成變量保存
            'gl_Position = a_Position + u_Translation; ' +

            '} ';

        //片段著色器變量
        var FSHADER_SOURCE =
           
           'void main() {' +
           //設(shè)置圖形像素的顏色并保存
           'gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);' +

           '}';

        //新建一個(gè)用于裝頂點(diǎn)字符串的著色器對(duì)象
        var vertShader = gl.createShader(gl.VERTEX_SHADER);
        //加載保存好的頂點(diǎn)代碼字符串變量
        gl.shaderSource(vertShader, VSHADER_SOURCE);
        //編譯頂點(diǎn)著色器
        gl.compileShader(vertShader);

        //新建一個(gè)用于裝片段字符串的著色器對(duì)象
        var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
        //加載保存好的片段代碼字符串變量
        gl.shaderSource(fragShader, FSHADER_SOURCE);
        //編譯片段著色器
        gl.compileShader(fragShader);

        //新建一個(gè)程序
        var shaderProgram = gl.createProgram();

        //分別附加兩個(gè)已編譯好的著色器對(duì)象
        gl.attachShader(shaderProgram, vertShader);
        gl.attachShader(shaderProgram, fragShader);
        
        //鏈接兩個(gè)附件加好的著色器程序
        gl.linkProgram(shaderProgram);
        //開啟程序的使用
        gl.useProgram(shaderProgram);
        
        // 定義一個(gè)類型數(shù)組保存頂點(diǎn)坐標(biāo)值
        // 數(shù)字對(duì)應(yīng)三角形三個(gè)點(diǎn)的坐標(biāo)
        var vertices = new Float32Array([
          0.0,  0.5,
          -0.5, -0.5,
          0.5, -0.5
        ])
        // 創(chuàng)建緩存對(duì)象
        var vertexBuffer = gl.createBuffer()
        // 說明緩存對(duì)象保存的類型
        gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
        // 寫入坐標(biāo)數(shù)據(jù)
        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)
        // 獲取到頂點(diǎn)著色器中變量
        var a_Position = gl.getAttribLocation(shaderProgram, 'a_Position')
        // 將坐標(biāo)值賦值給變量
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)
        // 開啟變量值的使用
        gl.enableVertexAttribArray(a_Position)

        // 定義各個(gè)坐標(biāo)點(diǎn)的統(tǒng)一偏移量
        var Tx = 0.3, Ty = 0.5, Tz = 0.0;
        // 獲取頂點(diǎn)著色器中uniform變量
        var u_Translation = gl.getUniformLocation(shaderProgram, 'u_Translation')
        // 將多個(gè)偏移量賦值給uniform變量
        gl.uniform4f(u_Translation, Tx, Ty, Tz, 0.0)
        
        //繪制指定位置的圖形
        gl.drawArrays(gl.TRIANGLES, 0, 3);   

旋轉(zhuǎn)三角形


        //獲取畫布元素
        var cvs=document.getElementById("cvs");
        //獲取到元素的上下文環(huán)境對(duì)象
        var gl=cvs.getContext('webgl');
        
        //頂點(diǎn)著色器變量
        var VSHADER_SOURCE =
            // 使用存儲(chǔ)限定符定義一個(gè)接受頂點(diǎn)坐標(biāo)的變量
            'attribute vec4 a_Position;' +
            'uniform float u_CosB, u_SinB;' +
            'void main() {' +

            // 定義點(diǎn)的坐標(biāo)并轉(zhuǎn)換成變量保存
            // w無實(shí)際意義府蛇,就是為了配合傳參
            'gl_Position.x = a_Position.x * u_CosB - a_Position.y * u_SinB;' +
            'gl_Position.y = a_Position.x * u_SinB + a_Position.y * u_CosB;' +
            'gl_Position.z= a_Position.z;'+
            'gl_Position.w = 1.0;' +
            '} ';

        //片段著色器變量
        var FSHADER_SOURCE =
           
           'void main() {' +
           //設(shè)置圖形像素的顏色并保存
           'gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);' +

           '}';

        //新建一個(gè)用于裝頂點(diǎn)字符串的著色器對(duì)象
        var vertShader = gl.createShader(gl.VERTEX_SHADER);
        //加載保存好的頂點(diǎn)代碼字符串變量
        gl.shaderSource(vertShader, VSHADER_SOURCE);
        //編譯頂點(diǎn)著色器
        gl.compileShader(vertShader);

        //新建一個(gè)用于裝片段字符串的著色器對(duì)象
        var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
        //加載保存好的片段代碼字符串變量
        gl.shaderSource(fragShader, FSHADER_SOURCE);
        //編譯片段著色器
        gl.compileShader(fragShader);

        //新建一個(gè)程序
        var shaderProgram = gl.createProgram();

        //分別附加兩個(gè)已編譯好的著色器對(duì)象
        gl.attachShader(shaderProgram, vertShader);
        gl.attachShader(shaderProgram, fragShader);
        
        //鏈接兩個(gè)附件加好的著色器程序
        gl.linkProgram(shaderProgram);
        //開啟程序的使用
        gl.useProgram(shaderProgram);
        
        // 定義一個(gè)類型數(shù)組保存頂點(diǎn)坐標(biāo)值
        // 數(shù)字對(duì)應(yīng)三角形三個(gè)點(diǎn)的坐標(biāo)
        var vertices = new Float32Array([
          0.0,  0.5,
          -0.5, -0.5,
          0.5, -0.5
        ])
        // 創(chuàng)建緩存對(duì)象
        var vertexBuffer = gl.createBuffer()
        // 說明緩存對(duì)象保存的類型
        gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
        // 寫入坐標(biāo)數(shù)據(jù)
        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)
        // 獲取到頂點(diǎn)著色器中變量
        var a_Position = gl.getAttribLocation(shaderProgram, 'a_Position')
        // 將坐標(biāo)值賦值給變量
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)
        // 開啟變量值的使用
        gl.enableVertexAttribArray(a_Position)
        // 設(shè)置需要旋轉(zhuǎn)的角度
        var ANGLE = 40.0;
        // 將角度轉(zhuǎn)換為弧度
        var radian = Math.PI * ANGLE / 180.0;
        // 計(jì)算正弦和余弦的值
        var CosB = Math.cos(radian)
        var SinB = Math.sin(radian)
        // 從頂點(diǎn)著色器取出
        var u_CosB = gl.getUniformLocation(shaderProgram, 'u_CosB')
        var u_SinB = gl.getUniformLocation(shaderProgram, 'u_SinB')
        // 將保存好的函數(shù)賦值給變量
        gl.uniform1f(u_CosB, CosB)
        gl.uniform1f(u_SinB, SinB)
        
        //繪制指定位置的圖形
        gl.drawArrays(gl.TRIANGLES, 0, 3);   

縮放三角形

        //獲取畫布元素
        var cvs=document.getElementById("cvs");
        //獲取到元素的上下文環(huán)境對(duì)象
        var gl=cvs.getContext('webgl');
        
        //頂點(diǎn)著色器變量
        var VSHADER_SOURCE =
            // 使用存儲(chǔ)限定符定義一個(gè)接受頂點(diǎn)坐標(biāo)的變量
            'attribute vec4 a_Position;' +
            'uniform mat4 u_xfomMatrix;' +
            'void main() {' +

            //定義點(diǎn)的坐標(biāo)并轉(zhuǎn)換成變量保存
            'gl_Position = a_Position * u_xfomMatrix; ' +

            '} ';

        //片段著色器變量
        var FSHADER_SOURCE =
           
           'void main() {' +
           //設(shè)置圖形像素的顏色并保存
           'gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);' +

           '}';

        //新建一個(gè)用于裝頂點(diǎn)字符串的著色器對(duì)象
        var vertShader = gl.createShader(gl.VERTEX_SHADER);
        //加載保存好的頂點(diǎn)代碼字符串變量
        gl.shaderSource(vertShader, VSHADER_SOURCE);
        //編譯頂點(diǎn)著色器
        gl.compileShader(vertShader);

        //新建一個(gè)用于裝片段字符串的著色器對(duì)象
        var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
        //加載保存好的片段代碼字符串變量
        gl.shaderSource(fragShader, FSHADER_SOURCE);
        //編譯片段著色器
        gl.compileShader(fragShader);

        //新建一個(gè)程序
        var shaderProgram = gl.createProgram();

        //分別附加兩個(gè)已編譯好的著色器對(duì)象
        gl.attachShader(shaderProgram, vertShader);
        gl.attachShader(shaderProgram, fragShader);
        
        //鏈接兩個(gè)附件加好的著色器程序
        gl.linkProgram(shaderProgram);
        //開啟程序的使用
        gl.useProgram(shaderProgram);
        
        // 定義一個(gè)類型數(shù)組保存頂點(diǎn)坐標(biāo)值
        // 數(shù)字對(duì)應(yīng)三角形三個(gè)點(diǎn)的坐標(biāo)
        var vertices = new Float32Array([
          0.0,  0.5,
          -0.5, -0.5,
          0.5, -0.5
        ])
        // 創(chuàng)建緩存對(duì)象
        var vertexBuffer = gl.createBuffer()
        // 說明緩存對(duì)象保存的類型
        gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
        // 寫入坐標(biāo)數(shù)據(jù)
        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)
        // 獲取到頂點(diǎn)著色器中變量
        var a_Position = gl.getAttribLocation(shaderProgram, 'a_Position')
        // 將坐標(biāo)值賦值給變量
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)
        // 開啟變量值的使用
        gl.enableVertexAttribArray(a_Position)
        // 設(shè)置縮放的距離
        var Sx = 1.5; Sy = 1.5; Sz = 1.0;
        // 定義矩陣
        var xformMatrix = new Float32Array([
          Sx, 0.0, 0.0, 0.0,
          0.0, Sy, 0.0, 0.0,
          0.0, 0.0, Sz, 0.0,
          0.0, 0.0, 0.0, 1.0
        ]);
        // 獲取到頂點(diǎn)著色器中矩陣變量
        var u_xfomMatrix = gl.getUniformLocation(shaderProgram, 'u_xfomMatrix');
        // 將設(shè)置的值賦值給變量
        gl.uniformMatrix4fv(u_xfomMatrix, false, xformMatrix)

        
        //繪制指定位置的圖形
        gl.drawArrays(gl.TRIANGLES, 0, 3);  

動(dòng)畫

        //獲取畫布元素
        var cvs=document.getElementById("cvs");
        //獲取到元素的上下文環(huán)境對(duì)象
        var gl=cvs.getContext('webgl');
        
        //頂點(diǎn)著色器變量
        var VSHADER_SOURCE =
            // 使用存儲(chǔ)限定符定義一個(gè)接受頂點(diǎn)坐標(biāo)的變量
            'attribute vec4 a_Position;' +
            'uniform float u_CosB, u_SinB;' +
            'void main() {' +

            // 定義點(diǎn)的坐標(biāo)并轉(zhuǎn)換成變量保存
            // w無實(shí)際意義集索,就是為了配合傳參
            'gl_Position.x = a_Position.x * u_CosB - a_Position.y * u_SinB;' +
            'gl_Position.y = a_Position.x * u_SinB + a_Position.y * u_CosB;' +
            'gl_Position.z= a_Position.z;'+
            'gl_Position.w = 1.0;' +
            '} ';

        //片段著色器變量
        var FSHADER_SOURCE =
           
           'void main() {' +
           //設(shè)置圖形像素的顏色并保存
           'gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);' +

           '}';

        //新建一個(gè)用于裝頂點(diǎn)字符串的著色器對(duì)象
        var vertShader = gl.createShader(gl.VERTEX_SHADER);
        //加載保存好的頂點(diǎn)代碼字符串變量
        gl.shaderSource(vertShader, VSHADER_SOURCE);
        //編譯頂點(diǎn)著色器
        gl.compileShader(vertShader);

        //新建一個(gè)用于裝片段字符串的著色器對(duì)象
        var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
        //加載保存好的片段代碼字符串變量
        gl.shaderSource(fragShader, FSHADER_SOURCE);
        //編譯片段著色器
        gl.compileShader(fragShader);

        //新建一個(gè)程序
        var shaderProgram = gl.createProgram();

        //分別附加兩個(gè)已編譯好的著色器對(duì)象
        gl.attachShader(shaderProgram, vertShader);
        gl.attachShader(shaderProgram, fragShader);
        
        //鏈接兩個(gè)附件加好的著色器程序
        gl.linkProgram(shaderProgram);
        //開啟程序的使用
        gl.useProgram(shaderProgram);
        
        // 定義一個(gè)類型數(shù)組保存頂點(diǎn)坐標(biāo)值
        // 數(shù)字對(duì)應(yīng)三角形三個(gè)點(diǎn)的坐標(biāo)
        var vertices = new Float32Array([
          0.0,  0.5,
          -0.5, -0.5,
          0.5, -0.5
        ])
        // 創(chuàng)建緩存對(duì)象
        var vertexBuffer = gl.createBuffer()
        // 說明緩存對(duì)象保存的類型
        gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
        // 寫入坐標(biāo)數(shù)據(jù)
        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)
        // 獲取到頂點(diǎn)著色器中變量
        var a_Position = gl.getAttribLocation(shaderProgram, 'a_Position')
        // 將坐標(biāo)值賦值給變量
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)
        // 開啟變量值的使用
        gl.enableVertexAttribArray(a_Position)
        // 設(shè)置需要旋轉(zhuǎn)的角度
        var ANGLE = 40.0;

        function draw(ANGLE) {
          // 將角度轉(zhuǎn)換為弧度
          var radian = Math.PI * ANGLE / 180.0;
          // 計(jì)算正弦和余弦的值
          var CosB = Math.cos(radian)
          var SinB = Math.sin(radian)
          // 從頂點(diǎn)著色器取出
          var u_CosB = gl.getUniformLocation(shaderProgram, 'u_CosB')
          var u_SinB = gl.getUniformLocation(shaderProgram, 'u_SinB')
          // 將保存好的函數(shù)賦值給變量
          gl.uniform1f(u_CosB, CosB)
          gl.uniform1f(u_SinB, SinB)
          gl.clear(gl.COLOR_BUFFER_BIT);
          
          //繪制指定位置的圖形
          gl.drawArrays(gl.TRIANGLES, 0, 3);   
        }

        // 計(jì)算每秒繪制的角度
        // 旋轉(zhuǎn)前時(shí)間
        var cur_time = Date.now();
        // 旋轉(zhuǎn)角度
        var ANGLE_STEP = -80.0;
        // 初始角度
        var ANGLE_INIT = 30.0;
        // 執(zhí)行角度
        var ANGLE_ACT = 0.0;

        function animate(c1, a1, a2) {
          // 計(jì)算距離上次調(diào)用經(jīng)過的時(shí)間
          var act_time = Date.now();
          // 得到這次調(diào)用和上次調(diào)用的時(shí)間間隔
          var dif_time = act_time - c1;
          c1 = act_time;
          var ANGLE_NEW = a1 + a2 * (dif_time / 10000.0);
          // 返回一個(gè)始終小于360的角度
          return ANGLE_NEW %= 360;
        }
        function tick() {
          // 獲取每次旋轉(zhuǎn)的角度
          ANGLE_ACT = animate(cur_time, ANGLE_INIT, ANGLE_STEP);
          draw(ANGLE_ACT);
          // setInterval(tick, 100)
          window.requestAnimationFrame(tick);
        }
        tick();

顏色

所有的顏色是片段著色器繪制的

繪制多頂點(diǎn)顏色的三角形

        //獲取畫布元素
        var cvs=document.getElementById("cvs");
        //獲取到元素的上下文環(huán)境對(duì)象
        var gl=cvs.getContext('webgl');
        
        //頂點(diǎn)著色器變量
        var VSHADER_SOURCE =
           //使用存儲(chǔ)限定符定義一個(gè)接受頂點(diǎn)坐標(biāo)的變量
           'attribute vec4 a_Position;'+
           'attribute vec4 a_Color;'+
           'varying vec4 v_Color;'+
           'void main() {' +

           //定義點(diǎn)的坐標(biāo)并轉(zhuǎn)換成變量保存
           'gl_Position = a_Position; ' +
           'v_Color = a_Color; ' +
           '} ';

        //片段著色器變量
        var FSHADER_SOURCE =
           'precision mediump float;'+
           'varying vec4 v_Color;'+
           'void main() {' +
           //設(shè)置圖形像素的顏色并保存
           'gl_FragColor = v_Color ;' +

           '}';

        //新建一個(gè)用于裝頂點(diǎn)字符串的著色器對(duì)象
        var vertShader = gl.createShader(gl.VERTEX_SHADER);
        //加載保存好的頂點(diǎn)代碼字符串變量
        gl.shaderSource(vertShader, VSHADER_SOURCE);
        //編譯頂點(diǎn)著色器
        gl.compileShader(vertShader);

        //新建一個(gè)用于裝片段字符串的著色器對(duì)象
        var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
        //加載保存好的片段代碼字符串變量
        gl.shaderSource(fragShader, FSHADER_SOURCE);
        //編譯片段著色器
        gl.compileShader(fragShader);

        //新建一個(gè)程序
        var shaderProgram = gl.createProgram();

        //分別附加兩個(gè)已編譯好的著色器對(duì)象
        gl.attachShader(shaderProgram, vertShader);
        gl.attachShader(shaderProgram, fragShader);
        
        //鏈接兩個(gè)附件加好的著色器程序
        gl.linkProgram(shaderProgram);
        //開啟程序的使用
        gl.useProgram(shaderProgram);
        
        // 定義一個(gè)類型數(shù)組保存頂點(diǎn)坐標(biāo)值
        // 數(shù)字對(duì)應(yīng)三角形三個(gè)點(diǎn)的坐標(biāo)
        var vertices = new Float32Array([
          // x  y  r  g  b
          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,
        ])
        // 創(chuàng)建緩存對(duì)象
        var vertexBuffer = gl.createBuffer()
        // 說明緩存對(duì)象保存的類型
        gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
        // 寫入坐標(biāo)數(shù)據(jù)
        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)
        // 獲取到數(shù)組中單個(gè)元素的字節(jié)數(shù)
        var FSIZE = vertices.BYTES_PER_ELEMENT;

        // 獲取到頂點(diǎn)著色器中變量
        var a_Position = gl.getAttribLocation(shaderProgram, 'a_Position');
        // 將坐標(biāo)值賦值給變量
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, FSIZE*5, 0);
        // 開啟變量值的使用
        gl.enableVertexAttribArray(a_Position);

        // 獲取到頂點(diǎn)著色器中變量
        var a_Color = gl.getAttribLocation(shaderProgram, 'a_Color');
        // 將坐標(biāo)值賦值給變量
        gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, FSIZE*5, FSIZE*2);
        // 開啟變量值的使用
        gl.enableVertexAttribArray(a_Color);
        
        //繪制指定位置的圖形
        gl.drawArrays(gl.TRIANGLES, 0, 3);   
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子务荆,更是在濱河造成了極大的恐慌妆距,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,835評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件函匕,死亡現(xiàn)場(chǎng)離奇詭異娱据,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盅惜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門中剩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抒寂,你說我怎么就攤上這事结啼。” “怎么了屈芜?”我有些...
    開封第一講書人閱讀 156,481評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵郊愧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我井佑,道長(zhǎng)属铁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,303評(píng)論 1 282
  • 正文 為了忘掉前任躬翁,我火速辦了婚禮红选,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姆另。我一直安慰自己,他們只是感情好坟乾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,375評(píng)論 5 384
  • 文/花漫 我一把揭開白布迹辐。 她就那樣靜靜地躺著,像睡著了一般甚侣。 火紅的嫁衣襯著肌膚如雪明吩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,729評(píng)論 1 289
  • 那天殷费,我揣著相機(jī)與錄音印荔,去河邊找鬼。 笑死详羡,一個(gè)胖子當(dāng)著我的面吹牛仍律,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播实柠,決...
    沈念sama閱讀 38,877評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼水泉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起草则,我...
    開封第一講書人閱讀 37,633評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤钢拧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后炕横,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體源内,經(jīng)...
    沈念sama閱讀 44,088評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,443評(píng)論 2 326
  • 正文 我和宋清朗相戀三年份殿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膜钓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,563評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伯铣,死狀恐怖呻此,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腔寡,我是刑警寧澤焚鲜,帶...
    沈念sama閱讀 34,251評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站放前,受9級(jí)特大地震影響忿磅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凭语,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,827評(píng)論 3 312
  • 文/蒙蒙 一葱她、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧似扔,春花似錦吨些、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至黔寇,卻和暖如春偶器,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缝裤。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工屏轰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人憋飞。 一個(gè)月前我還...
    沈念sama閱讀 46,240評(píng)論 2 360
  • 正文 我出身青樓霎苗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親搀崭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叨粘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,435評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • WebGL從2012年開始接觸猾编,后面因?yàn)殚_始專注前端其他方面的事情,慢慢地就把它給遺忘升敲。最近前端開始又流行起繪畫制...
    我不是傳哥閱讀 4,083評(píng)論 1 22
  • 原文鏈接:WebGL漫游之旅(一) 一答倡、WebGL基本概念 WebGL (Web Graphics Library...
    Srtian閱讀 1,978評(píng)論 0 0
  • 本文梳理了WebGL中從零到渲染出一個(gè)簡(jiǎn)單幾何圖形的主要流程。幫助一些剛接觸WebGL的玩家簡(jiǎn)單整理下在WebGL...
    肖怡君閱讀 7,410評(píng)論 2 19
  • 一、我們講什么港庄? 我們講兩個(gè)東西: 1倔既、WebGL背后的工作原理是什么? 2鹏氧、以Three.js為例渤涌,講述框架在背...
    無言以越閱讀 1,531評(píng)論 1 6
  • 2019年4月3日 星期三 睛 今天比平常晚半個(gè)小時(shí)按老二,沒接到她之前心...
    趙羿涵媽媽閱讀 30評(píng)論 0 0