WebGL笔记:绘制矩形面的几种方式以及封装封装多边形对象来绘制不同图形

【零基础学WebGL】绘制矩形 我们先来看一下,最终实现的效果。。。。 效果看起来真的很简单。一句css的事,还写一篇文章??? 别急着走,往下看,有干货 !!! 接下来,进入正题,一步步分解在WebGL世界如何绘制一个矩形。 第一步 :获取WebGL渲染上下文 这里不过多介绍,主要是使用canvas.getContext API,获取webgl上下文。 const createContext = (id: string, width: number, height: number) => { let element: HT 阅读详情

绘制矩形面

  • 可以绘制的面只有三角面,要绘制矩形面的话,只能用两个三角形去拼

1 ) 使用 三角带 TRIANGLE_STRIP 绘制矩形


  • 回顾一下之前的规律:

    • 第一个三角形:v0>v1>v2
    • 第偶数个三角形:以上一个三角形的第二条边+下一个点为基础,以和第二条边相反的方向绘制三角形
    • 第奇数个三角形:以上一个三角形的第三条边+下一个点为基础,以和第二条边相反的方向绘制三角形
  • 关键顶点绘制数据

    const vertices = new Float32Array([
        -0.2, 0.2,
        -0.2,-0.2,
        0.2, 0.2,
        0.2,-0.2,
    ])
    
  • 绘制: gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)

2 ) 使用 三角带 TRIANGLE_FAN 绘制矩形


  • 回顾一下之前的规律:

    • v0>v1>v2: 以上一个三角形的第三条边+下一个点为基础,按照和第三条边相反的顺序,绘制三角形
    • v0>v2>v3: 同上
    • v0>v3>v4: 同上
    • v0>v4>v5: 同上
  • 基于此,设计顶点关键数据

    const vertices = new Float32Array([
        -0.2, -0.2,
        0.2, -0.2,
        0.2, 0.2,
        -0.2, 0.2
    ])
    
  • 绘制: gl.drawArrays(gl.TRIANGLE_FAN, 0, 4)

3 )使用独立三角形,绘制矩形


  • 绘制规律

    • 这里就是普通的三角形,画了2个,需要6个点
    • 上面两个面的绘制顺序是: v0>v1>v2,v3>v4>v5
  • 顶点关键数据

    const vertices = new Float32Array([
        -0.2, 0.2,
        -0.2, -0.2,
        0.2, 0.2,
        0.2, 0.2,
        -0.2, -0.2,
        0.2, -0.2
    ])
    

可以根据自己的需求,绘制各种各样的图形

封装多边形对象

1 )封装一个Poly 对象,用于绘制多边形

const defAttr = () => ({
  gl: null,
  vertices: [],
  geoData: [],
  size: 2,
  attrName: 'a_Position',
  count: 0,
  types: ['POINTS'],
})

