图解WebGL&Three.js工作原理

小米L50M5-AD电视深度维修指南:软硬协同故障诊断与实操 智能电视维修已从传统硬件替换转向软硬协同诊断——其核心在于理解SoC芯片(如联发科MT5892)的固件驱动逻辑、电源时序容限与射频校准机制。这类设备常见故障(如开机黑屏、WiFi失联、花屏、自动重启)往往源于微小元器件参数漂移(如10μF电容衰减、10kΩ电阻偏移)、LVDS时序偏差或EDID数据不匹配,而非整板损坏。技术价值体现在精准定位‘临界失效’:用LCR表测小电容ESR、ADB抓取dmesg日志、SPI Flash读取射频校准参数等工程级手段,规避盲目换板。典型应用场景包括售后站高效返修、用户自主避 阅读详情

转载说明:
原作者:万技师
出处:http://www.cnblogs.com/wanbo/

1 我们讲什么?

我们讲两个东西:

  1. WebGL背后的工作原理是什么?
  2. 以Three.js为例,讲述框架在背后扮演什么样的角色?

2 我们为什么要了解原理?

我们假定你对WebGL已经有一定了解,或者用Three.js做过了一些东西,这个时候,你可能碰到了这样一些问题:

  1. 很多东西还是做不出来,甚至没有任何思路;
  2. 碰到bug无法解决,甚至没有方向;
  3. 性能出现问题,完全不知道如何去优化。

这个时候,我们需要了解更多。

3 先了解一个基础概念

  1. 什么是矩阵?简单说来,矩阵用于坐标变换,如下图:
    在这里插入图片描述
  2. 它具体是怎么变换的呢,如下图:
    在这里插入图片描述
  3. 举个实例,将坐标平移2,如下图:
    在这里插入图片描述

如果这时候,你还是没有理解,没有关系,你只需要知道,矩阵用于坐标变换。

4 WebGL的工作原理

4.1 WebGL API

在了解一门新技术前,我们都会先看看它的开发文档或者API。查看Canvas的绘图API,我们会发现它能画直线、矩形、圆、弧线、贝塞尔曲线。于是,我们看了看WebGL绘图API,发现:
在这里插入图片描述
它只能会点、线、三角形?一定是我看错了。没有,你没看错。
在这里插入图片描述
就算是这样一个复杂的模型,也是一个个三角形画出来的。

4.2 WebGL绘制流程

简单说来,WebGL绘制过程包括以下三步:

  1. 获取顶点坐标
  2. 图元装配(即画出一个个三角形)
  3. 光栅化(生成片元,即一个个像素点)
    在这里插入图片描述

接下来,我们分步讲解每个步骤。

4.2.1 获取顶点坐标

顶点坐标从何而来呢?一个立方体还好说,如果是一个机器人呢?没错,我们不会一个一个写这些坐标。往往它来自三维软件导出,或者是框架生成,如下图:
在这里插入图片描述
写入缓存区是啥?没错,为了简化流程,之前我没有介绍。由于顶点数据往往成千上万,在获取到顶点坐标后,我们通常会将它存储在显存,即缓存区内,方便GPU更快读取。

4.2.2 图元装配

我们已经知道,图元装配就是由顶点生成一个个图元(即三角形)。那这个过程是自动完成的吗?答案是并非完全如此。为了使我们有更高的可控性,即自由控制顶点位置,WebGL把这个权力交给了我们,这就是可编程渲染管线(不用理解)。WebGL需要我们先处理顶点,那怎么处理呢?我们先看下图:
在这里插入图片描述
我们引入了一个新的名词,叫“顶点着色器”,它由opengl es编写,由JavaScript以字符串的形式定义并传递给GPU生成。比如如下就是一段顶点着色器代码:

attribute vec4 position;
void main() {
  gl_Position = position; 
}

attribute修饰符用于声明由浏览器(JavaScript)传输给顶点着色器的变量值;position即我们定义的顶点坐标;gl_Position是一个内建的传出变量。这段代码什么也没做,如果是绘制2d图形,没问题,但如果是绘制3d图形,即传入的顶点坐标是一个三维坐标,我们则需要转换成屏幕坐标。比如:v(-0.5, 0.0, 1.0)转换为p(0.2, -0.4),这个过程类似我们用相机拍照。

4.2.2.1 顶点着色器处理流程

回到刚才的话题,顶点着色器是如何处理顶点坐标的呢?
在这里插入图片描述
如上图,顶点着色器会先将坐标转换完毕,然后由GPU进行图元装配,有多少顶点,这段顶点着色器程序就运行了多少次。你可能留意到,这时候顶点着色器变为:

