当前位置: 首页 > news >正文

WebGL系列教程四(绘制彩色三角形)

目录

  • 1 前言
  • 2 varying变量介绍
  • 3 开始绘制
    • 3.1 声明顶点着色器
    • 3.2 声明片元着色器
    • 3.3 创建顶点和颜色的缓冲区
    • 3.4 指定变量从缓冲区获取值
    • 3.5 效果
    • 3.6 varying的内涵
    • 3.7 完整代码
  • 4 总结

1 前言

  上一篇中我们介绍了如何使用缓冲区来绘制三角形,这一篇我们来讲讲如何给三角形着色,绘制一个彩色的三角形。

2 varying变量介绍

  WebGL中的varying变量负责将值从顶点着色器传递到片元着色器中。假设我们有个三角形,没错,还是前两篇使用的那个三角形,它的颜色如下图所示:
在这里插入图片描述
  现在我们要给这个三角形着色,我们只需要把这个顶点的颜色从顶点着色器中传递到片元着色器中,WebGL就会自动帮我们把三角形中间的颜色给插值出来。

3 开始绘制

  通过前几篇我们已经熟悉了WebGL基本的使用方式,只需要将上一篇中的代码稍加改动,就可以达成我们这篇的要求了。现在还是让我们来回顾一下上一篇中WebGL中的绘制流程并稍作改动,增加第8步给三角形着色:

  1. 创建着色器对象
  2. 获取着色器对象的源代码
  3. 绑定着色器的源
  4. 编译着色器
  5. 创建并关联项目
  6. 创建并绑定缓冲区
  7. 读取缓冲区数据并绘制三角形
  8. 三角形着色

3.1 声明顶点着色器

  前面的6步我们已经很熟悉了,我们先来看顶点着色器的声明,新增了一个aColor和一个vColoraColor用来存储我们指定的颜色,vColor用来存储要从顶点着色器传递到片元着色器的颜色。

<script id="vertex-shader" type="x-shader/x-vertex">attribute vec2 aPos;//顶点坐标attribute vec4 aColor;//颜色varying vec4 vColor;//要向片元着色器传递的颜色void main(){gl_Position = vec4(aPos,0.0,1.0);//补齐坐标为4维向量vColor = aColor;//把我们的颜色直接赋值给要向片元着色器传递的颜色}
</script>

3.2 声明片元着色器

  片元着色中也声明了一个vColor注意: 一定要和顶点着色器中的声明方式一模一样,这样才能自动接收从顶点着色器传递到片元着色器的颜色。

<script id="fragment-shader" type="x-shader/x-fragment">precision highp float;varying vec4 vColor;void main(){gl_FragColor = vColor;}
</script>

3.3 创建顶点和颜色的缓冲区

  先回顾上一篇中我们是怎么声明顶点的坐标的,我们用了一个数组来存储顶点的坐标

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

  那么现在我们只需要在顶点坐标的后面加上对应的颜色,RGBA形式的表示即可。如:

const vertices = new Float32Array([-0.5,0.0,   1.0,0.0,0.0,1.0,//第一个点坐标 红色0.0,1.0,    0.0,1.0,0.0,1.0,//第二个点坐标 绿色0.5,0.0,    0.0,0.0,1.0,1.0//第三个点坐标 蓝色
]);

  绑定还是老样子:

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

3.4 指定变量从缓冲区获取值

  因为我们在顶点着色器中声明了两个变量,aPosaColor,那么我们获取的时候,也要获取两次

let aPos = gl.getAttribLocation(program,"aPos");
let aColor = gl.getAttribLocation(program,"aColor");

  然后分别指定取值的方式

let length = Float32Array.BYTES_PER_ELEMENT;//数组中单个元素的字节长度
//指定aPos如何读取缓冲区   前 2 个值表示坐标,float类型,不使用归一化,6个值表示一个点的信息,从偏移0倍字节开始读
gl.vertexAttribPointer(aPos,2,gl.FLOAT,false,6*length,0);
gl.enableVertexAttribArray(aPos);
//指定aColor如何读取缓冲区  后 4 个值表示颜色,float类型,不使用归一化,6个值表示一个点的信息,从偏移2倍字节开始读
gl.vertexAttribPointer(aColor,4,gl.FLOAT,false,6*length,2*length);
gl.enableVertexAttribArray(aColor);
//绘制三角形,从零号索引开始,绘制三个点
gl.drawArrays(gl.TRIANGLES,0,3);

3.5 效果

在这里插入图片描述