export default class Poly {
  constructor(attr) {
    Object.assign(this,defAttr(),attr)
    this.init()
  }
  init() {
    const { attrName, size, gl } = this;
    if(!gl) return
    const vertexBuffer = gl.createBuffer()
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
    this.updateBuffer()
    const a_Position = gl.getAttribLocation(gl.program,attrName)
    gl.vertexAttribPointer(a_Position, size, gl.FLOAT, false, 0, 0)
    gl.enableVertexAttribArray(a_Position)
  }
  addVertice(...params) {
    this.vertices.push(...params)
    this.updateBuffer()
  }
  popVertice() {
    const { vertices, size }=this
    const len = vertices.length
    vertices.splice(len-size,len)
    this.updateCount()
  }
  setVertice(ind,...params) {
    const { vertices, size }=this
    const i = ind * size
    params.forEach((param,paramInd) => {
      vertices[i+paramInd] = param
    })
  }
  updateBuffer() {
    const { gl,vertices } = this
    this.updateCount()
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW)
  }
  updateCount() {
    this.count = this.vertices.length / this.size
  }
  updateVertices(params) {
    const { geoData } = this
    const vertices = []
    geoData.forEach(data => {
      params.forEach(key => {
        vertices.push(data[key])
      })
    })
    this.vertices=vertices
  }
  draw(types = this.types) {
    const { gl, count } = this
    for(let type of types) {
      gl.drawArrays(gl[type],0,count);
    }
  }
}
  • 属性

    • gl webgl上下文对象
    • vertices 顶点数据集合,在被赋值的时候会做两件事
      • 更新count 顶点数量,数据运算尽量不放渲染方法里
      • 向缓冲区内写入顶点数据
    • geoData 模型数据,对象数组,可解析出 vertices 顶点数据
    • size 顶点分量的数目
    • positionName 代表顶点位置的attribute 变量名
    • count 顶点数量
    • types 绘图方式,可以用多种方式绘图
  • 方法

    • init() 初始化方法,建立缓冲对象,并将其绑定到webgl 上下文对象上,然后向其中写入顶点数据。将缓冲对象交给attribute变量,并开启attribute 变量的批处理功能。
    • addVertice() 添加顶点
    • popVertice() 删除最后一个顶点
    • setVertice() 根据索引位置设置顶点
    • updateBuffer() 更新缓冲区数据,同时更新顶点数量
    • updateCount() 更新顶点数量
    • updateVertices() 基于geoData 解析出vetices 数据
    • draw() 绘图方法

2 )应用1

const poly = new Poly({
  gl,
  vertices:[0, 0.2]
})

poly.draw(['POINTS'])

setTimeout(()=>{
  poly.addVertice(-0.2, -0.1);
  gl.clear(gl.COLOR_BUFFER_BIT);
  poly.draw(['POINTS'])
}, 1000)

setTimeout(()=>{
  gl.clear(gl.COLOR_BUFFER_BIT);
  poly.draw(['POINTS','LINE_STRIP'])
}, 2000)

3 )应用2

// 实例化多边形
const poly = new Poly({
    gl,
    types:['POINTS','LINE_STRIP']
})

// 鼠标点击事件
canvas.addEventListener("click", (event) => {
    const { x,y } = getMousePosInWebgl(event, canvas);
    poly.addVertice(x,y);
    gl.clear(gl.COLOR_BUFFER_BIT);
    poly.draw();
});
学废了系列 - WebGIS vs WebGL图形编程 前工作中有不少涉及到地图的项目,我参加了几次技术评审,前端伙伴们在 WebGIS 方面的知识储备稍有不足,这次分享的主要目的是科普一些在前端领域比较常用的 WebGIS 知识。另外,我之前的工作中积攒了一些从零开始搭建 WebGL 地图引擎的微薄经验,虽然最终遗憾没有上线,但在其中学到的一些WebGL知识还是值得分享一下。WebGL 可以说是前端可视化技术领域难度最大的一项图形编程技术,所以今天就结合 WebGIS 这个话题顺带分享一些 WebGL 的相关知识,不会太深入,很细节的技术点在后续文章里再讲解。 阅读详情

相关推荐

WEBGL Shader零基础教程(十八):基础图形与颜色效果之绘制基本图形

本文介绍了使用WebGL Shader绘制基本图形的核心原理与实践方法。首先讲解了WebGL渲染流程,强调像素级计算与抗锯齿处理的重要性。随后通过5个实战案例(矩形、圆形、三角形、圆角矩形、正多边形)详细演示了不同图形的绘制逻辑,包括坐标转换、边界判断和交互实现。文中还提供了常见问题排查指南,如变形、锯齿和延迟问题,并给出优化技巧以提升性能与视觉效果。最后,文章总结了核心知识点,并建议了进一步学习方向,包括图形动画、纹理映射和复杂UI组合等进阶内容。

分享知识,拥抱变化 923

webgl绘制图形API——drawArrays、drawElements

gl.drawArrays()作为webgl中常用的函数图形绘制方法,可以在浏览器按照指定的模式绘制图形,与之相对的gl.drawElements()函数也是常用的绘制函数,本文将介绍二者的区别与使用。

