WebGL笔记:WebGL的基本绘图原理

最火前端Web组态软件(可视化) 随着物联网、大数据等技术高速发展,我们逐步向数字化、可视化的人工智能(AI)时代的方向不断迈进。智能时代是工业 4.0 时代,我国工业领域正努力从“制造”迈向“智造”的新跨越。 阅读详情

同步与异步绘图

  • 如果想要画出多个点,而不是每次点击只生成一个点,这时候就需要保存点击的痕迹

  • 但是如果代码中,有异步去绘制webgl的点,则会出现问题,如下关键代码

    // 修改attribute 变量
    gl.vertexAttrib2f(a_Position, -0.3, 0);
    // 绘制顶点
    gl.drawArrays(gl.POINTS, 0, 1);
    
    // 修改attribute 变量
    gl.vertexAttrib2f(a_Position, 0.3, 0);
    // 绘制顶点
    gl.drawArrays(gl.POINTS, 0, 1);
    
    setTimeout(() => {
      //修改attribute 变量
      gl.vertexAttrib2f(a_Position, 0, 0);
      //绘制顶点
      gl.drawArrays(gl.POINTS, 0, 1);
    }, 1000);
    
  • 这里同步代码中有两次drawArrays,异步代码中有一次drawArrays

  • 异步的代码会取代同步的代码,最终只会有一个点,如果移除setTimeout异步代码,则就是正常的两个点

异步绘图导致同步绘图数据丢失与解决方案

  • webgl的同步绘图的现象,其实是由webgl底层内置的颜色缓冲区导致的,这个颜色缓冲区它在电脑里会占用一块内存
  • 在使用webgl绘图的时候,是先在颜色缓冲区中画出来,这样的图像还在胸中,所以外人看不见,只有webgl系统自己知道
  • 在我们想要将图像显示出来的时候,那就照着颜色缓冲区中的图像去画,这个步骤是webgl 内部自动完成的,我们只要执行绘图命令即可
  • 颜色缓冲区中存储的图像,只在当前线程有效,我们先在js 主线程中绘图,主线程结束后,会再去执行信息队列里的异步线程
  • 在执行异步线程时,颜色缓冲区就会被webgl系统重置,之前的图像也就没了

解决方案

  • 将数据存储在一起,画图的时候,重新绘制即可,也就是用个数组就能解决问题

    <canvas id="canvas"></canvas>
    
    <!-- 顶点着色器 -->
    <script id="vertexShader" type="x-shader/x-vertex">
        attribute vec4 a_Position;
        void main() {
            // 点位
            gl_Position = a_Position;
            // 尺寸
            gl_PointSize = 50.0;
        }
    </script>
    
    <!-- 片元着色器 -->
    <script id="fragmentShader" type="x-shader/x-fragment">
        void main() {
            gl_FragColor = vec4(1,1,0,1);
        }
    </script>
    
    <script type="module">
      import { initShaders } from "./utils.js";
    
      const canvas = document.querySelector("#canvas");
      canvas.width = 200;
      canvas.height = 200;
    
      // 获取着色器文本
      const vsSource = document.querySelector("#vertexShader").innerText;
      const fsSource = document.querySelector("#fragmentShader").innerText;
    
      // 三维画笔
      const gl = canvas.getContext("webgl");
    
      // 初始化着色器
      initShaders(gl, vsSource, fsSource);
    
      // 设置attribute 变量
      const a_Position = gl.getAttribLocation(gl.program, "a_Position");
    
      // 声明颜色 rgba
      gl.clearColor(0, 0, 0, 1);
      // 刷底色
      gl.clear(gl.COLOR_BUFFER_BIT);
    
      // 存储顶点数据的数组
      const a_points = [
        { x: -0.3, y: 0 },
        { x: 0.3, y: 0 },
      ];
    
      render();
    
      setTimeout(() => {
        // 数据同步
        a_points.push({ x: 0, y: 0 });
        // 重新渲染
        render();
      }, 1000);
    
      // 渲染方法
      function render() {
        gl.clear(gl.COLOR_BUFFER_BIT);
        a_points.forEach(({ x, y }) => {
          gl.vertexAttrib2f(a_Position, x, y);
          gl.drawArrays(gl.POINTS, 0, 1);
        });
      }
    </script>
    
  • utils.js

    export function initShaders(gl, vsSource, fsSource) {
      // 创建程序对象
      const program = gl.createProgram();
      // 建立着色对象
      const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource);
      const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource);
      // 把顶点着色对象装进程序对象中
      gl.attachShader(program, vertexShader);
      // 把片元着色对象装进程序对象中
      gl.attachShader(program, fragmentShader);
      // 连接webgl上下文对象和程序对象
      gl.linkProgram(program);
      // 启动程序对象
      gl.useProgram(program);
      // 将程序对象挂到上下文对象上
      gl.program = program;
      return true;
    }
    
    function loadShader(gl, type, source) {
      // 根据着色类型,建立着色器对象
      const shader = gl.createShader(type);
      // 将着色器源文件传入着色器对象中
      gl.shaderSource(shader, source);
      // 编译着色器对象
      gl.compileShader(shader);
      // 返回着色器对象
      return shader;
    }
    