3.6 varying的内涵

  如上图所示,三角形的三个顶点就是我们指定的颜色,中间的颜色是WebGL自动帮我们插值出来的。还记得片元着色器中的颜色值是怎么声明的吗?没错varying vec4 vColor;,varying翻译过来的意思是可变化的,所以这个量就叫做可变量。而它真正表示的意思是:这个片元着色器/片段着色器,它本质上是逐像素绘制的,而每一个像素的颜色都是可变化的,不是固定值,虽然从顶点传递时,传了一个固定值,但实际使用时,用的是WebGL帮我们自动插值出来的值,是一个变化了的值,所以叫它做可变量。

3.7 完整代码

const vertices = new Float32Array([-0.5,0.0,1.0,0.0,0.0,1.0,//第一个点坐标 颜色0.0,1.0,0.0,1.0,0.0,1.0,//第二个点坐标 颜色0.5,0.0,0.0,0.0,1.0,1.0//第三个点坐标 颜色
]);
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);
let aPos = gl.getAttribLocation(program,"aPos");
let aColor = gl.getAttribLocation(program,"aColor");
//绑定坐标
//指定aPos如何读取缓冲区   前 2 个值表示坐标,float类型,不使用归一化,6个值表示一个点的信息,从偏移0倍字节开始读
gl.vertexAttribPointer(aPos,2,gl.FLOAT,false,6*Float32Array.BYTES_PER_ELEMENT,0);
gl.enableVertexAttribArray(aPos);
//绑定颜色
//指定aColor如何读取缓冲区  后 4 个值表示颜色,float类型,不使用归一化,6个值表示一个点的信息,从偏移2倍字节开始读
gl.vertexAttribPointer(aColor,4,gl.FLOAT,false,6*Float32Array.BYTES_PER_ELEMENT,2*Float32Array.BYTES_PER_ELEMENT);
gl.enableVertexAttribArray(aColor);
//绘制三角形,从零开始,绘制三个点
gl.drawArrays(gl.TRIANGLES,0,3);

4 总结

  本篇我们通过指定三角形的三个顶点的颜色,绘制出了一个彩色的三角形,并梳理了整个程序的流程,了解了varying变量的内涵,这对我们理解后续的知识很重要,希望读者仔细揣摩,下期见。

相关文章:

WebGL系列教程四(绘制彩色三角形)

目录 1 前言2 varying变量介绍3 开始绘制3.1 声明顶点着色器3.2 声明片元着色器3.3 创建顶点和颜色的缓冲区3.4 指定变量从缓冲区获取值3.5 效果3.6 varying的内涵3.7 完整代码 4 总结 1 前言 上一篇中我们介绍了如何使用缓冲区来绘制三角形&#xff0c;这一篇我们来讲讲如何给…...

通过mxGraph在ARMxy边缘计算网关上实现工业物联网

在当今的工业4.0时代&#xff0c;工业物联网&#xff08;IIoT&#xff09;已经成为制造业转型升级的关键技术之一。ARMxy边缘计算网关作为工业自动化和物联网的重要组成部分&#xff0c;能够为工厂车间提供实时的数据处理能力和智能化服务。而mxGraph作为一种流行的JavaScript库…...

GEE案例:利用sentinel-1数据进行洪水监测分析(直方图统计)

目录 简介 数据 函数 ee.Filter.calendarRange(start, end, field) Arguments: Returns: Filter updateMask(mask) Arguments: Returns: Image 代码 结果 简介 利用sentinel-1数据进行洪水监测分析 数据 COPERNICUS/S1_GRD数据是由欧洲空间局(ESA)的Copernicus项…...

QT 联合opencv 易错点

https://blog.csdn.net/qq_51699436/article/details/135777911 网上已经有大量优秀切详尽的文章来讲述QT联合opencv了&#xff0c;我把容易出错的点列出来备忘 1、在进行opencv进行编译时&#xff0c;要确认好是32位还是64位&#xff0c;因为在创建QT项目的时候QT和opencv要匹…...

例如/举例的使用方法 ,e.g., 以及etc的使用方法

e.g. 例如 for example for the sake of example such as 1 e.g. 是拉丁语 exempli gratia 的缩写意思是“举个例子&#xff0c;比如”&#xff0c;等同于for example、 for the sake of example、such as&#xff0c;使用 e.g. 的目的是用几个例子来说明前面的观点。 2 例…...

20240902-VSCode-1.19.1-部署vcpkg-win10-22h2