qq_37987033的博客 4244

webgl - 3- 绘制三角形(上)

三角形是一个最简单,稳定的面,webgl中的三维模型都是由三角形面组成的。 本章节目标: 1.理解多点绘图原理 2.可以绘制三角形,并将其组合成多边形。 知识点: 换缓冲区对象 点,线,面图像 第一章webgl的绘图方式 先看下webgl是怎么绘图的: 1.绘制多点: 如果是线,就连接点成线 如果是面,那就在图形内部,逐便元填色 webgl绘图的方式就是这么简单,接下来就说一下这个绘图方式在程序中是如何实现的。 第2章:绘制多点: 在webgl 里所有的图形都是由顶点连接而成的,咱们就先画

weixin_38245947的博客 827

webgl之绘制一个矩形

功能:使用webgl绘制一个矩形,这里通过绘制两个三角形来实现一个矩形的绘制 步骤: 1 获取webgl上下文 2 获取着色器字符串 3 创建,加载,编译着色器 4 给着色器的变量赋值 5 绘制图形 第一步:获取webgl上下文 // 获取WebGL上下文 var canvas = docum...

1116

JavaScript WebGL 绘制一个面

引子 JavaScript WebGL 基础疑惑点之后进行了一些优化,然后尝试绘制常见二维的面。 WebGL 中几何体最终都是由三角形构成,由三角形切入比较合适。 Origin My GitHub 绘制三角形 这是示例,基于绘制一条直线主要的变化有: 顶点 绘制图元 顶点 三角形有三个顶点,在基础疑惑点中知道坐标系是右手坐标系,个人习惯描述顶点的顺序以图形中心为原点,从第一象限到第四象限。 let vertices = [ 0.5, 0.5, 0.0, // 第一象限 -0.5,

XXHolic 579

webGL 综合教程100+【目录】

webGL 综合教程100+旨在为开发者提供两大方面的知识信息:(1)提供详细的每个api知识点的详解 (2)提供实战的示例,提供源代码。 在这量大系统性的知识下,给用户提供清晰的思路和示例参考,更好的服务于自己的webGL开发项目。

大剑师兰特的GIS世界 2241

webgl入门-绘制三角形

在实际项目中,我们绘制完了图形,往往还会对其进行修改变换,下一篇咱们会说一下如何变换图形。

zgynbnbnb的博客 1430

webgl入门-基础矩形绘制

衔接上一篇代码。

weixin_43623808的博客 329

WebGL学习系列-多边形绘制原理

前言 前面学习了通过缓冲区对象来绘制多个点的原理,在实际的3D世界里,有好多复杂的模型,但细化分解后又是由一个个基础的几何图形构成的,掌握了基础图形的绘制才能够理解更加复杂的模型。本节将会讲解三角形,矩形以及利用三角函数绘制圆。 WebGL几何图形绘制 之前的篇章我们通过 drawArrays 这个api绘制过单个点以及多个点,然而,它的功能不仅仅如此,它也是绘制多边形的基石。先来看下面这张熟悉...

android开发笔记 575

WebGL学习及项目实战(第07期:多面体)

本文梳理实现了通过索引、以及顶点和顶点颜色,绘制多面体(面立方体)的两个功能,更深的学习了对索引的使用(对点的多重使用),以及多面体颜色通过顶点颜色确定,前面是从第05期开始颜色由js传给shader,这里我们详细看代码

qf2005100102的博客 880

线性调频LFM脉冲压缩 连续波雷达仿真&线性调频信号仿真分析压缩matlab程序源码

13、线性调频信号(LFM)压缩感知的稀疏与重构算法(OMP)的matlab仿真程序(一个可以在matlab上运行的压缩感知实例;8、具有多普勒频移的线性调频信号(知道带宽、采样频率、T使用MATLAB仿真线性调频信号即LFM,同时具有多普勒频移时,匹配滤波后的波形变化。19、CW脉冲和LFM信号Matlab仿真(这是matlab仿真程序,实现了常规雷达信号CW和线性调频信号LFM的仿真)18、lfm信号模糊函数图 matlab(用matlab 实现的线性调频信号信号(lfm)的模糊函数图)

2301_77866396的博客 402

03-绘制三角形.md

前言 三角形是一个最简单、最稳定的面,webgl 中的三维模型都是由三角面组成的。咱们这一篇就说一下三角形的绘制方法。 课堂目标 理解多点绘图原理。 可以绘制三角形,并将其组合成多边形。 知识点 缓冲区对象 点、线、面图形 第一章 webgl 的绘图方式 我们先看一下webgl是怎么画图的。 绘制多点 如果是线,就连点成线 如果是面,那就在图形内部,逐片元填色 webgl 的绘图方式就这么简单,接下咱们就说一下这个绘图方式在程序中是如何实现的。 第二章 绘制多点 在webgl

qq_22188085的博客 454

高速设计注意事项总结——MDI篇

在以太网高速通信系统中,MDI(Medium Dependent Interface,介质相关接口)是连接物理层芯片(PHY)与传输介质(如网线)的关键接口,其设计直接影响信号完整性、传输速率和抗干扰能力。本文围绕 MDI 及 RJ45 接口电路、关键参数、设计与布线要点展开,为高速以太网设计提供参考。本文包含MDI 及 RJ45 接口电路组成、电路设计注意事项、布局布线要求等内容

qq_16237389的博客 1453

PIXI 基本图形-PIXI文档翻译(6)

1、基本图形 使用图像纹理是制作精灵的最有用的方法之一,但Pixi也有自己的低级绘图工具。您可以使用它们来制作矩形,形状,线条,复杂的多边形和文本。并且,幸运的是,它使用与Canvas绘图API几乎相同的API,所以,如果你已经熟悉canvas,这里没有什么真正新的学习。但是最大的优点是,与Canvas绘图API不同,您使用Pixi绘制的形状是由GPU上的WebGL渲染的。Pixi允许您访问所有...

海宇的博客 3213

14、OpenClaw(龙虾助手)Skill 开发完整规范(2026最新版)

OpenClaw Skill 开发指南摘要: Skill 是 OpenClaw AI 助手的核心扩展机制,支持声明式(SKILL.md)和原生代码(JS/TS/Python)两种开发模式。声明式 Skill 通过 Markdown 定义触发条件和执行流程,适合简单业务;原生代码 Skill 提供完整编程能力,适合复杂场景。开发需遵循标准化项目结构,包含 SKILL.md(元数据)、manifest.json(权限声明)等文件,并严格处理错误和多系统适配。新版要求原生 Skill 必须声明文件、网络等权限,确

欢迎光临~知1而N的博客 1243

告别AT串口线!用STM32F407的USB FS口直连EC800M进行物联网通信

本文介绍了一种创新的物联网通信方案,利用STM32F407的USB FS接口直连EC800M模块,替代传统的AT串口线连接。通过详细的硬件对比、STM32CubeMX配置和USB驱动调试步骤,展示了如何实现更高效的AT指令通信,同时降低硬件复杂度和功耗。

weixin_29189987的博客 707

WebGL画圆的几种方式

需求: 看了一段时间WebGL,现在想画一个圆,方式应该有很多,我现在列出自己练习的几个 分析: WebGL只能画点、线、三角形,我现在要画一个圆,基本上就只能靠三角形模拟出来一个 下表的图形都是通过三角形来构造的“正多边形”几何体 发现只要三角形数量足够多,“正多边形”会越来越倾向于“圆”。 6个三角形 15个三角形 36个三角形 具体实施方案: 1、顶点着色器中做文章 为了简要表达,会省略不重要的代码 1.1和1.2使用的绘画方式为 gl.dr

wzwxwc1987的专栏 2910

ROS应用之如何配置RTOS满足机器人系统中的实时要求

实时操作系统(RTOS)基本概念实时操作系统(RTOS)是设计用于实时应用的操作系统,其主要目标是在确定的时间内完成任务。RTOS的任务调度算法和优先级控制机制能够确保高优先级任务按时完成。精确的传感器数据采集:传感器数据需要在规定时间内采集并传输给控制系统。快速响应外部事件:对于控制系统,需要确保指令在最短的时间内得到响应。任务的调度周期:任务的周期可以通过公式计算,其中 ftask 是任务的调度频率。优先级分配。

weixin_68094467的博客 1009

【愚公系列】2023年12月 WEBGL专题-canvas和webgl的区别

Canvas是一个HTML5元素,可以用于在网页上绘制图形。它可以让开发者使用JavaScript绘制图形和动画,以及实现图形交互。Canvas可以帮助开发者创建交互式的游戏、图表、图像编辑工具等应用程序。Canvas的作用如下:动态绘制图形:开发者可以使用JavaScript动态地绘制图形,包括线条、圆形、矩形、多边形等。动画效果:开发者可以使用JavaScript实现动画效果,例如展示图表数据变化、添加滑动特效等。图像处理:开发者可以使用Canvas进行图像处理,例如对图像进行裁剪、缩放、旋转等操作。游

愚公智库 1万+

IDC 数据中心工程师面试题汇总

(适用于:IDC运维、机房值班、机房工程师、机柜运维、IDC基础设施、IDC网络运维岗)

老韩的Linux云计算架构师进阶之路 1088

【YOLOv12多模态融合改进】(可见光+红外)涉及像素级融合、特征级融合(中期、中后期、后期)、决策级融合的完整配置步骤以及二次改进方案

在网络输入阶段将多模态数据直接合并,形成统一的特征表示。

Limiiiing的博客 1213

LayaAir graphics 矢量绘图之 多边形、矩形

目录 drawpoly 多边形绘制 drawRect 矩形绘制 drawPath 路径绘制 绘制直角矩形 绘制圆角矩形 drawpoly laya.display.Graphics 类的 drawpoly() 方法可以实现绘制三角形、多边形以及根据指定的路径数据绘制出图案。 /*** 绘制多边形。 * @param x 开始绘制...

蚩尤后裔-汪茂雄 5041

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

GDI+ 是什么,什么时候使用,为什么要通过外接矩形绘制

GDI+(Graphics Device Interface Plus)是Windows系统提供的2D图形绘制API,主要用于传统桌面应用的图形处理。它支持基础形状绘制(矩形、椭圆等)、图像处理(缩放、裁剪)、文字渲染和复杂绘图操作,适合WinForms开发、简单图像处理、报表打印等场景。GDI+采用外接矩形机制统一形状绘制逻辑,通过定义形状的边界框来简化坐标计算和变换操作,既提升开发效率也优化底层渲染性能。这种设计使开发者能用统一的参数格式(左上角坐标+宽高)处理各类形状,特别适合鼠标拖拽绘制等交互场景。

weixin_52070859的博客 865

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

WebGL地图绘制图形坐标提取实战:从事件监听到坐标获取

地理信息可视化中,WebGL渲染引擎通过GPU加速图形绘制,但覆盖物坐标数据不再直接暴露于DOM,需从绘制事件或工具实例中截获。其原理在于绘制完成事件携带覆盖物对象,通过解析对象属性或方法获取经纬度坐标。这一技术方案解决了WebGL版本下坐标提取的兼容性问题,适用于自定义区域圈选、空间分析等场景。本文围绕地图绘制工具的事件监听与坐标提取,详细拆解了多边形、矩形、圆形的坐标获取策略,并给出可直接复用的代码示例与避坑指南。

weixin_29015801的博客 243
上一篇: WebGL笔记:绘制多个点,三角形,以及画各种不同的线条,面
下一篇: WebGL笔记:使用鼠标绘制多个线条应用及绘制动感线性星座及修复Mac系统下的渲染缺陷问题
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、付费专栏及课程。

余额充值