WEBGL入门的基础介绍 目录 WebGL基本介绍 概述 WebGL的特性 图形硬件的介绍 WebGL开发入门 WebGL绘制图形抽象过程 基于WebGL封装的框架 WebGL坐标系基础 视变换 投影变换 视口变换 实例演示(使用ThreeJS) 光照 光照类型 光照的原理(漫反射) 光照的原理(环境反射) 光照效果的对比 纹理映射 图片纹理 凹凸纹理 环境贴图 开发调试与... 阅读详情

相关推荐

HTML5 Canvas实现web画图之自由画笔

能实现web端以及手机端同时使用

web画图技术(svg、canvas、fusioncharts、anychart)简介

一、前言        如题,此处主要讨论网页上实现画图的技术,像java的swing,.net的chart不在今天的讨论范围。 二、讲啥 •SVG简介 •主流的画图方式? •各方式之间的差异? 三、SVG 3.1 SVG简介   定义 ScalableVector Graphics,可伸缩矢量图形; 它是使用 XML 来描述二维图形和

daxiang的专栏 1万+

web工作流画图界面

VML语言+js做的Web画图程序,给大家仅供参考

【HTML】【一文全解Canvas】从初学到实战,彻底掌握前端绘图神器!

前言一、Canvas 概述二、在 HTML 中使用 Canvas三、Canvas 绘制图形1、绘制矩形2、绘制圆形a. 绘制实心圆形b. 绘制空心圆形四、Canvas 绘制文本五、Canvas 绘制图片六、Canvas 动画效果1、setInterval() 实现动画2、requestAnimationFrame() 实现动画七、Canvas 使用注意事项八、利用Canvas绘制挂钟(原理-绘制弧形)- 简单练习1、 还原坐标系2、 绘制背景3、 绘制时钟指针4、循环绘制。

weixin_55846296的博客 1万+

一个非常实用的WEB画图控件

JAVA 实用的画图控件,收集整理的一个画图控件,里面有详细的程序说明,一看就懂

WEB画图框架 draw2d

draw2d很好的WEB画图框架,不要VML和SVG,纯JS

【web可视化】canvas画图学习详细教程笔记&完整代码

ctx.lineJoin = 'bevel'//设置线段连接处为默认/圆形/平直形式(miter/round/bevel)ctx.lineCap = 'round' //设置线帽为圆形round/butt默认/aquare方形。stroke()方法是进行绘制。把strokeRect()方法拆成了stroke()和rect()方法,好处就是使用。arc(圆心坐标,半径,初始角度,结束角度,顺时针false/逆时针true)用 ctx.closePath()//把线段的终点和起点连接起来这样更衔接了。

m0_67986791的博客 2050

蓝丽网的WEB画图工具

在WEB页中实现画各种图形,并生成代码 无任何插件,对工作流的图形化有很好的帮助 对于学习JavaScript的同志比较有帮助 精典作品

探索HTML5 Canvas:一个强大的Web图形绘制工具

探索HTML5 Canvas:一个强大的Web图形绘制工具 项目简介 html5Canvas是一个专注于HTML5 Canvas API教学与实践的项目,由Edward Zhong精心打造。它不仅提供了详尽的技术文档,还包含了一系列实用示例,帮助开发者理解和掌握在Web上使用Canvas进行动态图形绘制的能力。 技术分析 HTML5 Canvas是Web开发中的一项重要特性,它允许开发者通过Jav...

gitblog_00092的博客 659

基于STM32的简易电压、频率、占空比测量仪

任务详解:我们需要实现三个功能: 第一个是测频率的功能,输入信号为频率为1kHz~10kHz的三种波形(方波、三角波、正弦波),这也是我们最常见的三种波形。幅度是不需要测量的,所以先不关心幅度。 第二个是电压报警功能,当输入信号的幅度超过15V时,我们需要报警(这里我用了一个红色LED当报警器,有条件的还可以加个蜂鸣器)并且把此时的信号幅度显示在OLED屏幕上。 第三个是通信方式的要求,需要有串口通信功能。 第四个是计算占空比的任务,这个任务的输入是幅度为1V~10V、频率为20Hz ~1kHz的方波,需要

