从WebGL到Babylonjs

news2024/9/23 13:31:12

从WebGL到Babylonjs

一、关于WebGL

  • 前世今生 OpenGL => OpenGL ES => WebGL
  • 本质:通过js代码去调用OpenGL的一系列Api

二、WebGL程序的构成

1、一个简单的webgl程序

const canvas = document.querySelector('canvas');
const gl = canvas.getContext('webgl2');
const vertexShaderSource = `#version 300 es
in vec4 position;
void main() {
    gl_Position = position;
}`;
const fragmentShaderSource = `#version 300 es
precision highp float;
out vec4 outColor;
void main() {
    outColor = vec4(0, 1, 0.5, 1);
}`
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);

const prg = gl.createProgram();
gl.attachShader(prg, vertexShader);
gl.attachShader(prg, fragmentShader);
gl.linkProgram(prg);

const triangleVAO = gl.createVertexArray();
gl.bindVertexArray(triangleVAO);

const vertexPositions = new Float32Array([0, 0.7, 0.5, -0.7, -0.5, -0.7]);

const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertexPositions, gl.STATIC_DRAW);

const positionLoc = gl.getAttribLocation(prg, 'position')
gl.enableVertexAttribArray(positionLoc);
gl.vertexAttribPointer(positionLoc, 2, gl.FLOAT, false, 0, 0);
gl.useProgram(prg);

gl.drawArrays(gl.TRIANGLES, 0, 3);

最终输出
在这里插入图片描述