attribute vec4 position;
uniform mat4 matrix;
void main() {
  gl_Position = position * matrix; 
}

这就是应用了矩阵matrix,将三维世界坐标转换成屏幕坐标,这个矩阵叫投影矩阵,由JavaScript传入,至于这个matrix怎么生成,我们暂且不讨论。

4.2.3 光栅化

和图元装配类似,光栅化也是可控的。
在这里插入图片描述
在图元生成完毕之后,我们需要给模型“上色”,而完成这部分工作的,则是运行在GPU的“片元着色器”来完成。它同样是一段opengl es程序,模型看起来是什么质地(颜色、漫反射贴图等)、灯光等由片元着色器来计算。如下是一段简单的片元着色器代码:

precision mediump float; 
void main(void) {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

gl_FragColor即输出的颜色值。

4.2.3.1 片元着色器处理流程

片元着色器具体是如何控制颜色生成的呢?
在这里插入图片描述

如上图,顶点着色器是有多少顶点,运行了多少次,而片元着色器则是,生成多少片元(像素),运行多少次。

4.3 WebGL的完整工作流程

至此,实质上,WebGL经历了如下处理流程:

  1. 准备数据阶段:在这个阶段,我们需要提供顶点坐标、索引(三角形绘制顺序)、uv(决定贴图坐标)、法线(决定光照效果),以及各种矩阵(比如投影矩阵)。其中顶点数据存储在缓存区(因为数量巨大),以修饰符attribute传递给顶点着色器;矩阵则以修饰符uniform传递给顶点着色器。
  2. 生成顶点着色器:根据我们需要,由JavaScript定义一段顶点着色器(opengl es)程序的字符串,生成并且编译成一段着色器程序传递给GPU。
  3. 图元装配:GPU根据顶点数量,挨个执行顶点着色器程序,生成顶点最终的坐标,完成坐标转换。
  4. 生成片元着色器:模型是什么颜色,看起来是什么质地,光照效果,阴影(流程较复杂,需要先渲染到纹理,可以先不关注),都在这个阶段处理。
  5. 光栅化:能过片元着色器,我们确定好了每个片元的颜色,以及根据深度缓存区判断哪些片元被挡住了,不需要渲染,最终将片元信息存储到颜色缓存区,最终完成整个渲染。

在这里插入图片描述

5 Three.js究竟做了什么?

我们知道,Three.js帮我们完成了很多事情,但是它具体做了什么呢,他在整个流程中,扮演了什么角色呢?我们先简单看一下,Three.js参与的流程:
在这里插入图片描述
黄色和绿色部分,都是Three.js参与的部分,其中黄色是JavaScript部分,绿色是opengl es部分。我们发现,能做的,Three.js基本上都帮我们做了。

  • 辅助我们导出了模型数据;
  • 自动生成了各种矩阵;
  • 生成了顶点着色器;
  • 辅助我们生成材质,配置灯光;
  • 根据我们设置的材质生成了片元着色器。

而且将WebGL基于光栅化的2D API,封装成了我们人类能看懂的 3D API。

5.1 Three.js顶点处理流程

从WebGL工作原理的章节中,我们已经知道了顶点着色器会将三维世界坐标转换成屏幕坐标,但实际上,坐标转换不限于投影矩阵。如下图:
在这里插入图片描述
之前WebGL在图元装配之后的结果,由于我们认为模型是固定在坐标原点,并且相机在x轴和y轴坐标都是0,其实正常的结果是这样的:
在这里插入图片描述

5.1.1 模型矩阵

在这里插入图片描述
现在,我们将模型顺时针旋转Math.PI/6,所有顶点位置肯定都变化了。

box.rotation.y = Math.PI/6;

但是,如果我们直接将顶点位置用JavaScript计算出来,那性能会很低(顶点通常成千上万),而且,这些数据也非常不利于维护。所以,我们用矩阵modelMatrix将这个旋转信息记录下来。

5.1.2 视图矩阵

在这里插入图片描述
然后,我们将相机往上偏移30。

camera.position.y = 30;

同理,我们用矩阵viewMatrix将移动信息记录下来。

5.1.3 投影矩阵

在这里插入图片描述
这是我们之前介绍过的了,我们用·projectMatrix·记录。

5.1.4 应用矩阵

然后,我们编写顶点着色器:

gl_Position = position * modelMatrix * viewMatrix * projectionMatrix;

这样,我们就在GPU中,将最终顶点位置计算出来了。实际上,上面所有步骤,Three.js都帮我们完成了。
在这里插入图片描述

5.2 片元着色器处理流程

我们已经知道片元着色器负责处理材质、灯光等信息,但具体是怎么处理呢?如下图:
在这里插入图片描述

5.3 Three.js完整运行流程

在这里插入图片描述
当我们选择材质后,Three.js会根据我们所选的材质,选择对应的顶点着色器和片元着色器。Three.js中已经内置了我们常用着色器。

QT串口通信控制LED上位机开发教程 串口通信是嵌入式系统与PC端交互的基础技术,通过UART协议实现设备间的数据传输。QT框架提供了跨平台的串口编程支持,结合其GUI模块可以快速开发上位机控制程序。在工业自动化和物联网领域,这种上下位机架构广泛应用于设备监控和控制场景。本案例展示了如何使用QT的SerialPort模块实现LED控制功能,包含串口参数配置、指令发送等核心功能实现,为嵌入式GUI开发提供实践参考。 阅读详情

相关推荐

基于YOLOv8的玉米病害监测系统

本研究的主要目标是设计并实现一个基于深度学习的玉米病害识别系统,通过采用YOLOv8算法进行玉米叶片病害的自动化识别。研究首先对玉米病害的种类和特点进行了分析,选择了具有代表性的病害类型,如玉米锈病、灰叶斑病、枯叶病和健康叶片,以构建一个多类别的分类问题。数据集的构建和处理是研究的关键部分,通过数据增强、图像标注等手段确保了数据的多样性和丰富性,从而提高了模型的泛化能力。

yupan__的博客 496

Three.js的物体点击选中拾取原理剖析

Hello, 大家好,今天来说一下three.js的物体拾取原理! 声明:本文介绍的是three.js全屏模式下的原理,如果涉及到three.js渲染在网页的一部分,请自行推导。 第一节 介绍Three.js的坐标系 先来粗浅的介绍一下Three的拾取原理,我们先介绍一下Three.js的坐标系,我们知道Three.js是右手坐标系。 我用最浅显的一句话介绍就是,Z轴指向屏幕前的自己时就是右手坐标系。 第二节 介绍Three.js物体点击选中拾取原理 选中物体的原理就是如果点A在物体内,那.

xyphf的博客 2747

动手学Moveit2 | 运行配置好的机械臂功能demo

通过这个小demo你可以直观的感受moveit2的强大,但还有很多需要我们探索的,比如机械臂是如何规划的,规划的过程中如何结合环境信息,规划的时候机械臂如何求解,如何和真实的机械臂对接等等,这些都需要你来进一步探索,今天就到这里,明天给大家秀一下小仙女焊的fishbot运控板。

生活不止眼前的苟且 8880

【附源码】数字孪生 系统中常用 Three.js 效果的实现原理!!!

大厂技术高级前端Node进阶点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群哈喽,大家好 我是考拉????。近年来 Three.js 3D 可视化在各种业务场景中频频出镜,其惊艳的表现力往往离不开各种 3D 效果的加持。本文将着重聊一聊数字孪生系统中常用的3D效果,并以图示的方式拆解其背后的实现原理。源码地址:https://gitee.com/shuling365/three...

程序员成长指北 3221

DeepSeek+Coze扣子搭建智能体(保姆级教程)

DeepSeek+Coze扣子搭建智能体(保姆级教程)

yizhen91y的博客 1万+

电子系统设计与创新实践作品:简易电子琴

题目 4:简易电子琴 (1)具有8个音阶按键,每个音阶按键频率如表1所示。 (2)每个按键对应LED显示。 (3)音阶信号经功放连接8欧姆扬声器,输出功率可达1W。 (4)每个音阶输出音量一样。 (5)扬声器输出音量可调节,音量调节分为高、中、低三档,并进行档位显示。

weixin_47510497的博客 2858

three.js算不算前端高级玩法?带你看看交互原理和案例动图

综上所述,基于Three.js进行模型交互的原理主要包括渲染循环、3D空间和相机、鼠标和触摸事件、射线投射以及更新模型状态,除了上述以外,还可以应用碰撞检测、骨骼动画、物理引擎、光照和阴影以及特效和后期处理等技术来实现更丰富和逼真的Three.js模型交互效果。同时,通过使用阴影算法,可以在模型和场景中生成逼真的阴影效果,增加模型的立体感和深度感。根据这些事件的触发,可以实时更新相机的位置和方向,以及场景中的模型状态。通过定义骨骼结构和骨骼动画数据,可以控制模型的骨骼和关节的变换,从而实现模型的动画效果。

贝格前端工场的博客 1976

流体仿真软件:COMSOL Multiphysics二次开发_(11).COMSOL与外部软件的数据交换

通过上述方法,您可以实现 COMSOL Multiphysics 与外部软件的数据交换,从而更好地集成和分析仿真结果。无论是从文本文件导入数据,导出数据到 MATLAB,还是通过 API 和 COMSOL Server 实现实时通信,都能满足不同场景下的需求。希望这些内容对您在流体仿真领域的开发工作有所帮助。

kkchenjj的博客 1553

Threejs简单介绍(含案例演示)

编写canvas的方法

土豆块嘎嘣脆的博客 1万+

在 ABAP 平台配置 OAuth 2.0 Client(OA2C_CONFIG):一份可落地的全景实践

本文详细介绍了在ABAP平台中配置OAuth 2.0客户端的完整流程。重点讲解了四种授权类型(Client Credentials、Authorization Code、SAML 2.0 Bearer Assertion、Resource Owner Password Credentials)的适用场景和配置要点,以及客户端认证的三种方式(Client Secret、Client Certificate、mTLS)。文章提供了操作步骤、排错建议和工程实践指导,包括端点配置、回调地址管理、scopes设置等关

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 355

【OpenClaw从入门到精通】第20篇:OpenClaw实战—从零搭建教育自动化助教系统(作业批改+智能答疑+学情分析)【2026实测】

本文基于OpenClaw开源框架,聚焦教育行业“答疑重复、批改耗时、学情模糊”三大核心痛点,提供从环境部署到功能落地的全流程实操方案。通过整合QQ群交互、代码分析、数据可视化等技能,构建“智能答疑+作业批改+学情分析”的自动化助教系统。系统支持7×24小时群聊答疑、多语言作业自动评审、学情数据周报生成,经实测可使助教工作时间减少60%、作业批改效率提升5-10倍、学情问题识别提前5周。文中包含完整配置步骤、可直接运行的代码示例及避坑指南,兼顾新手入门与进阶实操,帮助教育工作者快速落地自动化工具,从重复劳动中

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

图解WebGL&Three.js工作原理【转】

原文地址:https://www.cnblogs.com/wanbo/p/6754066.html 一、我们讲什么? 我们讲两个东西:1、WebGL背后的工作原理是什么?2、以Three.js为例,讲述框架在背后扮演什么样的角色? 二、我们为什么要了解原理? 我们假定你对WebGL已经有一定了解,或者用Three.js做过了一些东西,这个时候,你可能碰到了这样一些问题:1、...

169

电压跟随器在ADC采样电路中的作用分析

电压跟随器在ADC采集系统中扮演关键角色,它能解决分压电路因ADC输入阻抗导致的电压误差问题。通过运放构成的电压跟随器可隔离信号源与负载,保证采样精度,尤其适用于高阻抗传感器或高速采样场景。工程应用中需注意运放带宽、轨对轨输出能力及抗干扰设计。合理使用电压跟随器能显著提升信号完整性,在复杂电子系统中成为不可或缺的"信号桥梁。

硬核科技 658

图解WebGL&Three.js工作原理(转载)

去年的时候,有研究3D 可视化项目,用three.js 做了个3D可视化监控V1版本,主要参照的是郭隆邦技术博客http://www.yanhuangxueyuan.co...three editorhttps://threejs.org/editor/form-generatorhttps://mrhj.gitee.io/form-ge... 学习three的时候,看用户文档还是比较头疼,很多东西不知道如何查看,只能挨着找demo,找到相似效果,然后查demo代码找关键API,在去看官方docs,之前..

u010340306的博客 1115

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【转载】图解WebGL&Three.js工作原理

一、我们讲什么? 我们讲两个东西: 1、WebGL背后的工作原理是什么? 2、以Three.js为例,讲述框架在背后扮演什么样的角色?   二、我们为什么要了解原理? 我们假定你对WebGL已经有一定了解,或者用Three.js做过了一些东西,这个时候,你可能碰到了这样一些问题: 1、很多东西还是做不出来,甚至没有任何思路; 2、碰到bug无法解决,甚至没有方向;

Carl0v0的博客 948

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: This beta version of Typora is expired,please download and install a newer version.
下一篇: 初见物理引擎库Cannon.js:基本使用
syzdev
博客等级 码龄9年 852粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值