webGL入门(五)绘制多边形

代码:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../绘制一个点/glMatrix.min.js"></script>
</head>
<body>
    <canvas id="webglCanvas" width="500" height="500"></canvas>
    <script>
        var webgl // 全局声明webgl
        var projMat4 // 全局声明投影矩阵
        var projMat4 = mat4.create() // 创建一个4*4的矩阵

        var vertexString = `
            attribute vec4 a_Position;
            uniform mat4 proj;
            void main() {
                gl_Position = a_Position;
                gl_PointSize = 60.0;
            }
        ` // 顶点着色器字符串
        var fragmentString = `
            precision mediump float;
            void main() {
                gl_FragColor = vec4(0, 1.0, 1.0, 1.0);
            }
        ` // 片元着色器字符串

        // 入口初始化函数
        function init(){
            initWebgl()
            initShader()// 初始化着色器
            initBuffer()// 数据缓冲区
            draw()// 绘制
        }
        // webgl初始化
        function initWebgl(){
            let webglDiv = document.getElementById('webglCanvas')
            webgl = webglDiv.getContext('webgl')
            webgl.viewport(0, 0, webglDiv.clientWidth, webglDiv.height) // 设置视口,四个参数分别是x,y,width,height 
            mat4.ortho(0, webglDiv.clientWidth, webglDiv.clientHeight, 0, -1, 1, projMat4) // 设置正交投影矩阵    
        }
        // 初始化着色器,shader初始化函数
        function initShader(){
            let vertexShader = webgl.createShader(webgl.VERTEX_SHADER) // 创建顶点着色器
            let fragmentShader = webgl.createShader(webgl.FRAGMENT_SHADER) // 创建片元着色器
            webgl.shaderSource(vertexShader, vertexString) // 顶点着色器绑定字符串
            webgl.shaderSource(fragmentShader, fragmentString) // 片元着色器绑定字符串
            webgl.compileShader(vertexShader) // 编译顶点着色器
            webgl.compileShader(fragmentShader) // 编译片元着色器
            if(!webgl.getShaderParameter(vertexShader, webgl.COMPILE_STATUS)){ // 判断顶点着色器是否编译成功
                console.log(webgl.getShaderInfoLog(vertexShader)) // 打印错误信息
                return
            }
            if(!webgl.getShaderParameter(fragmentShader, webgl.COMPILE_STATUS)){ // 判断片元着色器是否编译成功
                console.log(webgl.getShaderInfoLog(fragmentShader)) // 打印错误信息
                return
            }
            let program = webgl.createProgram() // 创建着色器程序
            webgl.attachShader(program, vertexShader) // 顶点着色器绑定到着色器程序
            webgl.attachShader(program, fragmentShader) // 片元着色器绑定到着色器程序
            webgl.linkProgram(program) // 链接着色器程序
            webgl.useProgram(program) // 使用着色器程序
            webgl.program = program // 将着色器程序绑定到webgl上
        }
        // 数据缓冲区初始化函数
        function initBuffer(){
            let aPosition = webgl.getAttribLocation(webgl.program, 'a_Position') // 获取顶点着色器中的a_Position变量
            let arr = [
                0,0.5,0,1.0,
                0.15,0.15,0,1.0,
                0.5,0,0,1.0,
                0.25,-0.15,0,1.0,
                0.35,-0.67,0,1.0,
                0,-0.3,0,1.0,
                -0.35,-0.67,0,1.0,
                -0.25,-0.15,0,1.0,
                -0.5,0,0,1.0,
                -0.15,0.15,0,1.0
            ]
            let LinePosition = new Float32Array(arr) // 创建一个点的位置
            let lineBuffer = webgl.createBuffer() // 创建缓冲区对象
            webgl.bindBuffer(webgl.ARRAY_BUFFER, lineBuffer) // 绑定缓冲区对象
            webgl.bufferData(webgl.ARRAY_BUFFER, LinePosition, webgl.STATIC_DRAW) // 上传数据到缓冲区
            webgl.enableVertexAttribArray(aPosition) // 启用顶点属性数组
            webgl.vertexAttribPointer(aPosition, 4, webgl.FLOAT, false, 4*4, 0) // 将缓冲区数据绑定到a_Position

            let uniforproj = webgl.getUniformLocation(webgl.program, 'proj') // 获取顶点着色器中的proj变量
            webgl.uniformMatrix4fv(uniforproj, false, projMat4) // 将投影矩阵传入顶点着色器,三个参数分别是变量,是否转置,矩阵
        }
        // 绘制函数
        function draw(){
            webgl.clearColor(0.0, 0.0, 0.0, 1.0) // 设置清空颜色
            webgl.clear(webgl.COLOR_BUFFER_BIT | webgl.DEPTH_BUFFER_BIT) // 清空颜色缓冲区
            // webgl.drawArrays(webgl.TRIANGLES, 0, 4) // 绘制点,三个参数分别是绘制类型,起始位置,顶点数量
            webgl.drawArrays(webgl.LINE_LOOP, 0, 10) // 绘制点,三个参数分别是绘制类型,起始位置,顶点数量
        }
        init()
    </script>
</body>
</html>

效果:

复盘:

相关推荐
Ronin30528 分钟前
【C++】类型转换
开发语言·c++
伍哥的传说41 分钟前
鸿蒙系统(HarmonyOS)应用开发之手势锁屏密码锁(PatternLock)
前端·华为·前端框架·harmonyos·鸿蒙
yugi98783843 分钟前
前端跨域问题解决Access to XMLHttpRequest at xxx from has been blocked by CORS policy
前端
mrbone1144 分钟前
Git-git worktree的使用
开发语言·c++·git·cmake·worktree·gitab
浪裡遊1 小时前
Sass详解:功能特性、常用方法与最佳实践
开发语言·前端·javascript·css·vue.js·rust·sass
真实的菜1 小时前
JVM类加载系统详解:深入理解Java类的生命周期
java·开发语言·jvm
代码讲故事1 小时前
多种方法实现golang中实现对http的响应内容生成图片
开发语言·chrome·http·golang·图片·快照·截图
旧曲重听12 小时前
最快实现的前端灰度方案
前端·程序人生·状态模式
默默coding的程序猿2 小时前
3.前端和后端参数不一致,后端接不到数据的解决方案
java·前端·spring·ssm·springboot·idea·springcloud
虾球xz2 小时前
CppCon 2018 学习:EFFECTIVE REPLACEMENT OF DYNAMIC POLYMORPHISM WITH std::variant
开发语言·c++·学习