跟着大佬学习——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>

更多推荐