weixin_43469377的博客 7254

Grok-1.5+Ollama企业级本地化部署与合规实践指南

本文详细介绍了Grok-1.5+Ollama企业级本地化部署与合规实践指南,重点分析了本地化部署的成本优势和数据主权保障。通过RTX 4090显卡的硬件选型、Ubuntu 22.04系统优化及部署流程中的关键陷阱规避,为企业提供了高效、安全的AI模型部署方案。特别适合金融、医疗等敏感行业。

weixin_29094539的博客 184

WebGL 概念和基础入门

WebGL 技术出现的时间并不算短,然而尽管能够开发出拥有炫酷效果的 3D 网页却一直未能大火,现今应用的最多的也不过是 3D 网页游戏的开发。这其中很大一部分的原因便是受到网速发展的制约,在当今这个快节奏的社会中人们对于网页加载速度的忍耐度是极低的,一个 WebGL 开发的 3D 网页动辄需要三四秒的打开时间对用户而言无疑是极度不友好的。但是相信随着 5G 通信技术的发展,网络通信技术飞速发展下,WebGL 技术的明天可能会迎来新的发展契机。

张木期的博客 2万+

RPG MV游戏数据修改指南:从JSON解析到脚本进阶

游戏数据修改是游戏开发与逆向工程中的常见实践,其核心原理在于解析和操作游戏资源文件。许多现代游戏引擎采用结构化数据格式(如JSON)存储游戏配置,这为外部修改提供了可能。通过理解文件结构、数据格式与游戏逻辑的关联,开发者或爱好者可以调整游戏平衡、修复问题或实现个性化定制,这不仅能深化对游戏设计机制的理解,也具备实际的技术学习价值。本文以基于Web技术栈的RPG Maker MV(RPG MV)引擎为例,其游戏数据多以明文JSON存储,结构清晰。文章将具体阐述如何安全地修改角色属性、物品效果、敌人数据及技能公

weixin_29001419的博客 408

【《WebGL编程指南》读书笔记】

《WebGL编程指南》读书笔记-总纲

floating_heart的博客 826

AI人工智能与数据挖掘的技术融合趋势

我们的目的是搞清楚AI人工智能和数据挖掘是怎么融合在一起的,以及这种融合未来会有什么样的发展趋势。范围涵盖了这两种技术融合的原理、应用场景,还有未来可能面临的挑战。我们会先讲讲AI人工智能和数据挖掘是什么,它们之间有什么关系。然后说说它们融合的算法原理、数学模型。接着通过一个实际的项目案例,看看它们是怎么在实际中运用的。还会介绍一些它们的应用场景和相关工具。最后分析一下未来的发展趋势和挑战,并且总结学到的知识,提出一些思考题让大家思考。AI人工智能。

AI 领航者的博客 1367

锂电池剩余使用寿命预测(RUL) | 基于Stacked-LSTM-Autoencoder的锂电池寿命多变量多步预测(Tensorflow)

锂电池剩余使用寿命预测(RUL) | 基于Stacked-LSTM-Autoencoder的锂电池寿命多变量多步预测(Tensorflow)

前程算法屋的博客 851

《WebGL编程指南》学习笔记 02、WebGL 用鼠标绘点

webgl 的同步绘图的现象,其实是由webgl 底层内置的颜色缓冲区导致的。“胸有成竹”大家知道吧?这个颜色缓冲区就是“胸有成竹”的胸,它在电脑里会占用一块内存。在我们使用webgl 绘图的时候,是先在颜色缓冲区中画出来,这样的图像还在胸中,所以外人看不见,只有webgl系统自己知道。在我们想要将图像显示出来的时候,那就照着颜色缓冲区中的图像去画,这个步骤是webgl 内部自动完成的,我们只要执行绘图命令即可。颜色缓冲区中存储的图像,只在当前线程有效。

公子我姓柯 979

【OpenClaw从入门到精通】第12篇:OpenClaw 2026子代理实战全攻略:用ACP架构搭建多智能体协作网络(附完整代码)

本文聚焦OpenClaw 2026.3.2版本默认启用的ACP(Agent Communication Protocol)子代理机制,从核心概念、底层原理到企业级实操全流程拆解。先解析子代理的定义、ACP协议通信原理及主从代理分工逻辑,再提供环境准备的详细步骤(版本验证、配置调整、技能安装);随后通过三个递进式虚拟案例(客服分流、智能文档处理、企业级招聘全流程),提供可直接运行的完整代码、执行结果及技术要点解析;最后补充子代理管理运维、性能优化与避坑指南。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2385

