美文网首页
05.缓存区对象 多点绘制

05.缓存区对象 多点绘制

作者: cmd_ts | 来源:发表于2020-03-20 10:24 被阅读0次
    04.png

    一次需要绘制多个点,需要同时传递进去多个点的数据。刚好,在WebGL中提供了一种机制:缓存区对象(buffer data),缓存区对象可以同时向着色器传递多个顶点坐标。缓存区是WebGL中的一块内存区域,我们可以向里面存放大量顶点坐标数据,可随时供着色器使用。

    使用缓存区步骤
     1.创建缓存区对象(gl.createBuffer())
     2.绑定缓存区对象(gl.bindBuffer())
     3.将数据写入缓存区对象(gl.bufferData())
     4.将缓存区对象分配给一个attribute变量(gl.vertexAttribPointer())
     5.开启attribute变量(gl.enableVertexAttribArray())

    首先,需要创建一个缓冲区来承载大量顶点的坐标
     //创建缓存区
     var vertexBuffer = gl.createBuffer();
     if(!vertexBuffer) {
      log('创建缓存区失败。');
      return -1;
     }
    //将创建的缓存区对象绑定到target表示的目标上
     gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    //开辟存储空间,向绑定在target上的缓存区对象中写入数据
     gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
    //获取着色器中的变量值
     var a_position = gl.getAttribLocation(gl.program, 'a_p');
    //将缓存区对象绑定到着色器变量中
     gl.vertexAttribPointer(a_position, 3, gl.FLOAT, false, 0, 0);
    // 启用缓存区
     gl.enableVertexAttribArray(a_position);
    // 绘制缓存区中画的多个顶点
     gl.drawArrays(gl.POINTS, 0 , array);

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>cmd_webgl_study3</title>
    </head>
    <body>
    <!-- 1.创建webgl标签 -->
    <canvas id="webgl" width="500" height="500"></canvas>
    <script type="shader" id="vertex">
            attribute vec4 apos;
            attribute float a_PointSize;
            void main(){
                gl_PointSize = 20.0;
                gl_Position = apos;
            }
        </script>
    <script type="shader" id="fragment">
            precision mediump float;
            uniform vec4 vColor;
            void main(){
                gl_FragColor = vec4(0.0,1.0,0.0,1.0);
            }
        </script>
    <script src="./libs/webgl_libs.js"></script>
    <script>
        // 2.得到canvas element
        let canvas = document.getElementById('webgl');
        // 3.得到上下文对象 context
        let gl = canvas.getContext('webgl');
    
        //4.编写顶点着色器源代码、实际绘制的代码,GPU:描述一个顶点的大小、位置(3d坐标) 顶点着色器
        let vertex_shader_source = document.getElementById("vertex").innerHTML;
    
        //5.片元着色器源代码:描述一个点的颜色 片元着色器
        let fragment_shader_source = document.getElementById("fragment").innerHTML;
    
    
    
        let program = create_program(gl,vertex_shader_source,fragment_shader_source);
    
        let apos = gl.getAttribLocation(program,'apos');
    
        // 1.创建buf
        let buffer = gl.createBuffer();
        //2.绑定buf
        gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
        /*3.由于javascript没有对“大量元素都是同一种类型”的数组这种情况进行优化,
        所以WebGL引入了类型化数组,Float32Array就是其中之一.
    
        */
        let data = new Float32Array([
            0.3,0.5,
            0.6,0.0,
            0.9,0.7
        ]);
        //向缓存区对象中写入数据 gl.STATIC_DRAW : 只会向缓存区对象中写入一次数据,但需要绘制很多次
        gl.bufferData(gl.ARRAY_BUFFER,data,gl.STATIC_DRAW);
        /*将缓冲区对象分配给指定变量.
        1.赋值的apos变量
        2:指定每个顶点数据的分量个数(1或4)
        */
        gl.vertexAttribPointer(apos,2,gl.FLOAT,false,0,0);
    
        //开启apos变量
        gl.enableVertexAttribArray(apos);
    
        // 13.设置背景色
        gl.clearColor(1.0,0.0,0.0,1.0);
        gl.clear(gl.COLOR_BUFFER_BIT);
        // 14.绘制
        gl.drawArrays(gl.POINTS,0,3);
    
    </script>
    </body>
    </html>
    

    相关文章

      网友评论

          本文标题:05.缓存区对象 多点绘制

          本文链接:https://www.haomeiwen.com/subject/euidyhtx.html