WebGL笔记: 2D和WebGL坐标系对比和不同的画图方式, 程序对象通信,顶点着色器,片元着色器

OpenGL/WebGL用点绘制有立体感的小球 点默认绘制的是一个正方形,要想变成圆形,需要丢弃一部分像素。本文实现一个将网格绘制成一个个球形,并有一定的立体感特效,希望对大家有帮助。衰减因子可以自己根据距离等规则进行调整。 阅读详情

WebGL 坐标系

  • canvas2d画布和webgl画布使用的坐标系都是二维直角坐标系,但它们坐标原点、y 轴的坐标方向,坐标基底都不一样
  • canvas2d
    • 坐标系的原点在左上角, x轴朝右,y轴朝下
    • 1个单位的宽就是一个像素的宽,1个单位的高就是一个像素的高,都是按像素来走
  • webgl
    • 坐标系的原点在画布中心,x轴朝右,y轴朝上
    • 1个单位的宽是画布宽度的一半,1个单位的高就是画布高度的一半

Canvas2D 画图示例

// canvas画布
const canvas = document.getElementById('canvas');
// 二维画笔
const ctx = canvas.getContext('2d');
// 设置画笔的颜色
ctx.fillStyle = 'red';
// 用画笔画一个矩形
ctx.fillRect(100, 100, 300, 200);

WebGL 画出一个点

  • webgl并不是基于js来绘制,而是基于专业的三维图形渲染引擎来绘制,也就是 GLSL ES 语言来实现三维绘制
  • 在webgl中我们使用js来编程, 基于一个 “程序对象” 的概念来和 GLSL ES 语言 进行通信
<canvas id="canvas"></canvas>

<!-- 顶点着色器 -->
<script id="vertexShader" type="x-shader/x-vertex">
  void main() {
    gl_Position = vec4(0,0,0,1); // 设置点位, 注意webgl坐标系中的单位
    gl_PointSize = 50.0; // 设置尺寸
  }
</script>

<!-- 片元着色器 -->
<script id="fragmentShader" type="x-shader/x-fragment">
  void main() {
    gl_FragColor = vec4(1,1,0,1); // 黄色
  }
</script>

<!-- js脚本 -->
<script type="module">
  import { initShaders } from "./utils.js";

  const canvas = document.querySelector("#canvas");
  canvas.width = 200;
  canvas.height = 200;

  // 获取着色器文本,这里就是上述我们写的GLSL ES语言着色器代码
  const vsSource = document.querySelector("#vertexShader").innerText;
  const fsSource = document.querySelector("#fragmentShader").innerText;

  //三维画笔
  const gl = canvas.getContext("webgl");

  // 初始化着色器
  // 功能:解析着色器文本,整合到程序对象里,关联webgl上下文对象,实现两种语言的相互通信
  initShaders(gl, vsSource, fsSource);

  // 刷颜色
  gl.clearColor(0, 0, 0, 1);
  gl.clear(gl.COLOR_BUFFER_BIT);

  // 绘制顶点 以点来画
  gl.drawArrays(gl.POINTS, 0, 1);
</script>

