WebGL笔记:绘制多个点,三角形,以及画各种不同的线条,面

WebGL绘制和变换三角形 缓冲区对象是WebGL系统中的一块内存区域,我们可以一次性地向缓冲区对象中填充大量的顶点数据,然后将这些数据保存在其中,供顶点着色器使用。gl.vertexAttrib3f()一次只能向顶点着色器传入一个顶点,而绘制三角形、矩形和立方体等,你需要一次性将图形的顶点全部传入顶点着色器。不管三维模型的形状多么复杂,其基本组成部分都是三角形,只不过复杂的模型由更多的三角形构成而已。相应地,gl.deleteBuffer(buffer)函数可用来删除被gl.createBuffer()创建出来的缓冲区对象。 阅读详情

绘制多点

1 ) WebGL 缓冲区

  • 我们在用js定点位的时候,肯定是要建立一份顶点数据的,这份顶点数据是给着色器的,因为着色器需要这份顶点数据绘图
  • 然而,我们在js中建立顶点数据,着色器肯定是拿不到的,这是语言不通导致的
  • 为了解决这个问题,webgl 系统就建立了一个能翻译双方语言的缓冲区
  • js 可以用特定的方法把数据存在这个缓冲区中,着色器可以从缓冲区中拿到相应的数据
  • 接下来就看一下这个缓冲区是如何建的,着色器又是如何从其中拿数据的

2 )WebGL 绘制多点步骤

2.1 建立着色器源文件

<script id="vertexShader" type="x-shader/x-vertex">
    attribute vec4 a_Position;
    void main(){
        gl_Position = a_Position;
        gl_PointSize = 20.0;
    }
</script>
<script id="fragmentShader" type="x-shader/x-fragment">
    void main(){
        gl_FragColor=vec4(1.0,1.0,0.0,1.0);
    }
</script>

2.2 获取webgl 上下文

const canvas = document.getElementById('canvas');
canvas.width = 200;
canvas.height = 200;
const gl = canvas.getContext('webgl');

2.3 初始化着色器

const vsSource = document.getElementById('vertexShader').innerText;
const fsSource = document.getElementById('fragmentShader').innerText;
initShaders(gl, vsSource, fsSource);

2.4 设置顶点点位

const vertices = new Float32Array([
    0.0,  0.1,
    -0.1,-0.1,
    0.1, -0.1
]);

const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

const a_Position = gl.getAttribLocation(gl.program, 'a_Position');
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(a_Position);
  • 建立顶点数据,两个浮点数构成一个顶点,分别代表 x、y 值
    const vertices = new Float32Array([
        // x, y
        0.0,  0.1, // 顶点
        -0.1, -0.1, // 顶点
        0.1, -0.1  // 顶点
    ])
    
  • 现在上面的这些顶点数据是存储在js 缓存里的,着色器拿不到,需要建立一个着色器和js 都能进入的公共区,即缓冲区
  • 建立缓冲对象
    const vertexBuffer = gl.createBuffer();
    
  • 现在上面的这个缓冲区是独立存在的,它只是一个空着的仓库,和谁都没有关系。接下来咱们就让其和着色器建立连接
  • 绑定缓冲对象
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    
  • 绑定缓冲区相关api为:gl.bindBuffer(target,buffer)
    • target 要把缓冲区放在 webgl 系统中的什么位置
    • buffer 缓冲区
  • 着色器对象在执行 initShaders() 初始化方法的时候,已经被写入webgl 上下文对象gl 中了,这个 initShaders 方法可查阅之前博文
  • 当缓冲区和着色器建立了绑定关系,我们就可以往这块空间写入数据了
  • 往缓冲区对象中写入数据
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
    
  • 相关api为:bufferData(target, data, usage) 将数据写入缓冲区
    • target 要把缓冲区放在 webgl 系统中的什么位置
    • data 数据
    • usage 向缓冲区写入数据的方式,目前使用 gl.STATIC_DRAW 方式,它是向缓冲区中一次性写入数据,着色器会绘制多次
    • 现在着色器虽然绑定了缓冲区,可以访问里面的数据了
    • 但是我们还得让着色器知道这个仓库是给哪个变量的,比如咱们这里用于控制点位的attribute 变量,这样做是为了提高绘图效率
  • 将缓冲区对象分配给 attribute 变量
    const a_Position = gl.getAttribLocation(gl.program, 'a_Position');
    gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
    
  • 相关api为:gl.vertexAttribPointer(local, size, type, normalized, stride, offset) 将缓冲区对象分配给 attribute 变量
    • local attribute变量
    • size 顶点分量的个数,比如我们的vertices 数组中,两个数据表示一个顶点,我们定一个 2
    • type 数据类型,比如 gl.FLOAT 浮点型
    • normalized 是否将顶点数据归一
    • stride 相邻两个顶点间的字节数,我的例子里写的是0,那就是顶点之间是紧挨着的
    • offset 从缓冲区的什么位置开始存储变量,我的例子里写的是0,那就是从头开始存储变量
  • 到了这里,着色器就知道缓冲区的数据是给谁的了,因为咱们缓冲区里的顶点数据是数组,里面有多个顶点
  • 所以我们得开启一个让着色器批量处理顶点数据的属性,默认着色器只会一个一个的接收顶点数据,然后一个一个的绘制顶点
  • 开启顶点数据的批处理功能
    gl.enableVertexAttribArray(a_Position);
    
  • 相关api, enableVertexAttribArray(location), location attribute 变量
  • 好, 目前已经是万事俱备,可以着手绘图, 绘图前,先将画布清理下

