WEBGL学习之三角形的旋转、平移、缩放

/**
 * 顶点着色器 
 */
var VSHADER_SOURCE = 
'attribute vec4 a_Position;\n'+//接收顶点坐标信息
'attribute vec4 a_Color;\n'+//接收顶点颜色信息
'uniform mat4 u_xformMatrix;\n'+//接收模型矩阵
'varying vec4 v_Color;\n'+//内插颜色信息
'void main() {\n'+
'gl_Position = u_xformMatrix * a_Position;\n'+
'v_Color = a_Color;\n'+//赋值颜色信息
'}\n'
/**
 * 片元着色器
 */
var FSHEADER_SOURCES = 
'precision mediump float;\n'+//精度声明
'varying vec4 v_Color;\n'+//接收顶点着色器内插进来的颜色信息
'void main() {\n'+
'gl_FragColor = v_Color;\n'+
'}\n'

var rotation_sleep = 45.0;

function main() {
    let canvas = document.getElementById('webgl');
    let gl = getWebGLContext(canvas);

    if(!gl){
        console.log("main gl error");
        return;
    }
    if(!initShaders(gl,VSHADER_SOURCE,FSHEADER_SOURCES)){
        console.log("main VSHADER_SOURCE FSHEADER_SOURCES error")
        return;
    }

    let u_xformMatrix = gl.getUniformLocation(gl.program,'u_xformMatrix');
    if(!u_xformMatrix){
        console.log("u_xformMatrix");
        return;
    }

    var currentAngle = 0.0;
    //创建一个矩阵
    var modelMatrix = new Matrix4();

    gl.clearColor(0.0,0.0,0.0,1.0);

    let n=initVertexBuffers(gl);
    var tick = function(){
        currentAngle = animate(currentAngle);
        draw(gl,n,currentAngle,modelMatrix,u_xformMatrix);
        requestAnimationFrame(tick);
    }
    tick();

}

function initVertexBuffers(gl){
    //颜色的坐标的数组
    var vertices = new Float32Array([
        0.2,0.0,1.0,0.0,0.0,
        0.5,0,0.0,1.0,0.0,
        0.35,0.3,0.0,0.0,1.0
    ]);

    var n=3;
    var vertexBuffer = gl.createBuffer();
    if(!vertexBuffer){
        console.log("initVertexBuffers vertexBuffer");
        return;
    }
    //字节长度
    var FSIZE = vertices.BYTES_PER_ELEMENT;
    gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);
    
    gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);

    var a_Position = gl.getAttribLocation(gl.program,'a_Position');
    if(a_Position<0){
        console.log("initVertexBuffers a_Position");
        return;
    }

    gl.vertexAttribPointer(a_Position,2,gl.FLOAT,false,FSIZE*5,0);

    gl.enableVertexAttribArray(a_Position);

    //赋值颜色
    var a_Color = gl.getAttribLocation(gl.program,'a_Color');
    gl.vertexAttribPointer(a_Color,3,gl.FLOAT,false,FSIZE*5,FSIZE*2);
    gl.enableVertexAttribArray(a_Color);

    return n;
}

function draw(gl,n,currentAngle,modleMatrix,u_modelMatrix){
    //设置为旋转矩阵
    modleMatrix.setRotate(currentAngle,0.0,0.0,1.0);
    //乘以平移矩阵
    modleMatrix.translate(0.35,0,0,1);
    //将旋转矩阵传递给顶点着色器u_modelMatrix变量
    gl.uniformMatrix4fv(u_modelMatrix,false,modleMatrix.elements);

    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.drawArrays(gl.TRIANGLES,0,n);
}

var g_last = Date.now();
function animate(angle){
    var now = Date.now();
    var elapsed = now-g_last;
    g_last = now;
    var new_angle = angle+(rotation_sleep*elapsed)/1000.0;
    return new_angle%360;
}

对于矩阵顺序的把握为重点

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值