工具脚本 util.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;
}
  • 着色器语言就是 GLSL ES 语言, 不是JS语言
  • 顶点着色器(Vertex shader):描述顶点的特征,如位置、颜色等
    • 是绘图的框架,类似于html(不恰当的比喻)
    • 顶点着色器里的顶点就是补间动画里的关键帧
    • 顶点着色器里的顶点就是决定这一条直线的两个点
    • 顶点着色程序,要写在type=“x-shader/x-vertex” 的script中
    • 在顶点着色器中,gl_Position 是顶点的位置,gl_PointSize 是顶点的尺寸,这种名称都是固定写法
    • vec4() 是一个4维矢量对象, 将vec4() 赋值给顶点点位gl_Position 的时候,其中的前三个参数是x、y、z,第4个参数默认1.0,
  • 片元着色器(Fragment shader):进行逐片元处理,如光照
    • 是绘图的装饰,类似于css(不恰当的比喻), 片元着色器不会给顶点着色,而是给顶点间的片元着色
    • 片元着色器里的片元就是关键帧之间以某种算法算出的插值, 举个例子,就像是把直线画到画布上后,这两个点之间构成直线的每个像素
    • 在webgl里的片元是像素的意思
    • 片元着色程序,要写在type=“x-shader/x-fragment” 的script中
    • 在片元着色器中,gl_FragColor 是片元的颜色
  • 注意:
    • void main() {…… } 是主体函数
    • gl_Position, gl_PointSize, gl_FragColor 是固定写死的着色器语言变量
    • 将vec4() 赋值给片元颜色gl_FragColor 的时候,其中的参数是r,g,b,a
    • 上述 util.js 中的执行顺序,就是webgl必须要实现的逻辑
  • drawArrays
GPU渲染管线与着色器原理详解:从图形渲染到并行计算架构 图形渲染是计算机图形学的核心领域,其本质是将三维数据转换为二维像素的过程。这一过程依赖于GPU(图形处理器)内部高度并行的渲染管线架构。渲染管线通过一系列固定功能与可编程阶段协同工作,其中可编程着色器(如顶点着色器和片元着色器)是实现复杂视觉效果的关键。理解渲染管线不仅对游戏开发、三维可视化等图形应用至关重要,其背后的大规模数据并行处理思想,也正是现代GPU通用计算(GPGPU)和AI训练(如GPU微调大模型)的硬件基础。本文以工厂流水线为喻,系统解析了渲染管线的各个阶段、数据流动与状态管理,并深入探讨了着 阅读详情

相关推荐

JavaScript游戏引擎全景解析:从2D到3D的实战进阶指南

游戏引擎是现代游戏开发的核心框架,它通过封装底层图形API和运行时环境,为开发者提供高效的渲染、物理、音频等模块。其工作原理基于场景图、实体组件系统和主循环更新机制,旨在降低开发复杂度,提升性能与跨平台能力。在技术价值上,引擎能够显著加速原型开发,优化资源管理与内存使用,是构建复杂交互应用的关键基础设施。常见的应用场景包括2D/3D游戏开发、数据可视化、模拟训练和互动媒体艺术。本文以Phaser、Three.js和Babylon.js等主流引擎为例,深入探讨其架构设计、性能优化与实战集成,帮助开发者构建从认

axfcjwkbi259888707的博客 789

使用 WebGL 创建 2D 内容

一旦创建 WebGL 上下文创建成功,你就可以在这个上下文里渲染画图了。而对我们而言最简单的事,莫过于绘制一个没有纹理的 2D 图形了。那就让我们从画出一个正方形开始吧。

qq_25547755的博客 1189

WebGL渲染与创建2D内容

WebGL是一个强大的工具,可以用来在Web浏览器中创建复杂的3D图形。虽然它的设计初衷是为了3D渲染,但也可以用于创建2D内容。通过巧妙地利用几何、投影和纹理,我们可以构建出各种2D图形。

天涯学馆 672

使用canvas 和 webgl2制作界面系统(一)

canvas webgl

qianbo042311的博客 1180

JavaScript 3D图片特效代码大全

本文还有配套的精品资源,点击获取 简介:JavaScript作为前端开发的关键语言,通过WebGL技术能够实现强大的3D图形渲染效果。本专题集中展示了一系列3D图片特效的实现代码,包括3D变换、动画和交互效果的示例。每个HTML文件演示不同的特效,如3D轮播、图像翻转等,而JavaScript库文件封装了3D核心逻辑。学习者需要理解3D坐标系统、矩阵运算、着色器编程、纹理映...

weixin_30205153的博客 1257

Volume-Rendering:使用 Three.js 和行进立方体算法对 3D 医学图像进行体积渲染

