WebGL-三角形绘制

webGL的用法其实与openGL的非常相似,这里就不废话里,直接上代码。

                                                 

html代码:

<html>
    <title>WebGL TEST</title>
    <script src="script.js" type="text/javascript"></script>
    <script src="minMatrix.js" type="text/javascript"></script>
    <script id="vs" type="x-shader/x-vertex">
        attribute vec3 position;
        uniform mat4 mvpMatrix;
        void main(void){
            gl_Position = mvpMatrix * vec4(position,1.0);
        }
    </script>
    <script id="fs" type="x-shader/x-fragment">
        void main(void){
            gl_FragColor = vec4(1.0,1.0,1.0,1.0);
        }
    </script>
    <body>
        <canvas id="canvas"></canvas>
    </body>
</html>


javascript代码:

onload = function(){
    //获取canvas对象
    var c = document.getElementById('canvas');
    //规定canvas的宽高
    c.width = 300;
    c.height = 300;
    //获取webgl的上下文
    var gl = c.getContext('webgl')||c.getContext('experimental-webgl');
    // 设定canvas初始化的颜色  
    gl.clearColor(0.0,0.0,0.0,1.0);
    // 设定canvas初始化时候的深度
    gl.clearDepth(1.0);
    gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);
    //创建顶点shader和片段shader
    var v_shader = create_shader('vs');
    var f_shader = create_shader('fs');
    //程序对象生成和连接
    var prg = create_program(v_shader,f_shader);
    //从shader那里找到命名为position的属性
    var attLocation = gl.getAttribLocation(prg,'position');
    //指定每个顶点属性的组件数量。必须为1、2、3或者4。初始值为4。
    //(如position是由3个(x,y,z)组成,而颜色是4个(r,g,b,a))
    var attStride = 3;
    //顶点数据
    var vertex_position =[
         0.0, 1.0, 0.0,
         1.0, 0.0, 0.0,
        -1.0, 0.0, 0.0
    ];
    //创建缓冲区对象vbo
    var vbo = create_vbo(vertex_position);
    //绑定vbo
    gl.bindBuffer(gl.ARRAY_BUFFER,vbo);
    //开启attribute属性
    gl.enableVertexAttribArray(attLocation);
    //添加attribute属性
    gl.vertexAttribPointer(attLocation,attStride,gl.FLOAT,false,0,0);
    //生成矩阵
    var m = new matIV();
    //模型矩阵,视图矩阵,投影矩阵初始化
    var mMatrix = m.identity(m.create());
    var vMatrix = m.identity(m.create());
    var pMatrix = m.identity(m.create());
    var mvpMatrix = m.identity(m.create());
    //视图坐标变换,
    //第一个现在物体所在的坐标
    //第二个我看向的地方的坐标
    //第三个我的头部上方的方向向量
    //第四个传一个标准的视图矩阵进去
    m.lookAt([0.0,1.0,3.0],[0,0,0],[0,1,0],vMatrix);
    //投影变换
    m.perspective(90,c.width/c.height,0.1,100,pMatrix);
    //矩阵相乘
    m.multiply(pMatrix,vMatrix,mvpMatrix);
    m.multiply(mvpMatrix,mMatrix,mvpMatrix);
    //获取shader那里的mvpMatrix变量
    var uniLocation = gl.getUniformLocation(prg,'mvpMatrix');
    //传值到shader
    gl.uniformMatrix4fv(uniLocation,false,mvpMatrix);
    //画的方式是三角形,从零开始,三个一组
    gl.drawArrays(gl.TRIANGLES,0,3);
    //context刷新
    gl.flush();
    function create_shader(id){
        var shader;
        var scriptElement = document.getElementById(id);
        if(!scriptElement){return;}
        switch(scriptElement.type){
            //顶点着色器
            case 'x-shader/x-vertex':
            shader = gl.createShader(gl.VERTEX_SHADER);
            break;
            //片段着色器
            case 'x-shader/x-fragment':
            shader = gl.createShader(gl.FRAGMENT_SHADER);
            break;
            default:
            return;
        }
        //将标签为scriptElement.text的代码分配给shader
        gl.shaderSource(shader,scriptElement.text);
        //编译着色器
        gl.compileShader(shader);
        //判断是否编译成功
        if(gl.getShaderParameter(shader,gl.COMPILE_STATUS)){
            return shader;
        }else{
            alert(gl.getShaderInfoLog(shader));
        }
    }
    function create_program(vs,fs){
        //程序对象生成
        var program = gl.createProgram();
        //向程序对象分配(附加)着色器
        gl.attachShader(program,vs);
        gl.attachShader(program,fs);
        //链接着色器
        gl.linkProgram(program);
        //判断是否链接成功
        if(gl.getProgramParameter(program,gl.LINK_STATUS)){
            //成功的话使用该程序
            gl.useProgram(program);
            return program;
        }else{
            alert(gl.getProgramInfoLog(program));
        }
    }
    //创建顶点缓冲区对象
    function create_vbo(data){
        var vbo = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER,vbo);
        gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(data),gl.STATIC_DRAW);
        gl.bindBuffer(gl.ARRAY_BUFFER,null);
        return vbo;
    }
};


矩阵的js代码

参考文章:http://blog.csdn.net/lufy_legend/article/details/38446243


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值