一起学 WebGL:绘制一个点

news/2024/4/28 16:37:41/文章来源:https://blog.csdn.net/fe_watermelon/article/details/130027245

大家好,我是前端西瓜哥。

本文讲解如何用 WebGL 绘制一个点。

WebGL

WebGL 是浏览器支持的一种绘制图形的 API,是一个标准。我们可以通过 Canvas 元素 在网页的特定区域绘制 2D 和 3D 图形。

相比 Canvas 2D,WebGL 利用了 GPU 的计算能力,绘制速度更快,性能更优。

WebGL 基于 OpenGL 发展而来,某种意义上就是 Web 版的 OpenGL,但是阉割了一些功能。

更具体点,是来自 OpenGL 的一个特殊版本 OpenGL ES 2.0,全称为 OpenGL for Embedded Systems,“用于嵌入式系统的 OpenGL”。

使用 WebGL,除了浏览器正统脚本语言 JavaScript,还要使用一种 名为 GLSL ES 的类 C 着色器语言

绘制过程和着色器

将代码描述的效果真正绘制到屏幕上的过程,称为 渲染管线

管线(pipeling)这个词有点奇怪,因为它没有对应的比较好的翻译,是一个直译。

管线指的是 数据处理的流水线,这个流水线上有很多处理器,会将数据一步步地进行处理,最终得到一个成品。渲染管线,就是渲染过程中执行的一个个步骤。

渲染管线的流程为:

  1. 顶点处理阶段。接收顶点信息,比如我要画一个三角形,三个点的位置在哪里,尺寸、颜色分别是多少。
  2. 图形装配。多个点组合成怎样的图形。我们会用 API 进行指定,比如点、线段、三角形。
  3. 光栅化。将顶点转换为需要绘制的像素信息,比如位置、深度。
  4. 片元处理阶段。设置像素的颜色信息。

这四个流程中,我们能操作的是第 1 和第 4 步。

绘制一个点

Demo 地址:

https://codesandbox.io/s/webgl-hui-zhi-yi-ge-dian-2-bpwz8p

下面我们来讲解如何绘制一个点。

首先是 WebGL 绘制的地方 Canvas。我们需要在 HTML 中添加一个 Canvas 元素,然后在 JavaScript 中获取这个元素,并拿到 WebGL 渲染上下文

const canvas = document.querySelector("canvas");
const gl = canvas.getContext("webgl");

如果你用过 Canvas 2D,它对应的上下文变量命名通常是 ctx(context)。但对于 WebGL,我们通常会跟随 OpenGL 的习惯,将变量命名为 gl(OpenGL 的 gl,Graphics Library 的意思)。

接着是顶点着色器。

顶点着色器,用于设置图形的顶点相关的信息,设置好顶点,WebGL 才能确定好图形的位置等信息,好绘制出来。

着色器的代码是在 JavaScript 脚本中,用字符串来写 glsl。

顶点着色器

先是顶点着色器

const vertexShaderSrc = `
void main() {gl_Position = vec4(0.0, 0.0, 0.0, 1.0);gl_PointSize = 20.0;
}
`;

gl_Postion 和 gl_PointSize 是 WebGL 顶点着色器的内部变量,用于设置点的位置和点的大小。

vec4 表示矢量类型,同时也是内置函数,调用它就能得到一个 vec4 类型。

这里设置了顶点的位置 (0.0, 0.0, 0.0, 1.0)。WebGL 使用的是三维坐标系,并使用右手坐标系,就是 x 轴指向右侧,y 轴指向上方,z 轴指向观察者。原点就在画布的正中央。

关于坐标系,可以看我的这篇文章:

《一起学 WebGL:坐标系》

三维中,一个点只要三个维度 x、y、z 就够了,但引入了第四个维度 w,从笛卡尔坐标升维为齐次坐标,作用是方便做矩阵变换和透视投影。 齐次坐标 (x, y, z, w) 等价于三维坐标 (x/w, y/w, z/w)。w 通常会设置为 1。

需要注意的是,着色器中的的数值需要加上小数点,表示用的是浮点数类型。这和 JavaScript 随便写都会变成浮点数不一样。

片元着色器