#体积渲染 ##介绍 此应用程序使用 Three.js 实现了行进立方体算法,以便可以在 Web 浏览器中显示医学图像和函数。 查看医学图像时,可以更改表面水平以显示图像的不同元素。 例如,我们可以查看人脚的表面,增加表面值后,我们可以查看脚的骨骼结构。 ##用法 该应用程序可以在这里找到( )。 可以在此处下载其他 .raw 3D 文件 ( )。 要使用该应用程序,用户需要选择要渲染的对象、更新渲染设置并渲染文件。 w,a,s,d 键可用于在渲染场景中移动。 J,K,L,I 可用于旋转对象。 #####选择要渲染的对象 按选择对象按钮 根据对象的类型,可能需要从下拉列表中选择一个值 按加载 3D 文件、加载函数或上传本地文件 等待对象加载 一旦所有对话框自动关闭,就可以渲染对象 #####更新渲染设置 按设置按钮 在下面的对话框中,输入必要的值 渲染设置特定于正在渲染的文件或函数

WebGL Shader着色器GLSL语言

WebGL Shader着色器GLSL语言

weixin_45086164的博客 1945

统信UOS系统网络服务异常排查:WIFI图标消失与网络设置缺失的解决方案

本文详细解析了统信UOS系统WIFI图标消失与网络设置缺失的常见问题,提供了从基础修复到进阶排查的完整解决方案。重点分析了NetworkManager服务异常的根本原因,包括系统更新中断、权限配置错误等,并给出实用的命令行操作指南和预防措施,帮助用户快速恢复网络功能。

weixin_29234239的博客 622

分享webgl魔幻星球

比如有负责渲染HTML+css的工人,有负责渲染二维图形的工人,有负责渲染三维图形的工人。webgl坐标基底中的两个分量分别是半个canvas的宽和canvas的高,即1个单位的宽便是半个个canvas的宽,1个单位的高便是半个canvas的高。canvas 2d 坐标系的坐标基底有两个分量,分别是一个像素的宽和一个像素的高,即1个单位的宽便是1个像素的宽,1个单位的高便是一个像素的高。渲染二维图形的工人和渲染三维图形的工人不是一个国家的,他们说的语言不一样。渲染三维图形的工人说的是GLSL ES 语言。

通达的博客 957

ic后端学习笔记-floorplan

floorplan是布图规划,规划包括定义芯片的大小,定义芯片内各种模块、hard macros(硬核。比如RAM,ROM及其他IP模块等)、IO等的大小和位置,有时候还需要提前定义一些placement blockages,groups/regions等等,是后端设计的第一步,也是后续所有P&R工作的基础。floorplan与placement的区别是。

tfrofc的博客 5832

条件风险价值CVaR内容介绍(MATLAB例程)

在对微电网优化调度过程中,由于新能源机组出力和负荷的不确定性,若采用确定性的优化调度方案会存在一定的风险。反之,若风电和光伏输出功率的实际值高于预测值时,则需要降低可控机组出力或者弃风弃光,这都会给系统带来运行费用增加的风险。下,损失超过VaR值时的条件均值[1]。VaR是指在一定的置信水平下,某一投资组合在未来某一时间段内的最大损失。为m维决定系统风险损失的随机向量f(y)为y的概率密度函数。式中,m为所有场景的数量,yk为第k个场景下随机变量的值,为第k个场景发生的概率。的最小值即为CVaR,对应的。

贾贾的博客 3061

WEBGL(1):WEBGL介绍

顶点变换后的操作是图元装配(primitive assembly),硬件上具体是怎么回事不用思考,从程序的角度来看,就是绘制函数drawArrays()或drawElements()第一个参数绘制模式mode控制顶点如何装配为图元, gl.LINES的定义的是把两个顶点装配成一个线条图元,gl.TRIANGLES定义的是三个顶点装配为一个三角面图元,gl.POINTS定义的是一个点域图元。顶点着色器和片元着色器是可编程的功能单元,拥有更大的自主性,还有光栅器、深度测试等不可编程的功能单元。

