webgl学习的第一个案例

跟着大佬学习——b站-web图形学工作站
webgl的变换矩阵
webgl绘制点:
1.主要需要渲染一个二维画布,
2.然后获取三维画笔,设置渲染区域,投影区域,
3.创建顶点着色器和片元着色器,将glsl相关字符串与着色器相连接(目前的理解,可能有错),编译着色器,初始化webgl项目,将着色器添加到项目中,连接项目,使用项目
4.绘制

<!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>控制点坐标</title>
    <script src="./glMatrix-0.9.6.min.js"></script>
    <script>
        var webgl;
        var projMat4;
        //创建单位矩阵
        projMat4 = mat4.create()
            //模板字符串(顶点着色器)点坐标,投影坐标系
            //mat4表示4*4矩阵
        var vertex5String = `
        attribute vec4 a_position;
        uniform mat4 proj;
        void main(){
            gl_Position =proj* a_position;
            gl_PointSize = 60.0;
        }
        `;
        var fragmentString = `
        void main(){
            gl_FragColor = vec4(0,0,1.0,1.0);
        }
        `;



        function init() {
            initWebgl();
            initShader();
            initBuffer();
            draw();

        }
        //webgl初始化函数
        function initWebgl() {
            //获取容器
            let webglDiv = document.getElementById("webglcanvas")
                //获取上下文,即画笔
            webgl = webglDiv.getContext("webgl")
                //webgl的可视域(原点,x距离,y距离)
            webgl.viewport(0, 0, webglDiv.clientWidth, webglDiv.clientHeight)
                //webgl的投影坐标系(距离,投影矩阵)
            mat4.ortho(0, webglDiv.clientWidth, webglDiv.clientHeight, 0, -1, 1, projMat4)

        }
        //shader初始化函数(GPU计算语言)
        function initShader() {
            //
            let vsshader = webgl.createShader(webgl.VERTEX_SHADER);
            let fssageder = webgl.createShader(webgl.FRAGMENT_SHADER);

            //由于设置webglShader着色器的GLSL的程序代码(shader[着色器对象],source[GLSL代码的字符串])
            webgl.shaderSource(vsshader, vertex5String);
            webgl.shaderSource(fssageder, fragmentString)

            webgl.compileShader(vsshader);
            webgl.compileShader(fssageder);

            let program = webgl.createProgram();
            webgl.attachShader(program, vsshader);
            webgl.attachShader(program, fssageder);

            webgl.linkProgram(program);
            webgl.useProgram(program);

            webgl.program = program;

        }
        //数据缓冲区初始化函数
        function initBuffer() {
            let pointPosition = new Float32Array([100.0, 100.0, 0.0, 1.0])
                //获取着色器中声明的变量,然后对其进行赋值
            let aPosition = webgl.getAttribLocation(webgl.program, "a_position")
                //为顶点attribute变量赋值([指定待修改顶点attribute变量的存储位置],[顶点attribute变量的各分量值])
            webgl.vertexAttrib4fv(aPosition, pointPosition);
            //返回统一变量位置(program,name)
            let uniforproj = webgl.getUniformLocation(webgl.program, "proj");
            //通过统一变量引用将同一变量值传入渲染管线(uniform的位置,)
            webgl.uniformMatrix4fv(uniforproj, false, projMat4);


        }
        //webgl绘制函数
        function draw() {
            webgl.clearColor(0.0, 0.0, 0.0, 1.0);
            webgl.clear(webgl.COLOR_BUFFER_BIT);
            webgl.drawArrays(webgl.POINTS, 0, 1);

        }
    </script>
</head>

<body onload="init()">
    <canvas id="webglcanvas" width="500" height="500"></canvas>
</body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这里提供一个具体的 WebGL 层次化运动模型案例的代码,用于实现一个具有层次化运动的模型。 首先,我们需要加载一个模型文件,这里使用的是 Wavefront OBJ 格式的模型。可以使用第三方库如 Three.js 来加载。 ```javascript var loader = new THREE.OBJLoader(); loader.load('model.obj', function (model) { // 将模型添加到场景中 scene.add(model); }); ``` 接下来,我们需要为模型的每个部分添加骨骼。这里使用的是 Three.js 中的 SkinnedMesh 类。 ```javascript var skinnedMesh = new THREE.SkinnedMesh(geometry, material); // 为每个部分添加骨骼 var bone1 = new THREE.Bone(); var bone2 = new THREE.Bone(); skinnedMesh.add(bone1); bone1.add(bone2); ``` 然后,我们需要定义每个骨骼的动画。这里使用的是 Three.js 中的 AnimationMixer 类。 ```javascript var mixer = new THREE.AnimationMixer(skinnedMesh); // 定义动画 var animation = new THREE.AnimationClip('animation', duration, [ new THREE.NumberKeyframeTrack(bone1.uuid + '.scale', [0, duration], [1, 2, 1, 1, 1, 1]), new THREE.NumberKeyframeTrack(bone2.uuid + '.quaternion', [0, duration], [0, 0, 0, 1, 0, 0, 0, 1]) ]); // 将动画添加到混合器中 var action = mixer.clipAction(animation); action.play(); ``` 最后,在每一帧渲染时,更新混合器的状态。 ```javascript function animate() { requestAnimationFrame(animate); // 更新混合器状态 mixer.update(clock.getDelta()); renderer.render(scene, camera); } ``` 这是一个简单的 WebGL 层次化运动模型案例代码,具体实现还需要根据实际情况进行调整和完善。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值