利用WebGL绘制简单几何

利用WebGL绘制最简单的几何图形

一、WebGL简介

WebGL是一种用于在网页上渲染交互式3D和2D图形的JavaScript API。它基于OpenGL ES 2.0,提供了一种在浏览器中使用硬件加速图形的方式。

二、图形系统绘图流程

图形系统的通用绘图流程会包括六个部分:

  1. 输入设备
  2. 中央处理单元:首先,数据经过 CPU 处理,成为具有特定结构的几何信息。
  3. 图形处理单元:然后,这些信息会被送到 GPU 中进行处理。
  4. 存储器
  5. 帧缓存:光栅信息会输出到帧缓存中
  6. 输出设备

在这里插入图片描述

  1. 光栅(Raster):几乎所有的现代图形系统都是基于光栅来绘制图形的,光栅就是指构成图像的像素阵列。
  2. 像素(Pixel):一个像素对应图像上的一个点,它通常保存图像上的某个具体位置的颜色等信息。
  3. 帧缓存(Frame Buffer):在绘图过程中,像素信息被存放于帧缓存中,帧缓存是一块内存地址。
  4. CPU(Central Processing Unit):中央处理单元,负责逻辑计算。
  5. GPU(Graphics Processing Unit):图形处理单元,负责图形计算。

三、渲染管线

渲染管线(Rendering Pipeline)是指计算机图形学中用于生成图像的一系列阶段和处理步骤。它描述了从输入几何数据到最终呈现图像的整个过程。渲染管线通常包括以下几个主要阶段:

  1. 应用阶段(Application Stage):在这个阶段,程序接收输入数据,例如顶点数据、纹理信息等。这些数据通常由应用程序提供,例如游戏引擎或者图形应用。
  2. 几何处理阶段(Geometry Processing Stage):在这个阶段,输入的几何数据(例如顶点、线段、三角形等)经过一系列变换(如模型变换、视图变换、投影变换等)和剪裁(Clipping),最终形成裁剪后的几何图形。
  3. 光栅化阶段(Rasterization Stage):在这个阶段,几何图形被转换为像素的集合,即光栅化。光栅化的过程包括确定每个像素的位置和颜色,以及应用纹理映射等操作。
  4. 片段处理阶段(Fragment Processing Stage):在这个阶段,对光栅化后的像素进行处理,计算最终的颜色值。这包括应用光照模型、纹理采样、深度测试、融合操作等。
  5. 输出阶段(Output Stage):最终生成的像素数据被发送到图形硬件的输出缓冲区,呈现在屏幕上。

在这里插入图片描述

四、WebGL绘图流程

1、创建获取WebGL上下文
const gl = document.querySelector("canvas").getContext("webgl");
2、创建WebGL程序(WebGL Program)
  1. 编写着色器

       //顶点着色器const vertex = `attribute vec2 position;void main(){gl_PointSize = 1.0;gl_Position = vec4(position,0.0,1.0);}`;// 片元着色器const fragment = `precision mediump float;void main(){gl_FragColor = vec4(1.0,0.0,0.0,1.0);}`;
    
  2. 创建shader对象

        //创建顶点着色器const vertexShader = gl.createShader(gl.VERTEX_SHADER);gl.shaderSource(vertexShader, vertex);gl.compileShader(vertexShader);//创建片元着色器const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);gl.shaderSource(fragmentShader, fragment);gl.compileShader(fragmentShader);
    
  3. 创建WebGLProgram对象

        //创建WebGLPrgame对象const program = gl.createProgram();gl.attachShader(program, vertexShader);gl.attachShader(program, fragmentShader);
    
  4. 连接并启用WebGLProgram对象

        gl.linkProgram(program);gl.useProgram(program); //启用webglProgram对象
    
3、将数据存入缓冲区
  1. 创建一个缓存对象

        const triangle = new Float32Array([-1, -1, 0, 1, 1, -1]);const bufferId = gl.createBuffer();
    
  2. 绑定为当前操作对象

        gl.bindBuffer(gl.ARRAY_BUFFER, bufferId);
    
  3. 当前数据写入缓存对象

        gl.bufferData(gl.ARRAY_BUFFER, triangle, gl.STATIC_DRAW);
    
4、将缓冲区数据读取到GPU
    //获取顶点着色器的position的变量位置下标const vPosition = gl.getAttribLocation(program, "position");gl.vertexAttribPointer(vPosition, 2, gl.FLOAT, false, 0, 0);//从bindBuffer绑定的缓冲区中读取数据gl.enableVertexAttribArray(vPosition);//激活这个变量