u013938578的博客 683

基于大模型的重度膝关节骨关节炎全流程预测与治疗方案研究

本研究基于大模型构建了重度膝关节骨关节炎(KOA)预测体系,涵盖术前风险预测、手术方案优化、术中监测和术后康复指导全流程。通过分析临床和影像数据,模型在手术风险预测准确率(85%)、并发症预警(血栓预测准确率88%)等方面显著优于传统方法。研究实现了临床数据与AI技术的深度融合,术前预测指导麻醉选择(如高危患者推荐椎管内麻醉),术中实时监测生命体征,术后个性化康复方案使患者HSS评分平均提升45分。

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1390

webgl 基础渲染demo_WebGL 初印象

最近由于工作需要,开始学习 WebGL 相关的知识。这篇文章的目的就是记录下学习过程中的一些知识概念,并实现一个简单的 demo,帮助大家快速理解 webgl 的概貌并上手开发。最后会分享自己对于 webgl 的几点想法,给有需要的人提供参考。WebGL 全称 Web Graphics Library,是一种支持 3D 的绘图技术,为 web 开发者提供了一套 3D 图形相关的接口。通过这些接口,...

weixin_39527372的博客 811

5、癌症数据预处理技术与深度学习在癌症预测中的应用

本文详细介绍了癌症数据预处理技术和深度学习在癌症预测中的应用。针对CT扫描图像、X射线图像、超声图像、基因表达数据和文本数据等不同类型的癌症数据,分别阐述了去噪、插值、配准、归一化等预处理技术的具体方法。同时,分析了深度学习在乳腺癌、白血病和宫颈癌预测中的作用,结合相关影响因素探讨了模型的应用潜力。此外,还总结了深度学习在癌症预测中面临的挑战及未来发展方向,为癌症的早期诊断与精准预测提供了理论支持和技术参考。

alice7model的博客 123

在 VS Code 里配置 SAP Joule for Developers 的 ABAP AI side-by-side 能力

摘要: 随着ABAP开发工具链的演进,VS Code逐渐融入ABAP开发流程,SAP Joule for Developers的ABAP AI能力通过side-by-side模式(基于BTP中央服务)为多系统开发提供统一AI支持。该模式避免了各ABAP后端独立升级AI能力的碎片化问题,由管理员配置BTP订阅URL后,开发者可在ADT或VS Code中全局调用。实际落地需注意角色分工(管理员配置服务,开发者填写URL)、AI units资源规划及配置细节(如区分全局与项目级设置)。建议将Joule URL纳入

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

WebGL实战入门:从零绘制你的第一个3D点

本文是WebGL入门实战指南,详细讲解如何从零开始绘制第一个3D点。内容涵盖WebGL核心概念、Canvas上下文创建、顶点与片元着色器的编写与编译,以及如何通过缓冲区动态传递顶点数据。通过一步步的代码示例,帮助初学者理解WebGL底层图形API的工作原理,并成功在三维空间中点亮第一个点,为后续深入学习高性能3D图形编程打下坚实基础。

u9v0w的博客 594

【S32K3 MCAL配置】-4.1-CAN Driver:如何解决CAN帧发送丢帧问题

【S32K3 MCAL配置】-4.1-CAN Driver:如何解决CAN帧发送丢帧问题

「汽车电子助手」的博客 1442

webGL

WebGL在电脑的GPU中运行,需要使用能在GPU上运行的代码,包括顶点着色器和片元着色器,使用GLSL语言。例如,Three.js是一个综合性的WebGL库,Cesium.js专用于3D地图开发,而Babylon.js则是国外较为流行的WebGL库。例如,绘制一个三角形时,GPU上的工作是先调用三次顶点着色器计算出三角形的3个顶点在裁剪空间坐标系中的对应位置,然后调用片元着色器完成每个顶点颜色值的计算。其次,它利用底层的图形硬件加速功能进行图形渲染,是通过统一的、标准的、跨平台的OpenGL接口实现的。