20240902-VSCode-1.19.1-部署vcpkg-win10-22h2 软件环境 标签:C++ VSCode mingw gcc13 vcpkg cmake分栏:C++操作系统:Windows10 x64 22h2一、安装VScode-1.19.1 请参考另一篇文章《20240717-VSCode-1.91.1-部署gcc13-C++23-win10-22h2》。 二、安装cmake 本文流程需要安…...

MySQL学习(多表操作)

基本知识 一对多 创建部门表 – 主表 create table if not exists dept(deptno varchar(20) primary key ,name varchar(20) );创建员工表 – 创建外键约束 方式1constraint emp_fk foreign key(dept_id) references dept(deptno) create table if not exists emp(eid varc…...

鸿蒙开发(NEXT/API 12)【网络连接管理】 网络篇

简介 网络连接管理提供管理网络一些基础能力&#xff0c;包括WiFi/蜂窝/Ethernet等多网络连接优先级管理、网络质量评估、订阅默认/指定网络连接状态变化、查询网络连接信息、DNS解析等功能。 说明 为了保证应用的运行效率&#xff0c;大部分API调用都是异步的&#xff0c;对…...

VMware Fusion虚拟机Mac版 安装Ubuntu操作系统教程

Mac分享吧 文章目录 下载镜像地址&#xff1a;[www.macfxb.cn](http://www.macfxb.cn)一、CentOS安装完成&#xff0c;软件打开效果二、Mac中安装Ubuntu虚拟机1️⃣&#xff1a;下载镜像2️⃣&#xff1a;创建虚拟机3️⃣&#xff1a;虚拟机设置4️⃣&#xff1a;虚拟机安装5️…...

基于SpringBoot+Vue+MySQL的房屋租赁管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0c;信息的…...

虚拟机器配置固定IP地址

新安装的虚拟机&#xff0c;如何配置固定的ip地址&#xff0c;废话少说直接上干货 第一步&#xff1a;在VMarea中 选中你要固定IP的虚拟机器&#xff0c;点击上面的“编辑”按钮&#xff0c;然后找到“虚拟网络编辑器”&#xff0c;选中你要修改的ip VMnet8&#xff0c;然后是…...

用python实现基于形态学的方法,如开运算和闭运算,来去除pcd格式激光点云中的植被

在Python中&#xff0c;你可以使用open3d库来读取和处理pcd格式的点云数据。下面是一个示例代码&#xff0c;展示如何使用形态学操作来去除植被。 首先&#xff0c;确保你已经安装了open3d库&#xff0c;可以使用以下命令进行安装&#xff1a; pip install open3d接下来&…...

QT 绘制简易时钟

原文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->startTimer(1000); }Widget::~Widget() {delete ui; }//时钟底座 void Widget::paintEvent(Q…...

为控制器的方法添加必要参数

前言&#xff1a;做这个系统时&#xff0c;要求每次调用接口时要传操作人、操作人电脑ip、菜单id&#xff0c;然后计入log。本来前端读取到然后加入请求头&#xff0c;后端写入log即可。但是老大要求后端也要把控必传参数&#xff0c;避免前端忘记。所以就写了这个。IOperation…...

(计算机网络)应用层

1.为什么需要应用层 应用层提供使用tcp&#xff0c;udp使用的方式 协议就是制定的规则 2.域名服务器概述 域名是唯一的 新增域名&#xff0c;大家都要修改这个文本文件&#xff0c;所以要进行集中管理这个文本文件&#xff0c;而不是使用本地的hosts文件 hosts文件在Windows系统…...

使用3DUNet训练自己的数据集(pytorch)— 医疗影像分割

代码:lee-zq/3DUNet-Pytorch: 3DUNet implemented with pytorch (github.com) 文章<cicek16miccai.pdf (uni-freiburg.de)3D U-Net: Learning Dense Volumetric Segmentation...

【python】—— Python爬虫实战:爬取珠海市2011-2023年天气数据并保存为CSV文件

目录 目标 准备工作 爬取数据的开始时间和结束时间 爬取数据并解析 将数据转换为DataFrame并保存为CSV文件 本文将介绍如何使用Python编写一个简单的爬虫程序,以爬取珠海市2011年至2023年的天气数据,并将这些数据保存为CSV文件。我们将涉及到以下知识点: 使用r…...

U盘文件及文件夹带锁修复