然后是片元着色器

顶点着色器确定图形的点的位置,片元着色器则是用于设置多个顶点围成的图形的像素点的 颜色

const fragmentShaderSrc = `
void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`;

gl_FragColor 是片元着色器的内部变量,这里设置为红色。

创建渲染器

因为是入门文章,细节不展开讲了。

总之下面这段代码,将前面声明的顶点着色器和片元着色器的两段源码,进行了编译。

/**** 渲染器生成处理 ****/
// 创建顶点渲染器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSrc);
gl.compileShader(vertexShader);// 创建片元渲染器
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSrc);
gl.compileShader(fragmentShader);// 程序对象
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);
gl.program = program;

清空缓存

gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);

首先第一行代码将背景色设置为黑色。当然你也可以设置为其他颜色,比如绿色 (0, 1, 0, 1)

第二行是清空缓存区,填充背景色。

绘制点

gl.drawArrays(gl.POINTS, 0, 1);

该 API 用于调用绘制指令,有三个参数:

  1. mode。绘制怎样的图元。比如点(gl.POINTS)、各种类型的线段、各种类型的三角形。也就这三种图元。再复杂的图形也是由一个个三角形组成的。这里用到的微积分的思想,将三维物体不断的细分,其实就是一个个非常小的平面组成的,三个点确定一个平面,也就是三角形。正方形也是两个三角形组成
  2. first。从哪个顶点开始绘制,通常是 0。本文只是画一个点,这个参数没太大意义,存在多个顶点时才有用,虽然也少用。
  3. count。使用到几个顶点。

绘制结果如下:

结尾

下一篇画个三角形。

我是前端西瓜哥,欢迎关注我,学习更多前端图形知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_283466.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

真给科技企业丢脸,在美国亚马逊做普通工人,你会吃不饱肚子

亚马逊公司(Amazon),成立于1995年,是全球最大的一家科技创新型电子商务公司,是全球电子商务的最老资格。自从2015年底,亚马逊在俄亥俄州哥伦布市运营大型仓库,如今的亚马逊已经成为俄亥俄州最大…

基于C#语言专业开发的一套:医院手麻系统源码

手术室麻醉信息管理系统源码,手麻系统源码,C#手术麻醉系统源码 相关技术:C#语言前端框架:Winform后端框架:WCF数据库:sqlserver开发工具:VS2019 文末获取联系! 系统概述: 手术麻醉…

全国青少年信息素养大赛2023年python·必做题模拟一卷

