WebGL介绍

2,718 阅读3分钟

目录

  • 什么是WebGL🤔
  • WebGL和canvas比较👊
  • WebGL的原理☀️
  • WebGL是简单的😁
  • WebGL是复杂的😭

什么是WebGL

  • WebGL(全写Web Graphics Library)是一种3D绘图标准
  • WebGL在电脑的GPU中运行
  • WebGL可以为HTML5 Canvas提供硬件3D加速渲染

举个例子

示例

性能

当执行大量绘制任务时,WebGL的性能约是canvas的3~5倍😲(数据供参考)

WebGL的原理☀️

program(着色程序)= 顶点着色器 + 片断着色器

  • WebGL在GPU中运行。因此需要使用能够在GPU上运行的代码。这样的代码需要提供成对的方法。每一对组合起来称作一个program
  • 顶点着色器:计算顶点的位置,
  • 片断着色器:计算出当前绘制图元中每个像素的颜色值

举个例子

示例

图例

ss

矩阵变换

假设三角形的原点位于(0,0,-1)处,没有旋转或缩放,三个顶点分别为(-1,-1,-1),(1,-1,-1),(0,1,-1),即世界坐标
假设观察者位于(0,0,1)处而且看向三角形,那么三个顶点相对于观察者的坐标为(-1,-1,-2),(1,-1,-2),(0,1,-2),即视图坐标
观察者的眼睛是一个点(这是透视投影的前提),水平视角和垂直视角都是90度,观察者能够看到的区域是一个四棱台体
将四棱台体映射为标准立方体(CCV,中心为原点,边长为2,边与坐标轴平行)

局部坐标 –(模型变换)-> 世界坐标 –(视图变换)-> 视图坐标 –(投影变换)–> CCV 坐标

以(0,1,0)为例,它的齐次向量为(0,0,1,1),变化过程如下:

22

参考

深度检测

当两个表面重叠时,前面的模型会挡住后面的模型

顶点着色器给出了 6 个顶点的 gl_Position ,经过光栅化,片元着色器获得了 2X 个片元(假设 X 为每个三角形的像素个数),每个片元都离散的 x,y 坐标值,还有 z 值。x,y 坐标就是三角形在 Canvas 上的坐标,但如果有两个具有相同 x,y 坐标的片元同时出现,那么 WebGL 就会取 z 坐标值较小的那个片元

纹理

为每个顶点指定一个纹理坐标(在(0,0)与(1,1,)的正方形中),然后传入纹理对象。片元着色器拿到的是对应片元的内插后的纹理坐标,就利用这个纹理坐标去纹理对象上取颜色,再画到片元上。

attribute 变量还可以帮助绘制纹理。绘制纹理的基本原理是,为每个顶点指定一个纹理坐标(在(0,0)与(1,1,)的正方形中),然后传入纹理对象。片元着色器拿到的是对应片元的内插后的纹理坐标,就利用这个纹理坐标去纹理对象上取颜色,再画到片元上

混合与蒙版

混合机制与深度检测类似,也发生在试图向某个已填充的像素填充颜色时。深度检测通过比较z值来确定像素的颜色,而混合机制会将两种颜色混合


光照

WebGL 没有为光照提供任何内置的方法,需要开发者在着色器中实现光照算法 光是有颜色的,模型也是有颜色的。在光照下,最终物体呈现的颜色是两者共同作用的结果。

复杂模型

复杂模型可能有包括子模型,子模型可能与父模型有相对运动。

WebGL是简单的

它做的是一件简单的事,它仅仅运行用户提供的两个方法,一个顶点着色器和一个片断着色器,去绘制点,线和三角形。

WebGL是复杂的

做复杂的三维效果,需要复杂的“着色器”。所有空间坐标计算,着色器的设计,都需要程序自己做复杂的算法处理。

WebGL库

目前最流行的 WebGL库 ThreeJs

调试工具

比较成熟的 WebGL 调试工具是WebGL Inspector

总结

WebGL经常被当成3D API,人们总想“我可以使用WebGL和一些神奇的东西做出炫酷的3D作品”。 事实上WebGL仅仅是一个光栅化引擎,它可以根据你的代码绘制出点,线和三角形。想要利用WebGL完成更复杂任务,取决于你能否提供合适的代码,组合使用点,线和三角形代替实现。

为什么没有在日常开发中大规模的应用呢❓

  • WebGL是直接调用底层的OpenGL,这使得WebGL的接口十分晦涩,对于一般的Web开发人员来说,门槛比较高。
  • WebGL的兼容性并不好

参考资料