5、GPU执行WebGL程序,输出结果
    gl.clear(gl.COLOR_BUFFER_BIT);gl.drawArrays(gl.TRIANGLES, 0, triangle.length / 2);

五、完整代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><canvas width="500" height="500"></canvas></body><script type="module">const gl = document.querySelector("canvas").getContext("webgl");//顶点着色器const vertex = `attribute vec2 position;void main(){gl_PointSize = 1.0;gl_Position = vec4(position,0.0,1.0);}`;// 片元着色器const fragment = `precision mediump float;void main(){gl_FragColor = vec4(1.0,0.0,0.0,1.0);}`;//创建顶点着色器const vertexShader = gl.createShader(gl.VERTEX_SHADER);gl.shaderSource(vertexShader, vertex);gl.compileShader(vertexShader);//创建片元着色器const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);gl.shaderSource(fragmentShader, fragment);gl.compileShader(fragmentShader);//创建WebGLPrgame对象const program = gl.createProgram();gl.attachShader(program, vertexShader);gl.attachShader(program, fragmentShader);gl.linkProgram(program);gl.useProgram(program); //启用webglProgram对象//创建一个三角形坐标数据,并存入缓冲区const triangle = new Float32Array([-1, -1, 0, 1, 1, -1]);const bufferId = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, bufferId);gl.bufferData(gl.ARRAY_BUFFER, triangle, gl.STATIC_DRAW);//获取顶点着色器的position的变量位置下标const vPosition = gl.getAttribLocation(program, "position");gl.vertexAttribPointer(vPosition, 2, gl.FLOAT, false, 0, 0);//从bindBuffer绑定的缓冲区中读取数据gl.enableVertexAttribArray(vPosition);//激活这个变量gl.clear(gl.COLOR_BUFFER_BIT);gl.drawArrays(gl.TRIANGLES, 0, triangle.length / 2);</script>
</html>

六、顶点着色器向片元着色器传值

    // 顶点着色器const vertex = `attribute vec2 position;varying vec3 color;void main(){gl_PointSize = 1.0;color = vec3(0.5 + position * 0.5 , 0.0);gl_Position = vec4(position*0.5,1.0,1.0);}`;// 片元着色器const fragment = `precision mediump float;varying vec3 color;void main(){gl_FragColor = vec4(color,1.0);}`;

在这里插入图片描述

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

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

相关文章

2024年【电工(初级)】考试内容及电工(初级)证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【电工&#xff08;初级&#xff09;】考试内容及电工&#xff08;初级&#xff09;证考试&#xff0c;包含电工&#xff08;初级&#xff09;考试内容答案和解析及电工&#xff08;初级&#xff09;证考试练习…

C++中的类模板

C中的类模板 类模板 类模板在C中是一种非常强大的工具&#xff0c;它允许程序员编写与数据类型无关的代码。简单来说&#xff0c;类模板允许你定义一个蓝图&#xff0c;这个蓝图可以用来生成具体类型的类。使用类模板可以提高代码的复用性&#xff0c;减少重复代码&#xff0…

字节跳动春招研发部分编程题汇总做题笔记---Java

3.雀魂启动&#xff01; 小包最近迷上了一款叫做雀魂的麻将游戏&#xff0c;但是这个游戏规则太复杂&#xff0c;小包玩了几个月了还是输多赢少。 于是生气的小包根据游戏简化了一下规则发明了一种新的麻将&#xff0c;只留下一种花色&#xff0c;并且去除了一些特殊和牌方式&…

Java基础知识总结(14)