全国青少年电子信息智能创新大赛 python必做题模拟一卷 一、单选题 1. 以下哪种输入结果不可能得到以下反馈: 重要的事情说三遍:安全第一!安全第一!安全第一!( ) A、print("重要事情说…

Redis 如何配置读写分离架构(主从复制)?

文章目录Redis 如何配置读写分离架构(主从复制)?什么是 Redis 主从复制?如何配置主从复制架构?配置环境安装 Redis 步骤通过命令行配置从节点通过配置文件配置从节点redis 主从复制优点redis 主从复制缺点Redis 如何配…

Git仓库集成到VScode

前提是一种安装了Git,这里就不再介绍安装过程,进入Git官网进行下载安装即可。 这里用Gitee作为远程仓库演示,首先在gitee上新建仓库 新建完毕,生成了HTTPS地址,复制该远程仓库地址。 来到vscode,在没有仓库…

五.microchip 代理贝能的sam d51(LQFP100PIN)与LAN9253 电机控制开发板使用总结(3)

五.microchip 代理贝能的sam d51(LQFP100PIN)与LAN9253 电机控制开发板使用总结(3) 3.4 板子相关外设配置 3.4.1 板子MCU硬件 的LAN9253连接接口 pin numpin idcus_namefuncmodedirlatchpush uppush downdir str1PA00GPIO_PA0_D0GPIOINYNORMAL2PA01GP…

leetcode:只出现一次的数字 Ⅲ(详解)

前言:内容包括:题目,代码实现,大致思路,代码解读 题目: 给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任…

DOS批处理文件---内嵌参数变量扩充功能

1 内嵌参数变量 1.1 介绍 内嵌参数变量指:%i,其中i为大于等于0的整数。如%0, %1, %2,... 1.2 作用 可以客制化功能。 1.3 案例 批处理文件:main_Param.bat echo off && setlocal ENABLEDELA…

Solidworks学习一

目录页面介绍:视图操作:实例圆柱:直线的绘制:草图的保存和不保存:绘制工具:切线弧:转换实体引用:交叉曲线:等距实体:移动复制:约束:约…

MyBatisPlus-DQL编程控制

MyBatisPlus-DQL编程控制3,DQL编程控制3.1 条件查询3.1.1 条件查询的类3.1.2 环境构建3.1.3 构建条件查询3.1.4 多条件构建3.1.5 null判定3.2 查询投影3.2.1 查询指定字段3.2.2 聚合查询3.2.3 分组查询3.3 查询条件3.3.1 等值查询3.3.2 范围查询3.3.3 模糊查询3.3.4…

一起学 WebGL:动态绘制点

大家好,我是前端西瓜哥。上一篇文章讲解了如何绘制一个点。但这个点的信息是写死在渲染器源码中的,也就是硬编码。 这是系列文章,如果你是初学者,你需要看上一篇文章才好理解这节课的内容。 《一起学 WebGL:绘制一个点…

python五角星编程代码绘制

大家好,我是你们的好朋友,今天继续分享 Python的编程知识。 在 Python中,有一个非常强大的数据可视化工具: database. dl (),其中有一个功能就是可以绘制五角星。 什么是五角星? 在数…

jenkins配置插件发版了解

jenkins配置&插件&发版了解 jenkins https://mirrors.jenkins.io/war-stable/2.222.1/ 包下载地址 jenkins镜像源修改 sed -i s/https:\/\/www.google.com/https:\/\/www.baidu.com/g default.json sed -i s/https:\/\/updates.jenkins.io\/download/https:\/\/mi…

怎么使用思维导图?

回答这个问题前,我们先来了解下三个问题: 1.思维导图是什么? 思维导图,又名心智导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效同时又很高效,是一种实用性的思维工具&#xff08…

Ubuntu22.04中安装PyCharm

目录 1. 在ubuntu中下载linux版本的PyCharm。 2. 将下载好的pycharmxxxx.tar.gz文件解压。 3. 在解压后的pycharm文件夹下的bin文件夹下(此处为:pycharm-edu-2021.1.2/bin),在空白处右键,然后选择”在终端打开“。然…

蓝桥杯第26天(Python)考前挣扎

题型: 1.思维题/杂题:数学公式,分析题意,找规律 2.BFS/DFS:广搜(递归实现),深搜(deque实现) 3.简单数论:模,素数(只需要…

使用 LifseaOS 体验 ACK 千节点分钟级扩容

作者:阿里云 ACK 和操作系统团队 三年前的云栖大会上,LifseaOS 正式发布,这是一款专为云原生场景而垂直优化的操作系统发行版,即业界统称的 ContainerOS。初始发布时,它提供了如下几个突出的特性:轻量&…

guitar pro8.1免费的吉他学习辅助软件

从名字上看就知道这是一款针对吉他谱开发的软件,相信大多数吉他爱好者都用过或者听过这款软件。可以通过鼠标和键盘的操作对吉他谱的内容进行输入,支持四线谱,五线谱、六线谱等曲谱的制作。软件涵盖了几乎所有的吉他演奏技巧符号,…

OpenCV实战(17)——FAST特征点检测

OpenCV实战(17)——FAST特征点检测0. 前言1. FAST 特征点检测2. 自适应特征检测3. 完整代码小结系列链接0. 前言 Harris 算子根据两个垂直方向上的强度变化率给出了角点(或更一般地说,兴趣点)的数学定义。但使用这种定义需要计算图像导数&am…

Delphi 彻底搞懂 Unix/Linux 时间格式及平台间转换

目录 一、TDateTime 时间格式 二、Unix/Linux的日期和时间格式 三、Delphi中操作Unix/Linux格式的日期和时间 1. TDateTime 转 Unix/Linux格式 2. Unix/Linux格式 转 TDateTime 3. 与腾讯、阿里等平台(简称:平台)时间转换 四、Delphi…