利用WebGL绘制简单几何

news2024/11/26 8:26:47

利用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.coloradmin.cn/o/1530968.html

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

相关文章

python_django网红基地孵化园场地管理系统flask

作为一个管理孵化园的网络系统&#xff0c;数据流量是非常大的&#xff0c;所以系统的设计必须满足使用方便&#xff0c;操作灵活的要求。所以在设计孵化园管理系统管理系统应达到以下目标&#xff1a; &#xff08;1&#xff09;界面要美观友好&#xff0c;检索要快捷简易&…

python问题:vscode切换环境,pip安装库网络错误,不使用anaconda安装库

python问题&#xff1a;vscode切换环境&#xff0c;pip安装库网络错误 vscode切换环境pip安装库网络错误 不使用anaconda安装库 记录一下遇见的python问题。 vscode切换环境 在vscode上面的搜索框输入 > select interpreter然后选择需要的环境。 pip安装库网络错误 用…

数据丢失怎么办?不可不知道的3个恢复方法分享!

“作为一名电脑小白&#xff0c;刚买了电脑后我就把所有学习资料都保存在电脑上了&#xff0c;刚刚发现有部分比较重要的数据找不到了&#xff0c;我应该怎么操作才能恢复这些文件呢&#xff1f;” 数据丢失&#xff0c;对于任何个人或企业来说&#xff0c;都是一件令人头疼的事…

Python学习从0到1 day17 Python异常、模块、包

不走心的努力&#xff0c;都是在敷衍自己 ——24.3.19 万字长文&#xff0c;讲解异常、模块、包&#xff0c;看这一篇就足够啦 什么是异常? 当检测到一个错误时&#xff0c;python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的异常&am…

「滚雪球学Java」:安全(章节汇总)

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

代码随想录day26(1)二叉树:二叉搜索树的最小绝对差(leetcode530)

题目要求&#xff1a;给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 思路&#xff1a;最简单的想法就是新建数组&#xff0c;通过中序遍历将节点值全都存入数组中&#xff08;有序&#xff09;&#xff0c;然后计算相邻两节…

【堡垒机】企业购买堡垒机的七大需求你知道吗?

目前想了解堡垒机的企业越来越多了&#xff0c;采购堡垒机的企业也越来越多了。那企业购买堡垒机的七大需求你知道吗&#xff1f;今天我们小编就跟大家一起来探讨一下&#xff0c;仅供参考哦&#xff01; 企业购买堡垒机的七大需求 需求1、简化运维流程&#xff0c;提高运维工…

【Docker】-- 如何安装docker

一、安装docker 首先要安装一个yum工具 yum install -y yum-utils 安装成功后&#xff0c;执行命令&#xff0c;配置Docker的yum源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 最后&#xff0c;执行命令&#x…

MySQL中replace into详解、批量更新、不存在插入存在则更新、replace into的坑

文章目录 一、replace into原理二、replace into的三种形式三、replace into 使用案例3.1、replace into values3.1.1、只有主键且主键冲突3.1.2、有主键有唯一索引且主键冲突3.1.3、有主键有唯一索引且唯一索引冲突(有坑)3.1.4、有主键有唯一索引且与一条主键冲突与另一条唯一…

centos7磁盘管理,lvm挂载、扩容

一、centos7 磁盘挂载 默认盘符格式 centos7 默认文件格式xfscentos6 默认文件格式ext4centos5 默认文件格式ext3 1、/dev/vdb和/dev/mapper/lvm-data对比 1&#xff09;/dev/vdb /dev/vdb通常表示一个裸的块存储设备&#xff0c;比如一个硬盘或者虚拟机中的一个虚拟硬盘。…

c语言综合练习题

1.编写程序实现键盘输入一个学生的学分绩点 score&#xff08;合法的范围为:1.0—5.0&#xff09;&#xff0c;根据学生的学分绩点判定该学 生的奖学金的等级&#xff0c;判定规则如下表所示。 #include <stdio.h>int main() {float score;printf("请输入学生的学分…

在Arm 虚拟硬件(AVH)部署深度学习OCR算法

AI算法的嵌入式部署 AI算法在独立的设备上运行其实就是行业内的嵌入式AI的概念, 大致过程如下: 开发AI模型, 2.对数据集进行处理, 3.训练AI模型并验证效果, 4.转成ONNX格式(ONNX:万金油中间格式,给模型优化和部署带来了更多可能性)或者借助libtorch或者TensorFlow来部署C++版…

FreeRTOS时间片调度

1. 时间片调度简介 同等优先级任务轮流地享有相同的 CPU 时间(可设置)&#xff0c; 叫时间片。在FreeRTOS中&#xff0c;一个时间片就等于SysTick 中断周期。 像我们的源码&#xff0c;滴答定时器是 1ms 中断一次&#xff0c;那么一个时间片的时间就是 1ms。可设置&#xff1a…

如何选择一款靠谱的短网址工具,避坑指南

选择一款靠谱的短网址服务是非常重要的。这不仅关乎到你的个人体验&#xff0c;更直接影响到你的业务发展和流量转化。想象一下&#xff0c;你精心策划了一场营销活动&#xff0c;通过短网址分享给了众多用户&#xff0c;然而因为短网址服务的不稳定&#xff0c;用户无法打开链…

多个线程交替打印ABC

多个线程交替打印ABC package 多个线程交替打印ABC;import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier;/*** Created with IntelliJ IDEA.** Author: AlenXu* Date: 2024/03/20/10:10* Description:*/ public class ThreadLoopP…

Hack The Box-Devvortex

目录 信息收集 nmap whatweb WEB web信息收集 wfuzz 漏洞探索 漏洞发现 反弹shell 提权 get user hashcat get root 信息收集 nmap 端口信息收集┌──(root?ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.242 --min-rate 10000 Starting Nmap 7…

javase Set集合

Collection子接口2&#xff1a;Set 5.1 Set接口概述 Set接口是Collection的子接口&#xff0c;Set接口相较于Collection接口没有提供额外的方法 Set 集合不允许包含相同的元素&#xff0c;如果试把两个相同的元素加入同一个 Set 集合中&#xff0c;则添加操作失败。 Set集合…

红黑树简单介绍

1. 概念介绍 红黑树是一种自平衡二叉查找树&#xff0c;由于自平衡的特性&#xff0c;保证了最坏情况下在O&#xff08;logn&#xff09;时间复杂度内完成查找、增加、删除等操作&#xff0c;性能表现稳定。 在JDK中&#xff0c;TreeMap、TreeSet以及JDK1.8的HashMap底层都采用…

数据之王国:解析Facebook的大数据应用

引言 作为全球最大的社交媒体平台之一&#xff0c;Facebook拥有庞大的用户群体和海量的数据资源。这些数据不仅包括用户的个人信息和社交行为&#xff0c;还涵盖了广告点击、浏览记录等多方面内容。Facebook通过巧妙地利用这些数据&#xff0c;构建了强大的大数据应用系统&…

面向航天器大数据安全传输的发布/订阅系统设计

源自&#xff1a;系统工程与电子技术 作者&#xff1a;覃润楠 彭晓东 谢文明 惠建江 冯渭春 姜加红 “人工智能技术与咨询” 发布 摘 要 针对航天器试验任务过程监控的在轨故障诊断状态检测、健康状态评估与航天器寿命预测等多个环节中, 海量试验数据在传输、共享、处…