map集合 /* java.util.Map接口中常用的方法 1、Map和Collection 没有继承关系 2、Map集合以key和value的方式存储数据&#xff1a;键值对key和valuea都是引用数据类型key和value都是存储对象的内存地址key起到主导地位&#xff0c;value是key的一个附属品 3、Map接口中常用的方…

GDAL实现大幅影像的快速读取

这里做个备份&#xff0c;原文链接 遥感影像小则几百兆&#xff0c;大则5,6GB&#xff0c;所以在使用GDAL进行图像读取时面临读写速度较慢的问题&#xff0c;我们可以深入研究gdal中RasterIO函数的机制&#xff0c;发现该函数是通过一行一行读取影像来实现影像读入内存的&…

【教学类-40-01】20240322 幼儿视力检查照片合成GIF

作品展示——GIF动图 背景需求&#xff1a; 2024年3月22日&#xff0c;中班幼儿视力检查&#xff0c;保健老师表扬我们班幼儿视力正常率高。 我为每位孩子拍照时&#xff0c;突然想把动作图用Python变成GIF图片&#xff0c;于是每位孩子都拍了多张“辨认视力表的不同手势”&a…

基于Springboot的西安旅游系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的西安旅游系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

动态规划(算法竞赛、蓝桥杯)--单调队列优化绿色通道

1、B站视频链接&#xff1a;E45 单调队列优化DP 绿色通道_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N5e410; int n,tim,w[N],f[N],q[N];bool check(int m){int h1,t0;for(int i1; i<n; i){while(h<t && f[q[t]]>f[i-…

visual studio卸载几种方法

1、控制面板卸载&#xff1b; 2、有时候会发现控制面板卸载会失败&#xff0c;无法卸载&#xff0c;这时候要先把下面目录的关于visual studio的都删除&#xff0c;然后重启电脑后&#xff0c;重新安装vs即可。

使用echart绘制拓扑图,树类型,自定义tooltip和label样式,可收缩

效果如图&#xff1a; 鼠标移上显示 vue3 - ts文件 “echarts”: “^5.4.3”, import { EChartsOption } from echarts import * as echarts from echarts/core import { TooltipComponent } from echarts/components import { TreeChart } from echarts/charts import { C…

复试专业前沿问题问答合集10-1——区块链与加密货币

复试专业前沿问题问答合集10-1——区块链与加密货币 区块链与加密货币安全以及6G通信的基础知识问答: 区块链以及加密货币相关的基础安全知识 包括区块链如何确保交易安全、共识机制的作用、加密货币钱包的保护措施、智能合约的工作原理以及如何防范潜在的网络攻击。这些知…

vue项目实现---用户在页面没有操作5分钟时退出登录

方案1: 后端处理 (1)用户切换页面或者点击按钮时需要发送请求接口,如果后端判断在5分钟之内没有请求,然后将前端的token失效 方案2: 前端处理 (1)在main.js中创建全局的事件监听器来实现对键盘抬起事件和鼠标点击事件的监听 试例:Vue 项目中全局监听键盘抬起事件和鼠标点击…

【笔记】KaiOS SPN显示逻辑

更新流程code 1、gonk/dom/system/gonk/radio/RadioInterfaceLayer.jsm handleNetworkStateChanged -> requestNetworkInfo() -> handleRilResponse的getOperator -> handleOperator handleNetworkStateChanged:网络状态变化请求网络信息 this.requestNetworkInfo…

实用福利网站分享

1.http://www.w3school.com.cn w3school&#xff0c;很好的在线web学习网站&#xff0c;免费 2.https://sklearn.apachecn.org sklearn文档&#xff0c;虽然是文档&#xff0c;但能学到很多很多具体的机器学习例子和知识 3.http://www.runoob.com 菜鸟教程&#xff0c;也是…

实验6-10 统计单词的长度(PTA)

题目&#xff1a; 本题目要求编写程序&#xff0c;输入一行字符&#xff0c;统计每个单词的长度。所谓“单词”是指连续不含空格的字符串&#xff0c;各单词之间用空格分隔&#xff0c;空格数可以是多个。 输入格式: 输入给出一行字符。 输出格式: 在一行中输出每个单词的…

阿里云2核4G云服务器ECS和轻量应用服务器价格表

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

【postgresql 基础入门】表的约束(一)主键与外键,数据的实体完整性与参照完整性,外键引用数据被修改时的动作触发

主键与外键-表的约束(一) ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 系列文章…

2核4G服务器阿里云性能测评和优惠价格表

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

Debezium日常分享系列之:Debezium2.5稳定版本之数据类型映射

Debezium日常分享系列之&#xff1a;Debezium2.5稳定版本之数据类型映射 一、基本类型二、时间类型三、Decimal类型四、Boolean values布尔值五、Spatial types空间类型六、Debezium技术总结 Debezium MySQL 连接器表示对带有事件的行的更改&#xff0c;这些事件的结构类似于该…

MySQL数据库存储引擎MyISAM与InnoDB

前言 MySQL存储引擎是MySQL数据库中负责管理数据存储和检索的组件&#xff0c;不同的存储引擎提供了不同的功能和特性&#xff0c;可以根据实际需求选择合适的存储引擎来优化数据库性能和功能。以下是一些常见的MySQL存储引擎&#xff1a;InnoDB、MyISAM、MEMORY、NDB Cluster…