Present is best Present! 1146

路由三大分类:直连路由、静态路由、动态路由

直连路由、静态路由和动态路由各有其独特的特点和适用场景。直连路由适用于简单的直接连接网络,静态路由提供了精确的路径控制,而动态路由则在大型复杂网络中展现出强大的适应性和自动化能力。了解和掌握这三种路由类型的配置和管理,对于网络管理员来说,是确保网络高效、安全运行的重要技能。

网络技术联盟站 4699

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

浅识WebGL和Three.js

想必各位看官大大都了解过,进行3D图形渲染,主要依赖显卡(GPU)为我们提供强大的运算支持。GPU也像不同CPU架构具备不同的指令集一样,不同的显卡厂商也为不同的GPU型号提供了不同的底层指令逻辑,所支持的能力也不尽相同。为了简化方便图形应用开发和硬件适配的工作量,诞生了一些可以让不同应用方便调用的图形库,用以抹平底层硬件实现的差异,例如。

JasonTanTJX的博客 8057

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

webgl坐标转换_WebGL教程

前言通过WebGL做了很多项目,感觉有必要录制一套视频教程,所以在这里写一个录制大纲,大家也可以通过章节目录了解下WebGL的基本内容。视频教程发布地址Threejs引擎Threejs是webgl国内应用最广泛的一款三维引擎,实际做项目的时候一般都是通过一款三维引擎来完成,这样要比直接使用原生WebGL要方便的多,所在这里放了一个相关的链接。 Threejs教程大纲链接:https://blog....

weixin_42335570的博客 679

假人有限元模型

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WebGL教程

前言 通过WebGL做了很多项目,感觉有必要录制一套视频教程,所限在这里写一个录制大纲,大家也可以通过章节目录了解下WebGL的基本内容。 Threejs引擎 Threejs是webgl国内应用最广泛的一款三维引擎,实际做项目的时候一般都是通过一款三维引擎来完成,这样要比直接使用原生WebGL要方便的多,所在这里放了一个相关的链接。 Threejs教程大纲链接:https://blog.csdn....

u014291990的博客 4346

WebGL与具身智能融合实战:掌握3大关键步骤实现动态可视化系统

掌握WebGL具身智能可视化核心方法,解决复杂系统动态呈现难题。结合三维渲染与智能行为模拟,涵盖场景构建、数据驱动动画与交互优化三大步骤,适用于机器人仿真、虚拟训练等场景。高效直观,值得收藏。

ByteChat的博客 993

Canvas 3D API(WebGL)入门:从零创建你的第一个3D场景

三维图形开发为网页带来了前所未有的沉浸式体验,而Canvas 3D API(通常指WebGL)是实现这一能力的核心技术。它并非一个独立的API,而是基于OpenGL ES规范

2509_93883384的博客 435

WebGL 数字孪生项目的开发框架

摘要:WebGL是开发Web端数字孪生项目的轻量化跨平台方案,主要采用Three.js(工业场景)和Cesium.js(地理空间)框架。核心技术包括:使用glTF/GLB数据格式、WebSocket/MQTT实时通信、坐标转换算法,以及着色器和后处理增强视觉效果。开发需重点解决模型轻量化、场景烘焙和POI标注交互问题。该方案免插件、跨平台,但受浏览器性能限制,需采用3DTiles分层调度策略。典型工具包括Blender建模和3DTilesRendererJS处理瓦片数据。开发周期短,适合PC/移动端应用。

zhaoyin0335的博客 315
上一篇: WebGL笔记:设置画布底色,从样式中解析颜色并设置画布底色,设置动态画布底色
下一篇: WebGL笔记:WebGL中JS与GLSL ES 语言通信,着色器间的数据传输示例:js控制绘制点位
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、付费专栏及课程。

余额充值