2.5 清理画布

gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);

2.6 绘图

gl.drawArrays(gl.POINTS, 0, 3); // 这是绘制三个顶点
  • 相关api:drawArrays(mode, first, count)
    • mode 绘图模式,比如 gl.POINTS 画点
    • first 从哪个顶点开始绘制
    • count 要画多少个顶点

绘制三角形

  • 绘制完成三个点,那么绘制三角形的工作就简单了
  • 注意:绘制三角形是不需要设置顶点的大小的

1 )顶点着色器移除顶点的配置

<script id="vertexShader" type="x-shader/x-vertex">
    attribute vec4 a_Position;
    void main(){
        gl_Position = a_Position;
        // gl_PointSize = 20.0;
    }
</script>
  • 因为 gl_PointSize 这个属性是控制顶点大小的,已经不需要了

2 )js中更改绘制方式

// gl.drawArrays(gl.POINTS, 0, 3);
gl.drawArrays(gl.TRIANGLES, 0, 3);
  • gl.TRIANGLES 就是绘制三角形

画不同的线条

  • 关于 drawArrays 第一个 mode 参数
    • POINTS 可视的点
    • LINES 单独线段
    • LINE_STRIP 线条
    • LINE_LOOP 闭合线条
    • TRIANGLES 单独三角形
    • TRIANGLE_STRIP 三角带
    • TRIANGLE_FAN 三角扇

1 )POINTS

  • 字面理解就是一个个的可以看到的点

  • 上面六个点的绘制顺序是:v0, v1, v2, v3, v4, v5

2 )LINES 单独线段


  • 上面三条有向线段的绘制顺序是
    • v0 > v1
    • v2 > v3
    • v4 > v5

3 )LINE_STRIP 线条


  • 上面线条的绘制顺序是:v0>v1>v2>v3>v4>v5

4 )LINE_LOOP 闭合线条


  • 上面线条的绘制顺序是:v0>v1>v2>v3>v4>v5>v0

5 )TRIANGLES 三角形


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

6 )TRIANGLE_STRIP 三角带


  • 上面四个面的绘制顺序是:
    • v0>v1>v2:
    • 之后,以上一个三角形的第二条边+下一个点为基础,以和第二条边相反的方向绘制三角形,v2>v1>v3
    • 之后,以上一个三角形的第三条边+下一个点为基础,以和第二条边相反的方向绘制三角形,v2>v3>v4
    • 最后,以上一个三角形的第二条边+下一个点为基础,以和第二条边相反的方向绘制三角形,v4>v3>v5
  • 规律:
    • 第一个三角形:v0>v1>v2
    • 第偶数个三角形:以上一个三角形的第二条边+下一个点为基础,以和第二条边相反的方向绘制三角形
    • 第奇数个三角形:以上一个三角形的第三条边+下一个点为基础,以和第二条边相反的方向绘制三角形

