webGL编程指南 第三章 矩阵平移三角形.translatedTriangle_Matrix

我会持续更新关于wegl的编程指南中的代码。

当前的代码不会使用书中的缩写,每一步都是会展开写。希望能给后来学习的一些帮助

git代码地址 :git

接着 上一节 中 我们使用矩阵进行旋转,这次我们使用矩阵实现位移

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <h3>可以按下按键ADSW</h3>
    <p><span id="num"></span></p>
    <canvas id='canvas'></canvas>
    <script>
        let canvas = document.getElementById('canvas');
        let gl = canvas.getContext('webgl');

        let vertexShaderSource = `
            attribute vec4 a_Position;
            uniform mat4 u_mat4; 
            void main(){
                gl_Position=u_mat4*a_Position;
            }
        `
        let fragmentShaderSouce = `
            precision mediump float;
            void main(){
                gl_FragColor = vec4(1.0,0.0,0.0,1.0);
            }
        `
        // 创建顶点着色器
        let vertexShader = gl.createShader(gl.VERTEX_SHADER);
        // 设置着色器源代码
        gl.shaderSource(vertexShader, vertexShaderSource)
        // 编译着色器
        gl.compileShader(vertexShader)

        // 创建片元着色器
        let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
        // 设置着色器源代码
        gl.shaderSource(fragmentShader, fragmentShaderSouce)
        // 编译着色器
        gl.compileShader(fragmentShader)
        //创建渲染程序
        let program = gl.createProgram();
        // 附着顶点着色器和片元着色器到渲染程序
        gl.attachShader(program, vertexShader);
        gl.attachShader(program, fragmentShader);
        gl.linkProgram(program);
        //使用当前渲染程序
        gl.useProgram(program)


        //检测链接是否正确
        if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
            throw gl.getProgramInfoLog(program);
        }
        // x的坐标移动变量
        let translationX = 0.0;
        // y的坐标移动变量
        let translationY = 0.0;
        //三角形的坐标
        let positonArray = new Float32Array([0.0, 0.5, -0.5, -0.5, 0.5, -0.5])
        // 获取顶点着色器中a_Position的存储位置
        let a_Position = gl.getAttribLocation(program, 'a_Position');
        //  获取顶点着色器中u_mat4的存储位置
        let u_mat4 = gl.getUniformLocation(program, 'u_mat4');



        // 创建buffer
        let buffer = gl.createBuffer();
        // 绑定buffer
        gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
        // 向buffer中写入数据
        gl.bufferData(gl.ARRAY_BUFFER, positonArray, gl.STATIC_DRAW);
        // 向a_Position中传递变量
        gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
        // 开启a_Position
        gl.enableVertexAttribArray(a_Position);



        //绘制
        gl.clearColor(0.0, 0.0, 0.0, 1.0);



        const render = function () {
            // 设置位移的变量(主列)
            let mate4 = new Float32Array([
                1.0, 0.0, 0.0, 0.0,
                0.0, 1.0, 0.0, 0.0,
                0.0, 0.0, 1.0, 0.0,
                translationX, translationY, 0.0, 1.0,
            ])
            // 传递矩阵
            gl.uniformMatrix4fv(u_mat4, false, mate4)
            // 清空画布
            gl.clear(gl.COLOR_BUFFER_BIT);
            // 绘制图形
            gl.drawArrays(gl.TRIANGLES, 0, 3);

            setNumer()
        }
        render()

        document.onkeydown = function (e) {    //对整个页面监听  
            var keyNum = window.event ? e.keyCode : e.which;       //获取被按下的键值  
            //判断如果用户按下了回车键(keycody=13)  
            if (keyNum == 65) {
                console.log('A');
                translationX -= 0.1; 
                render()
            }

            //判断如果用户按下了空格键(keycode=32),  
            if (keyNum == 68) {
                console.log('D');
                translationX += 0.1; 
                render()
            }
            //判断如果用户按下了空格键(keycode=32),  
            if (keyNum == 83) {
                console.log('S');
                translationY -= 0.1; 
                render()
            }


            //判断如果用户按下了空格键(keycode=32),  
            if (keyNum == 87) {
                console.log('W');
                translationY += 0.1; 
                render();

            }

        }
        function setNumer (){
           let text = document.getElementById('num');
           text.innerText = `translationX:${ translationX} translationY:${translationY}`
        }


    </script>
</body>

</html>
相关推荐
求真求知的糖葫芦15 小时前
耦合传输线分析学习笔记(八)对称耦合微带线S参数矩阵推导与应用(上)
笔记·学习·矩阵·射频工程
独自破碎E19 小时前
【模拟】顺时针旋转矩阵
java·线性代数·矩阵
求真求知的糖葫芦21 小时前
耦合传输线分析学习笔记(九)对称耦合微带线S参数矩阵推导与应用(下)
笔记·学习·矩阵·射频工程
CC码码21 小时前
基于WebGPU实现canvas高级滤镜
前端·javascript·webgl·fabric
ct9781 天前
WebGL 图像处理核心API
图像处理·webgl
AI科技星1 天前
加速运动电荷产生引力场方程求导验证
服务器·人工智能·线性代数·算法·矩阵
求真求知的糖葫芦1 天前
RF and Microwave Coupled-Line Circuits射频微波耦合线电路4.2 使用均匀耦合线的方向性耦合器学习笔记(自用)
笔记·学习·线性代数·射频工程
好奇龙猫1 天前
【大学院-筆記試験練習:线性代数和数据结构(19)】
数据结构·线性代数
放荡不羁的野指针1 天前
leetcode150题-矩阵
线性代数·算法·矩阵
TracyCoder1231 天前
LeetCode Hot100(15/100)——54. 螺旋矩阵
算法·leetcode·矩阵