可以看到、为了画一个三角形花了四十行代码,看起来很多,但是大部分是webgl相关的操作(上面以gl.开头的代码)
写起来是非常麻烦和不易理解的
如果对webgl的具体执行流程感兴趣可以访问这个在线网站
[https://webgl2fundamentals.org/webgl/lessons/resources/webgl-state-diagram.html?exampleId=samplers#no-help]
在这里插入图片描述

2、为了更好的理解,我们可以把WebGL程序分成两个部分

2.1 js代码

  • 数据的准备(模型加载、纹理图像加载)
  • 向GPU传输数据

2.2 着色器代码

  • 顶点着色器(VertexShader)

负责处理顶点数据,顶点位置变换

  • 片元着色器(FragmentShader)

负责一个着色函数,让每一个像素点都经过这个函数处理,最终变成一个新的像素值

可以把他们理解为两个函数,分别对顶点和像素数据进行一些操作

三、WebGL(OpenGL)的渲染管线(Render PipeLine)

  • 完整流程
    在这里插入图片描述

    白色部分大多是GPU自动处理的,而绿色部分是可由开发人员自由控制的,我们对GPU的操作也大都集中在这两个部分。
    上面的完整渲染管线看起来非常复杂,当经过简化之后大概就是下面这张图,看起来非常简洁明了
    在这里插入图片描述

    通俗的解释一下:

  • 模型数据进入显存之后,首先会经过顶点着色器,一般在这里处理模型顶点位置的变换

  • 接下来经过片元着色器,在这里根据灯光、材质、贴图等数据计算出最终的颜色

  • 最后输出到屏幕

四、Babylonjs

4.1 和WebGL的区别

  • WebGL:一系列的API
  • Babylonjs:对WebGL更高一级的抽象
    比如在Babylon中新建一个立方体,看似只有一行代码, 但是在背后它可能就自动帮你完成了顶点数据准备,着色器创建、编译,数据绑定、数据传输...等工作

4.2 几个主要的概念

在这里插入图片描述

  • Engine:负责与WebGL的直接交互
  • Scene:一个大的场景树,管理着所有Mesh、Light、Camera等
  • Camera:相机,决定着观察者的视角,本质就是一个矩阵
  • Light:灯光,点亮场景,可以理解为片元着色器里面的一个输入参数
  • Mesh:网格,一个可渲染对象,包含了单次渲染的必要数据
    • Material:片元着色器里面的一群输入参数
    • Geometry:存储着顶点的位置数据等

4.3 与webgl的对应关系

在渲染时,可以理解为每个mesh都执行了一遍render方法
在渲染当前mesh的时候,把当前mesh相对应的顶点、贴图数据、program等设置为激活状态,然后调用一次drawCall指令,GPU就会安装预定好的渲染管线结合mesh的这些数据开始绘制
当场景中的mesh遍历完之后,一个完整的render就结束了

我们知道babylonjs是对webgl一层抽象,但是不管你再怎么花里胡哨抽象,在最终落实到渲染的时候还是得转换成一个标准的webgl程序,最终通过渲染管线把数据转换成像素输出到屏幕。
落实到webgl的渲染管线上,他们的大致对应关系将如下图所示
在这里插入图片描述

  • Mesh上挂载的Geometry和Texture将会送入到显存中,其中顶点数据将会送给接下来的顶点着色器使用,Texture将会给到片元着色器使用;
  • Camera将会成为MVP矩阵的一部分,决定着顶点的输出位置
  • Light、Material等将会决定着片元着色器的输出颜色

五、学习资源推荐

(注:部分网站需要🪜)

1、WebGL

  • WebGL2理论基础(推荐) https://webgl2fundamentals.org/webgl/lessons/zh_cn/
  • WebGL程序运行状态可视化(推荐) https://webgl2fundamentals.org/webgl/lessons/resources/webgl-state-diagram.html?exampleId=triangle#no-help
  • WebGL规范(官方、很全) https://registry.khronos.org/webgl/specs/latest/2.0/
  • 图形学基础概念 https://math.hws.edu/eck/cs424/graphicsbook-1.3/

2、着色器学习

  • 基础概念(推荐) https://thebookofshaders.com/
  • 在线运行网站 https://glslsandbox.com/

3、Babylonjs

  • 文档 https://doc.babylonjs.com/journey/theFirstStep
  • 实验场(在线运行代码)https://playground.babylonjs.com/
  • 沙盒(快速查看模型)https://playground.babylonjs.com/

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

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

相关文章

llama.cpp一种在本地CPU上部署的量化模型(超低配推理llama)

0x00 背景 前不久,Meta前脚发布完开源大语言模型LLaMA, 随后就被网友“泄漏”,直接放了一个磁力链接下载链接。 然而那些手头没有顶级显卡的朋友们,就只能看看而已了 但是 Georgi Gerganov 开源了一个项目llama.cpp ggergano…

HBase高可用

一、HBase高可用简介 HBase集群如果只有一个master,一旦master出现故障,将导致整个集群无法使用,所以在实际的生产环境中,需要搭建HBase的高可用,也就是让HMaster高可用,也就是需要再选择一个或多个节点也…

【C语言】那些 “虾仁猪心“ 的坑题

本章介绍 最近翻笔记,整理了下那些日子里面掉过的坑题,说多都是泪!!也许是自己的储备知识不足,才造成的大坑,今天把题拿出来给大家溜溜,看大家做时候有没有踩坑! 文章目录 1:第一题2…

项目笔记-瑞吉外卖

文章目录 1.业务开发day011.软件开发整体介绍2.项目整体介绍:star:3.开发环境搭建4.登录功能:star4.1代码实现 5.退出功能6.页面效果出现 1.业务开发 day01 1.软件开发整体介绍 2.项目整体介绍⭐️ 后端:管理菜品和员工信息前台:通过手机端…

根据cadence设计图学习硬件知识 day03 了解 一些芯片 和 数据手册下载的地方

1. MT53D512M32D2DS 芯片(动态随机存取存储器)的技术指标 1.1 16n Prefetch (预加载) (n --芯片位宽) DDR 体系 链接:DDR扫盲—-关于Prefetch(预取)与Burst(突发)的深入讨论_ddr prefetch_qq_25814297-npl的博客-CSDN博客 1.2 每个通…

网络层重点协议之【IP协议】

0. IP地址组成 IP地址分为两个部分,网络号和主机号 网络号:标识网段,保证相互连接的两个网段具有不同的标识主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号 一…

浅谈: 计算机—JVM—线程

计算机存储模型(CPU、寄存器、高速缓存、内存、外存) 现代计算机系统CPU和内存之间其实是有一个cache的层级结构的。比内存速度更快的存储介质(SRAM),普通内存一般是DRAM,这种读写速度更快的介质充当CPU和内存之间的Cache,这就是缓存。当CPU…

医学图像分割之TransUNet

目录 一、背景 二、提出问题 三、解决问题 四、网络结构详解 CNN部分(ResNet50的前三层) transformer部分 U-Net的decoder部分 五、模型性能 开头处先说明下TransUNet的地位:它是第一个将transformer用于U型结构的网络。 一、背景 医…

【Java|golang】1105. 填充书架---动态规划

给定一个数组 books ,其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放在书架上(它们的厚度之和小于等于书架的宽度 shelfWidt…

PCL点云库(1) — 简介与数据类型

目录 1.1 简介 1.2 PCL安装 1.2.1 安装方法 1.2.2 测试程序 1.3 PCL数据类型 1.4 PCL中自定义point类型 1.4.1 增加自定义point的步骤 1.4.2 完整代码 1.1 简介 来源:PCL(点云库)_百度百科 PCL(Point Cloud Library&…

Vue组件间通信的7种方法(全)

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进…

6.4 一阶方程组与高阶方程的数值解法

学习目标: 学习一阶方程组与高阶方程的数值解法的目标可以分为以下几个方面: 掌握一阶方程组和高阶方程的基本概念和求解方法;理解数值解法的概念和原理,了解常见的数值解法;掌握欧拉方法、改进欧拉方法和龙格-库塔方…

Viu联合华为HMS生态,共创影音娱乐新体验

华为HMS生态携手流媒体平台Viu,为海外消费者打造精品移动娱乐应用体验,并助力提升流量变现能力。Viu在中东非、东南亚等16个国家及地区提供广告合作和付费会员服务,支持优质视频内容高清点播和直播。自2019年起,Viu在中东非区域与…

Windows下版本控制器(SVN)-TortoiseSVN使用

文章目录 基础知识-Windows下版本控制器(SVN)3.4 TortoiseSVN使用3.4.1 SVN检出(SVN Checkout)3.4.2 SVN更新(SVN Update)3.4.3 **SVN**提交(SVN Commit)3.4.4 **SVN**还原(SVN Revert)3.4.5 解决文件冲突3.4.6 授权访问3.4.7 **显示日志(Show log)**3.4.8 **版本库浏览(Repo-b…

Java项目上线之服务器环境配置篇(二)——Tomcat配置

Java项目上线之服务器环境配置篇(二)——Tomcat配置 Tomcat的选择: 云服务器tomcat的选择最好与本机项目运行的tomcat版本号一致,避免一些不必要的问题。 配置步骤: 1、首先进入云服务器创建好放置tomcat的文件夹。这…

台灯发光方式哪种好?分享好用侧发光的护眼台灯

台灯发光方式主要是侧发光、直发光方式。个人觉得侧发光的台灯会比较好。 侧发光灯主要利用导光板技术,根据led灯板灯珠的排布以及灯珠的发光角度进行导光板网点设计,使光线通过导光板达到亮度均匀化的效果。 而直发光灯以高亮度led为发光源&#xff0…

手势语言识别模型训练及应用

使用训练集训练模型,使模型能够识别不同手势。 OpenCV-Python环境使用训练集训练模型,使模型能够识别不同手势。系统测试 本项目基于卷积神经网络,通过Python的翻转功能沿垂直轴翻转每个图像,实现手势语言识别的功能。系统流程如图…

FL Studio21最新中文版安装包下载操作教程

FL Studio21是一款非常流行的数字音频工作站(DAW)软件,用于音乐制作、录音、调整和混音。它由Image-Line公司开发,前身叫FruityLoops,后改名为FL Studio。 FL Studio21的主要功能包括: 1. MIDI编序器:用于录入和编辑MIDI音序,控制软件乐器和外部硬件。 2. 虚拟乐器:提供各种模…

matrix部署

一、环境描述 首先matrix是一个去中心化的聊天服务,matrix实现了端对端的加密,这意味着不仅其他人无法查看你的聊天内容,哪怕你更换了一个终端,你也需要私钥才能够查看你的聊天记录。 这是终极的隐私保护方案,因为一旦…

【Python_Matplotlib学习笔记(二)】Matplotlib绘图嵌入PySide2图形界面

Matplotlib绘图嵌入PySide2图形界面 前言正文1、FigureCanvasQTAgg类介绍2、基于FigureCanvasQTAgg类实现Matplotlib绘图嵌入PySide2图形界面3、示例代码及实现效果 前言 在本文中主要介绍 如何基于 FigureCanvasQTAgg 类实现 Matplotlib 绘图嵌入 PySide2 图形界面。 正文 …