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>

效果:

复盘:

相关推荐
zmzb01035 小时前
C++课后习题训练记录Day157
开发语言·c++
dunge20265 小时前
2026年7月最新ChatGPT Plus / Pro 与 Codex:当 AI Agent 最新5.6版本来袭,必须理解事务、幂等与补偿
开发语言·人工智能·python
SoaringHeart5 小时前
Flutter最佳实践:键盘辅助视图输入框天添加图片附件
前端·flutter
kyriewen6 小时前
我看完这篇安全论文——AI推荐的npm包,92%是编出来的
前端·javascript·ai编程
心中有国也有家7 小时前
AtomGit Flutter 鸿蒙客户端:Canvas 绘制进阶-路径、渐变与混合模式
android·javascript·flutter·华为·harmonyos
爱吃牛肉的大老虎7 小时前
rust基础之环境搭建
java·开发语言·rust
openKylin7 小时前
与全球技术演进同频,openKylin 3.0从C迈向Rust
c语言·开发语言·rust·开源·开放原子·openkylin
小心我捶你啊7 小时前
数据采集和Web解锁不是一回事,从用途到规则区分
前端·爬虫·网络协议
hunterandroid8 小时前
[鸿蒙从零到一] ArkUI 基础组件实战:Text、Image、Button 与 TextInput
前端