磁盘管理修复工具Disks磁盘管理–针对U盘文件及文件夹带锁修复 本文章只针对统信系统 文章目录 功能概述一、安装工具二、数据备份三、检查文件系统1. 通过启动栏中的“磁盘”或者桌面的“磁盘”启动文件来启动应用:2. 选择U盘设备3. 点击“检查文件系统”按钮(如果无此按钮…...

AnyChart 数据可视化框架

AnyChart 数据可视化框架 AnyChart 是一个灵活的 JavaScript&#xff08;HTML5、SVG、VML&#xff09;图表框架&#xff0c;适合任何需要数据可视化的解决方案。 目录 下载并安装开始插件将 AnyChart 与 TypeScript 结合使用将 AnyChart 与 ECMAScript 6 结合使用技术集成贡献…...

ARM base instruction -- br

BR Branch to Register branches unconditionally to an address in a register, with a hint that this is not a subroutine return. 无条件地分支到寄存器中的一个地址&#xff0c;并提示这不是子例程返回。 BR <Xn> BR 跳转到reg内容地址&#xff0c;不会将返回地址…...

编译原理/软件工程核心概念-问题理解

目录 1.程序的编译执行过程 2.指针和引用的区别 3.堆和栈的区别 4.最熟悉的编程语言- Python&#xff1a;介绍PyTorch和TensorFlow框架 5.C与C的区别 6.软件工程是什么&#xff1f; 7.简述瀑布模型 8.敏捷开发方法是什么&#xff1f;它与瀑布模型相比有哪些优势和劣势 1…...

学习pyqt5相关知识回顾

1. 模块 1.1 import导入 1) 模块:是一系列功能的集合体,模块名.功能名,就可以使用模块的功能 2) 首次导入模块,就会立即执行模块里面的内容 3) 当前名称空间会产生一个名字module,指向module.py产生的名称空间.我们可以使用module.name/函数名,来调用module.py里面的内容. …...

OPENAIGC开发者大赛高校组银奖 | LonAC中小学编程学习平台

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给您…...

oneclick 命令:快速筛选控制变量的利器

目录 1. 命令语法2. 结果输出3. 使用示例4. 总结 在进行回归分析时&#xff0c;选择合适的控制变量对于确保模型的稳健性至关重要。然而&#xff0c;手动筛选变量组合不仅费时费力&#xff0c;还容易出错。为此&#xff0c;Stata 中的 oneclick 命令提供了一个高效的解决方案&a…...

Kotlin 代替Java接口回调,就这么简单

假如你使用旧的接口回调&#xff1a; 通常三步&#xff1a;1 定义接口和方法&#xff1b;2 使用接口中方法&#xff1b;3 继承接口并实现方法&#xff1b; 例&#xff1a; class XXXAdapter{public var mClickCollBack: clickCollBack? null //1定义interface clickColl…...

Codeforces Round 971 (Div. 4)——C题题解

本题的大意是一个青蛙从原点开始跳格子(0,0)&#xff0c;最终要跳到点(x,y)去&#xff0c;并且每一步的步长不能超过k&#xff0c;问最短几步可以跳到终点 分析&#xff1a; 本题利用贪心思想&#xff0c;肯定是先跳最大的步长这样总体用的步数最长 代码演示&#xff1a; #inc…...

【论文阅读笔记】Tackling the Generative Learning Trilemma with Denoising Diffusion GANs

【论文阅读笔记】Tackling the Generative Learning Trilemma with Denoising Diffusion GANs Introduction方法 使用传统GANS建模去噪分布理解模式覆盖率 Paper&#xff1a;https://arxiv.org/abs/2112.07804 Code&#xff1a;https://github.com/NVlabs/denoising-diffusion-…...

常见 HTTP 状态码详解与Nginx 文件上传大小限制

在我们日常使用 Nginx 搭建网站或应用服务时&#xff0c;可能会遇到很多与文件上传和请求响应相关的问题。今天我们就来聊聊 如何限制文件上传的大小&#xff0c;并介绍一些常见的 HTTP 状态码 及其在 Nginx 中的处理方式。 一、文件上传大小限制 有时&#xff0c;我们需要限…...

在mac中使用numbers对数据进行分列(更详细的回答,已解决)

不想看我废话的同学直接看 “ 二、真正的方法 ” 不是抄袭不是抄袭&#xff0c;目前我能检索到的关于number分列的只有两篇回答&#xff0c;但我觉得有待补充&#xff0c;如果看不懂另外的回答&#xff0c;可以来看我的 这么问我猜大概率是Windows转macOS用户&#xff0c;不是…...

网格参数的应用和数学基础

引言 对于任意两个拓扑结构相似的表面&#xff0c;可以计算它们之间的一一对应映射。如果其中一个表面由三角形网格表示&#xff0c;那么计算这种映射的问题被称为网格参数化。映射到的表面通常被称为参数域。表面网格与各种域之间的参数化在计算机图形学和几何处理中有广泛的应…...