7 )TRIANGLE_FAN 三角扇


  • 上面四个面的绘制顺序是:
    • v0>v1>v2: 以上一个三角形的第三条边+下一个点为基础,按照和第三条边相反的顺序,绘制三角形
    • v0>v2>v3: 同上
    • v0>v3>v4: 同上
    • v0>v4>v5: 同上
  • 注意,如果绘制的点数大于实际的点数
    • gl.drawArrays(gl.TRIANGLES, 0, 6); 这里其实只需要5就行,但是给了6
    • 那么按照上述规律再继续找原点继续绘制出一个三角形
WebGL绘制带箭头贴图的线 示例 在讲述本文内容之前,我希望读者先具备以下知识点: 了解WebGL的基本知识,懂得调用自定义的Shader程序; 基本的数学基础和空间几何知识; 明白GPU的渲染管线流程; 因为,本文内容主要讲述绘制的核心思路和注意事项,所以对于基本知识只能简单描述,请谅解; 前言 首先,先附上一篇至今我看到思路十分正确,图文并茂(图片真的很好看)的讲述WebGL绘制有宽度的线和箭头贴图的文章:... 阅读详情

相关推荐

WebGL 绘制Line的bug(一)

熟悉WebGL的同学都知道,WebGL绘制模式有点、线、面三种;通过点的绘制可以实现粒子系统等,通过线可以绘制一些连线关系;面就强大了,通过面,我们可以绘制我们想绘制的所有的三维对象。 一切看起来都很完美,perfect。 然而,不幸的是,WebGL在绘制线条的时候,存在一个缺陷,那就是在一些机器的一些浏览器上面(应该是大多数情况下)线宽只能设置为1,而不能设置成其他的值。 通过网址http

TWaver可视化 1610

webgl绘制图形API——drawArrays、drawElements

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

qq_37987033的博客 4244

WebGL 绘制Line的bug(二)

WebGL 绘制Line的bug(二)

TWaver可视化 1147

学习WebGL_002_绘制一条直线

