首页 > 其他分享 >webGL入门对于LINES_STRIP与LINE_STRIP绘制连线的不同之处

webGL入门对于LINES_STRIP与LINE_STRIP绘制连线的不同之处

时间:2024-09-29 18:20:46浏览次数:10  
标签:1.0 webGL LINES program let STRIP 顶点 着色器 webgl

图片对比:

上图为LINE_STRIP

 上图为LINES_STRIP

LINE_STRIP代码:

<!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 = proj * 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 = [
                100, 100, 0, 1.0,
                200, 200, 0, 1.0,

                330, 200, 0, 1.0,
                400, 300, 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.LINE_STRIP, 0, 4) // 绘制点,三个参数分别是绘制类型,起始位置,顶点数量
        }
        init()
    </script>
</body>
</html>

标签:1.0,webGL,LINES,program,let,STRIP,顶点,着色器,webgl
From: https://blog.csdn.net/Ian1025/article/details/142602232

相关文章

  • PbootCMS附件上传失败报错UNKNOW: Code: 8192; Desc: stripos():
    当遇到上传失败报错 UNKNOW:Code:8192;Desc:stripos():Non-stringneedleswillbeinterpretedasstringsinthefuture.Useanexplicitchr()calltopreservethecurrentbehavior;File:/www/wwwroot/aaa.xxxx.com/core/function/file.php;Line:176; 时,可以通......
  • 上传失败报错 UNKNOW: Code: 8192; Desc: stripos()
    错误提示和您的解决方案提到了将 $ext 传递给 chr() 函数,这在大多数情况下是不合适的,因为 chr() 是用来从ASCII值转换为对应的字符,而 $ext 作为文件扩展名应该是直接的字符串形式。正确的做法应该是确认 $ext 是否为字符串类型,并且检查报错是否源于其他原因,比如误报或者......
  • QML与WebGL的交互编程
    QML与WebGL的交互编程使用AI技术辅助生成QT界面美化视频课程QT性能优化视频课程QT原理与源码分析视频课程QTQMLC++扩展开发视频课程免费QT视频课程您可以看免费1000+个QT技术视频免费QT视频课程QT统计图和QT数据可视化视频免费看免费QT视频课程QT性能优化视频......
  • QML与WebGL的交互编程
    QML与WebGL的交互编程使用AI技术辅助生成QT界面美化视频课程QT性能优化视频课程QT原理与源码分析视频课程QTQMLC++扩展开发视频课程免费QT视频课程您可以看免费1000+个QT技术视频免费QT视频课程QT统计图和QT数据可视化视频免费看免费QT视频课程QT性能优化视频免费看......
  • 了解如何在 <lines (Modulojs) 中创建 API 支持的 Zelda BOTW 怪物画廊 Web 组件
    模数教程回来了!大家好!暑假结束后,我带着modulo教程回来了。我正在制作更多教程-请继续关注。也就是说,如果您对我的下一个主题有任何特别的想法,请务必在评论中告诉我!我的上一篇教程是关于api驱动的pokémondanceparty组件的超级快速且有趣的“仅html,无js”教程,不到30......
  • ReactJS + Stripe:试用期天数未按预期工作
    :试用期天数未按预期工作一、问题描述(一)预期的试用期天数该应用程序使用ReactJS和Stripe进行支付处理。试用期天数应设置为14天,但实际试用期天数并未按预期工作。用户在注册后,试用期仅持续了7天,而不是预期的14天。这导致用户在试用期结束前就被要求支付订阅费用,给用户带来......
  • Python 中的 strip() 和 split() 方法详解
    目录一、strip()方法1.什么是strip()?2.基本语法3.基本用法示例1)去除空白字符2)移除指定字符4.lstrip()和rstrip()5.注意事项二、split()方法1.什么是split()?2.基本语法3.基本用法示例1)按空格分割字符串2)指定分隔符3)限制分割次数4.rsplit()方法......
  • 【Python报错已解决】AttributeError: ‘WindowsPath‘ object has no attribute ‘rs
    ......
  • WinForms_使用StatusStrip控件在窗体底部显示状态信息
    StatusStrip控件的用途·状态信息显示:可以用来显示程序运行时的状态信息,如加载进度、状态提示、时间等。·添加控件:可以在StatusStrip上添加多个控件,比如ToolStripStatusLabel(用来显示标签文本),ToolStripProgressBar(用来显示进度条)等。·布局:StatusStrip控件会自......
  • Unity Webgl小游戏存取数据的解决方案
    在Unity中,如果我们要存储数据,通常会使用以下几种方法:1.Unity官方提供的PlayerPrefs2.Unity官方提供的ScriptableObject3.使用Json,XML,CSV等文件保存4.使用数据库存储 而在Webgl手机小游戏中,通常会以PlayerPrefs进行保存,因为PlayerPrefs是一个极其轻量级的存储方式可以用于......