WebGL的基本原理

Webgl实质上是基于光栅化的API,而不是基于3D的API。webgl根据你提供的代码绘制点,线和三角形。让webgl去做任何事情取决于你提供的代码。 webgl在你电脑的GPU上运行。所以你写的代码要能在GPU上运行。您以代码对的形式提供该代码。 这两个函数称为顶点着...

choula3583的博客 1503

金融数字化——详解2025年金融智能体深度应用报告【附全文阅读】

《2025年金融智能体深度应用报告》显示,金融智能体已实现80%部署率,推动行业效率提升30%-50%。报告指出智能体通过"感知-推理-规划-执行-进化"机制突破大模型局限,在风控、客服、投研等100+场景实现自动化。典型案例显示,工商银行信贷审批效率提升60%,蚂蚁数科智能客服解决80%问题。尽管面临系统协同、标准缺失等挑战,未来趋势将向多模态交互、自主进化和ESG投资等方向拓展。

cdfunlove的博客 207

计算分子相似度(摩根分子指纹计算)

import numpy as np import pandas as pd import seaborn as sns import matplotlib as plt from rdkit.Chem import Draw from rdkit.Chem import AllChem as Chem from rdkit.Chem import PandasTools from rdkit import DataStructs data = pd.read_csv(r'47_covidLead.csv'

weixin_39417324的博客 1388

webgl - 读书笔记

一. 认识webgl 课前准备 安装webstorm 或vscode 开发工具。 安装live-server,用于启服务,安装方法 npm i -g live-server 需掌握es6、html、css 的基础知识。 数学基础,三角函数和向量(非必须)。 课堂目标 对webgl 的概念有一个整体认知 掌握webgl 基本绘图原理和流程 知识点 webgl 概述 webgl 最短教程 - 在画布上刷底色 webgl 最简单图形 - 画一个点 第一章 webgl概述 1-webgl是什么? web

weixin_38245947的博客 984

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WebGL 入门

webgl 是在网页上绘制和渲染三维图形的技术,可以让用户与其进行交互。我们之前学过的div+css、canvas 2d 都是专注于二维图形的,它们虽然也能模拟一部分三维效果,但它们和webgl 比起来,那就是玩具枪和AK47的差别。综上所述,webgl 绘图好麻烦啊!麻烦不是不学的理由,因为后面还有three.js 为你排忧解难。那我们为啥不直接学习three.js 呢?那是因为three.js 若是只想画个旋转的立方体还好,若是要深入学习,实现复杂的模型交互逻辑,就必须要有webgl 基础了。

liubangbo的专栏 4157

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WEBGL保姆级教程(一):什么是WebGL

WebGL是一种基于OpenGL ES 2.0的3D绘图协议,它让浏览器能够不依赖插件直接渲染3D图形。通过结合JavaScript和OpenGL ES 2.0,WebGL利用Canvas元素作为画布,借助顶点着色器和片段着色器处理图形数据,实现硬件加速的3D渲染。其优势包括无需插件支持、跨平台兼容性和高效GPU加速。本文通过一个彩色三角形绘制案例,展示了WebGL的基本工作流程,包括创建缓冲区、编写着色器代码和图形绘制等核心步骤。

分享知识,拥抱变化 2531

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

WebGL快速入门

WebGL是一种用于在Web浏览器中实现高性能3D图形的技术。本文将帮助读者快速入门WebGL,了解其基本概念和使用方法。我们将介绍WebGL的基本架构和API,包括如何创建WebGL上下文、渲染对象和着色器编程等。此外,我们还会深入探讨WebGL的基本原理和渲染管线,以及如何通过优化渲染流程来提升性能。通过学习本文,读者将能够理解WebGL的核心概念和使用方法,并能够开始开发高性能的3D应用程序。

会思想的苇草i的博客 3143

WebGL简介

大家好,我是南木元元,热衷分享有趣实用的文章。HTML的元素为JavaScript提供了动态创建图形的API。第一种是Canvas,一般只能做2d操作,用canvas.getContext(“2d”)来建立一个CanvasRenderingContext2D二维渲染上下文。第二种是WebGL,通过canvas.getContext(‘webgl’)就能获取WebGL的3d上下文,进行3D的渲染。这两种都是常用的可视化方式,本文主要来介绍一下WebGL的使用。

~~~ 8832
上一篇: WebGL笔记:WebGL中JS与GLSL ES 语言通信,着色器间的数据传输示例:用鼠标控制点位
下一篇: 数据结构与算法之链表: 基于链表实现js中的原型链原理与算法实现 (Typescript版)
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值