webgl基础
# 为什么要出webgl
- WebGL 使得网页在支持 HTML canvas 标签的浏览器中,不需要使用任何插件,便可以使用基于 OpenGL ES 2.0 的 API 在 canvas 中进行 3D 渲染。
- WebGL 程序由 javascript 的控制代码,和在计算机的图形处理单元(GPU, Graphics Processing Unit)中执行的特效代码 (shader code,渲染代码) 组成。
- WebGL 元素可以和其他 HTML 元素混合,并且会和页面的其他部分或页面背景相合成。
# OpenGl 是什么
OpenGL 是一个图形API,所以它允许我们做一些关于图像方面的事情。特别地,OpenGL实际上允许我们访问我们的GPU(显卡),显卡可以更有力地绘制图形。
它本身是一种规范,类似说“Hey,这个函数应该存在,他需要这些参数,并且需要返回这个值”。他只是个告诉你可以利用这些API做什么的规范,而不提供任何实现。这意味着它肯定不是一个库,因为OpenGL本身是没有任何代码的。
OpenGl里的函数是由显卡生产商书写在显卡上 然后提供给我们一个api让我们按照他们需要的方式来传参 相当于指导说明书
关键是在于你的显卡厂商是如何编写OpenGL实现的,NVDIA和AMD、Intel显卡厂商提供的opengl都会有所不同。
# 老的OpenGL和现代OpenGL
OpenGL在90年代发布,那时的GPU并不是灵活的并且可编程的,你不能随心所欲地去操控它,尤其是使用较底层的API。但是现在,人们可以很大程度上控制它。显卡厂商给了程序员和开发者更多的控制权。
老的OpenGL更像是一个流水线,所以从另一个方面来说,你说我要画一个三角形,并且我要加入光源,那么你要怎么加入这个光源呢。你可以告诉OpenGL类似"Lighting = True"的代码,这样可以启用光照。然后你告诉OpenGL你想在这里启用光照,像这样的就叫流水线式的操作。
这种老OpenGL很容易被使用,代码也很少。但不幸的是你也没什么控制权。我们想要更多的控制权,我们想要实现更多令人惊叹的图形。
老OpenGL和现代OpenGL的最大区别在于 "着色器"。着色器是一段运行在GPU上的程序。所以我们用C++或JAVA或C#其他什么编程语言写的程序都是运行在CPU上的。但当我们针对图形处理的时候,我们想要精准控制GPU,所以可能要将一些代码从CPU放到GPU上。因为它们可以在GPU上运行地更快。这就是着色器存在的意义。着色器只是允许我们在GPU上写程序。
因为你想要计算出复杂的光照算法,你一定会想在GPU上计算而不是像过去一样在CPU上解决。
所以老OpenGL和现代OpenGL最重要的区别在于是否有可编程着色器。
# CPU 与 GPU 的区别
- CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。
- CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂。
- 而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。
- cpu与gpu的区别 (opens new window)
# webgl 着色器
着色器是使用opengl ES(GLSL) 着色器语言编写的
它携带了 绘制形状的顶点信息 构造绘制在屏幕上所需像素的所有信息
换句话说 它负责记录像素点的位置和颜色
# 顶点着色器
每次渲染一个形状时,顶点着色器会在形状中的每个顶点运行。它的工作是将输入顶点从原始坐标系转换到 WebGL 使用的缩放空间 (clipspace) 坐标系,其中每个轴的坐标范围从-1.0 到 1.0,并且不考虑纵横比,实际尺寸或任何其他因素。
# 片段着色器
- 片段着色器在顶点着色器处理完图形的顶点后,会被要绘制的每个图形的每个像素点调用一次。它的职责是确定像素的颜色,通过指定应用到像素的纹理元素(也就是图形纹理中的像素),获取纹理元素的颜色,然后将适当的光照应用于颜色。之后颜色存储在特殊变量 gl_FragColor 中,返回到 WebGL 层。该颜色将最终绘制到屏幕上图形对应像素的对应位置。
# 感悟
- 能够决定一个软件工程师的本质的,不是那些瞬息万变的技术点,而是那些不变的东西
- 所谓不变的东西 ,就是驾驭技术的能力
具体来说,它分为一下三个层次:
- 能用健壮的代码去解决具体的问题;
- 能用抽象的思维去应对复杂的系统;
- 能用工程化的思想去规划更大规模的业务;
基础理论知识是一个人的基线,理论越强的人的基线越高。再为自己定一个目标和向上攀附的阶梯,那么达到目标就是时间的问题,而很多野路子工程师搞了半辈子也未能达到优秀工程师的基线,很多他们绞劲脑汁得出的高深学问,只不过是正规工程师看起来很自然的东西