顶点坐标系是从(-1,1) 绘制一条(0,0) 到 (-0.5, 0.5)到直线 关键代码: verts = [ -0.5, 0.5, 0, 0.0, 0.0, 0, ] gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verts), gl.STATIC_DRAW); gl.vertexAttribPointer( ATT...

qq_21476953的博客 719

Windows下用Docker部署RagFlow的5个常见错误及解决方法(附详细日志分析)

本文针对Windows系统下使用Docker部署RagFlow的常见难题,提供了详细的避坑指南。文章深度剖析了WSL2配置、端口冲突、文件权限、资源限制及网络通信这五个典型错误场景,并结合具体日志分析,给出了经过验证的解决方案,帮助开发者高效完成部署。

weixin_29233857的博客 180

LLM Agent技能稳定性实战:从规划、工具到记忆的故障排查与优化

大语言模型(LLM)与外部工具的结合,催生了能够自主规划并执行复杂任务的智能体(Agent)。其核心原理在于通过规划模块解析用户意图,调用合适的工具集,并借助记忆模块管理上下文,从而将LLM的推理能力转化为可落地的技术价值。在实际应用中,Agent的稳定性常受制于模糊的规划指令、不匹配的工具描述、糟糕的上下文管理以及脆弱的输出解析。这些故障点直接影响了其在自动化客服、数据分析、智能助手等应用场景中的可靠性。本文聚焦于Agent的“技能”执行链,深入探讨了如何通过模块化设计、高质量的工具描述(如清晰定义输入输

weixin_42624889的博客 250

WebGL 实践篇(一)—— 绘制一个三角形

WebGL初学:绘制三角形

weixin_44207506的博客 1745

阿里开源最强数字人工具 EchoMimicV2,本地部署(一)

EchoMimicV2是阿里推出的半身人体AI数字人项目,基于参考图片、音频剪辑和手部姿势序列生成高质量动画视频,确保音频内容与半身动作的一致性。现在本地部署,安装体验一下。

缘分天空的专栏 4620

webgl入门-绘制三角形

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

zgynbnbnb的博客 1430

VCL for PHP,Konopka Signature VCL Controls (Raize Components 6.2.3) for Delphi 10.4

The Raize Components suite includes a variety of interface design tools for Delphi programming language and C ++ Builder, which includes over 125 VCL controls and over 100 different tools for creating...

weixin_42137539的博客 855

使用DCA1000和EVM板进行数据采集

目录 1. 准备工作 1.1 硬件 1.2 软件 2. 驱动安装 3. 设置静态IP地址 4. 采集数据 5. 采集的数据文件的格式 6. 数据采集存储的数据流 参考资料 1. 准备工作 1.1 硬件 EVM板,电源线(5V,>2.5A),USB线 DCA1000,电源线(5V,>2A),USB线,网线,60pin Samtec cable 1.2 软件 mmWave Studio Matlab Runtime Engine v8.5.1 将DCA1000和EVM板

qq_42235129的博客 1万+

【愚公系列】2023年12月 WEBGL专题-绘制图形类型

WebGL可以呈现多种类型的图形,其中一些常见的类型包括:点(Points):单个像素点或小图形,用于在屏幕上制作图案或粒子效果。线(Lines):两个点之间的连线,可以创建线条、路径或曲线。多边形(Polygons):由三个或更多线段组成的封闭形状,可以用于创建平面图形、网格或三维物体的面。立方体(Cubes):六个平面的立方体,可以用于创建三维场景、游戏或建筑模型的基本形状。球体(Spheres):球形表面,可以用于创建天体、球形物体或特殊效果。

愚公智库 1万+

Hermes Agent 实战复盘:5 类超预期场景与3 个典型翻车案例分析

揭示 Hermes Agent 在 PDF 智能解析、低代码评审结构化、Kanban 任务驱动执行等五类未被文档覆盖的超预期落地场景,核心依赖 `soul.md`/`CLAUDE.md`/`kanban` 三层上下文建模机制,而非单纯堆 token 或 agent 数量。

weixin_42520239的博客 386

WebGL画粗线

WebGL绘制模式有点、线、面三种;通过点的绘制可以实现粒子系统等,通过线可以绘制一些连线关系;面就强大了,通过面,我们可以绘制我们想绘制的所有的三维对象。然而,WebGL在绘制线条的时候,存在一个缺陷,那就是在一些机器的一些浏览器上面(大多数情况下)线宽只能设置为1,而不能设置成其他的值。,可以测试自己的电脑是否可以绘制粗线可以看出,我的Chrome有这个 问题基本思路既然画线实现不了加粗,那就使用面来模拟粗线。

求上得中,求中得下 1142

RSL-RL:开源人形机器人强化学习控制研究库

摘要:RSL-RL是一款专为机器人领域设计的开源强化学习库,其核心特点是紧凑性、可修改性和高性能。该库聚焦PPO和BC两大主流算法,并整合了对称性增强、好奇心驱动等机器人专用技术。通过纯GPU训练优化,RSL-RL在大型仿真中展现出卓越的吞吐性能,已成功应用于腿足运动控制、全身协调等多个机器人研究场景。其轻量级架构包含运行器、算法和网络三个可独立修改的组件,支持TensorBoard等主流日志工具。该框架特别适合需要快速原型开发的机器人研究者,但不适用于通用机器学习基准测试。开源地址:https://git

2506_90492529的博客 1680

使用 MATLAB/Simulink + Simscape Electrical + Simulink Design Optimization,构建一个基于SiC/GaN的Z源逆变器在储能系统中的软启

《手把手教你学Simulink:Z源逆变器在储能系统中的应用》摘要 本文详细介绍了使用MATLAB/Simulink构建Z源逆变器储能系统仿真模型的全过程。Z源逆变器凭借其独特的阻抗网络结构,解决了传统逆变器在直通保护和升压能力方面的痛点。文章通过6个关键步骤:主电路搭建、调制策略设计、软启动实现、仿真分析、效率对比和工程问题解决方案,完整展示了Z源逆变器从理论到仿真的实现路径。重点讲解了直通零矢量SPWM调制策略和渐进式升压比控制方法,验证了系统93.3%的效率和优异的抗扰性能。该模型为光伏储能、电动汽车

MHD0815的博客 122

desmos和webgl绘制线条

先在desmos上面完成线条lineJoin绘制的,再将代码和公式转到js用webgl绘制.

那个西瓜有点甜 1545

android 蓝牙通讯demo

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

WebGL - 七种基本图形的绘制

1、七种基本绘制方式 通过gl.drawArrays(mode, girst,count)方法,可以绘制七种基本图形,如下表所示 基本图形 参数 描述 点 gl.POINTS 一系列的点,绘制在 v0 ,v1,v2.... 线段 gl.LINES 一系列单独的线段,绘制在(v0, v1),(v2,v3)...,若点个数使奇数,则最后一个点被忽略 线条 gl.LINE_STR...

ithanmang 7035

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

WebGL学习笔记 - 画一个三角形

一. 基本概念 由于完全没有学过图形学相关的知识,所以用WebGL时感到很吃力,对基本概念的理解也感觉不是很透彻,这里就不写我对WebGL的概念的理解了,推荐几篇文章: WebGL 教程 GLSL着色器 webgl笔记-2.着色器和缓冲区 GLSL 详解(基础篇) 就直接开始绘制吧,边绘制边说 二. 绘制三角形 第一步,获取WebGL的渲染上下文,之后的绘制都会在这个上下文中绘制,直白一点说...

weixin_34166847的博客 451

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

关于WebGL绘制粗线条那些事

本文探讨了在WebGL中实现3D粗线条绘制的多种方案。首先分析了WebGL原生lineWidth()失效的问题,随后比较了四种不同实现方法:独立线段扩展法、法向量平均法、角平分线法以及基于三角带的缺口填充法。重点介绍了CPU方案(JavaScript计算顶点)与GPU方案(着色器计算顶点)的优劣对比,最终推荐CPU方案作为首选。针对转角缺口问题,提出了2D场景下使用圆点填充和3D场景下用三角形围成圆形的优化方案。文章提供了完整的代码示例,展示了从基础路径绘制到3D场景优化的完整解决方案。

shouhengboy的博客 227

探索WebGL线条之美 —— webgl-lines项目推荐

探索WebGL线条之美 —— webgl-lines项目推荐 在数字艺术与前端开发的交界处,有一款名为webgl-lines的开源项目正静候着创意者们的发现。它不仅仅是代码的集合,而是一把解锁WebGL线条绘制艺术之门的钥匙。今天,让我们一同走进这个项目的世界,探索它如何让线条在屏幕上舞动,并展示其无限的应用潜力。 项目介绍 webgl-lines是开发者Matt DesLauriers为配合博客...

gitblog_00838的博客 827

可视化学习:使用WebGL绘制圆形,实现色盘

在Canvas2D中实现圆形的绘制比较简单,只要调用arc指令就能在Canvas画布上绘制出一个圆形,类似的,在SVG中我们也只需要一个<circle>标签就能在页面上绘制一个圆形。那么在WebGL中我们要怎么去绘制呢?WebGL只能绘制三种形状:点、线段和三角形,它没有提供直接绘制圆形的功能,当然也无法像SVG一样使用标签,所以我们是无法直接绘制圆形曲线的,这个时候我们可以借助相关的数学知识,来实现圆形的绘制。

日暮斜阳 1060

WEBGL看完你就会了(6)---绘制正方形

真正的强大不是对抗,而是允许发生。—莫言。

简单Cere 647

webgl学习笔记-绘制和变换三角形

缓冲区 缓冲区对象是 webgl 系统中提供的一块存储区,可以在其中保存想要绘制的所有顶点的数据,然后一次性向顶点着色器中传入数据。 使用缓冲区对象向顶点着色器传入数据的步骤为: 创建缓冲区对象(gl.createBuffer) 绑定缓冲区对象(gl.bindBuffer) 将数据写入缓冲区对象(gl.bufferData) 将缓冲区对象分配给一个 attribute 变量(gl.vertex...

weixin_34211761的博客 304

WebGL初体验【1】:绘制图形与变换技巧

本文深入浅出地介绍了WebGL的基础知识及其部分API的使用。首先,文章从WebGL入门讲起,帮助读者快速搭建WebGL环境。接着,详细阐述了如何通过WebGL绘制点、线、面等基本图形,并结合实例讲解相关API的调用方法。此外,还探讨了图形变换的实现,包括平移、旋转和缩放等操作,通过矩阵运算实现图形的动态效果。文章内容丰富,示例清晰,适合初学者快速掌握WebGL的基本应用,为后续深入学习打下坚实基础。

共勉 1249

WebGL笔记_绘制流程以及三维坐标变换(一)

读WebGL编程指南+计算机图形学两本书整理笔记.主要整理的矩阵变换部分.

xyh的博客 3402
上一篇: WebGL笔记:WebGL中绘制圆点,设定透明度,渲染动画
下一篇: WebGL笔记:绘制矩形面的几种方式以及封装封装多边形对象来绘制不同图形
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、付费专栏及课程。

余额充值