WebGL学习笔记(一):理解基本概念和渲染管线
WebGL 是以 OpenGL ES 2.0 为基础的 3D 编程应用接口。
渲染管线(图形流水线)
渲染管线是指将数据从3D场景转换成2D图像,最终在屏幕上显示出来的总过程。它分为几个阶段:应用阶段、几何阶段和光栅阶段,关于这3个阶段的详细介绍可以点这里查看。
下面我们来仔细看看 WebGL 中的每个步骤:
1.顶点着色器
顶点着色器一般用来对模型的顶点进行矩阵变换,一般就是将模型的所有顶点乘于一个变换矩阵,使该模型位于相对于WebGL坐标系中的某个位置。
顶点着色器是可编程的,使用的语言是 GLSL 来进行编写,下面我们主要说一下几种常用的属性类型:
- attribute变量:用户自定义变量,一般是存储顶点属性的变量;
- uniform变量:恒值变量,一般表示每个顶点都一致的变量,比如变换矩阵、光照等;
- varying变量:易变变量,将顶点着色器的数据传递给片段着色器时使用;
- 内置常量:WebGL 内部的常量;
2.图元装配
这个阶段,GPU会将我们传入的顶点装配成三角形、线段或者点;装配好之后,会自动截去不在可视区域内的信息;
3.光栅化
这个阶段,GPU会将装配好的三角形转换成对应的像素,并将这些像素传入下一个阶段;
4.片段着色器
得到光栅化的片段像素位置数据之后,就可以通过片段着色器为这些像素进行上色了,这是第二个可以编程的地方;
我们可以对图片进行采样之后,再这里进行上色;
5.逐片段操作
本步骤包含了多个子操作,每个操作都会影响当前片段最终的显示效果,下面我们看下几个常见的子操作:
1.裁剪测试
会有一个裁剪的范围,如果像素位于该范围之外,会被剔除,不会到达绘制缓存;
2.多重采样片段操作
这一步会修改像素的alpha值和覆盖值,主要用来实现抗锯齿的效果;
3.背面剔除
剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施,比如一个立方体,你不会看到背离你的那一面(总是只有一面在你的前方),因此我们不需要绘制出背面;
4.alpha测试
指的是将一个像素点的alpha值和一个固定值比较,如果比较的结果失败,像素将不会被写到显示输出中;
5.模板测试
模板缓存与颜色缓存的大小一致,模板缓存中的像素点与后台缓存的像素点是一一对应的。
模板缓存允许我们动态地、有针对性地决定是否将某个像素写入后台缓存中。模板缓存用与获得某种特效,如镜面效果或阴影效果。在实现镜面效果时,我们在“镜子”这块区域中绘制某个特定物体的映像,而使用模板缓存来阻止物体映像在“非镜子”的区域中进行绘制;
为了进行这种阻止,就需要使用模板测试。判断是否将某个像素写入后台缓存的决策过程,称为模板测试;
6.alpha融合
融合技术能使我们将当前要进行的光栅化的像素的颜色与先前已经光栅化并处于同一位置的像素的颜色进行合成,即将正在处理的图元颜色值与存储中后台缓存中的像素颜色值进行合成。利用该技术,我们可以获得各种各样的效果,尤其是透明效果。不过值得注意的是,为了场景中绘制透明物体,通常需要对物体按照由后到前的顺序进行混合处理,如果按照任意顺序进行处理将会产生严重的失真。所以在blending(混色)操作之前要来一次深度测试;
7.深度测试
这一步会进行深度测试,抛弃掉位置靠后的像素值,因为这个位置的像素本身就是被更前面的像素覆盖的;
8.融合
这一步会将新的颜色值和已经存在的颜色值进行组合,得出融合后的颜色值,比如,老的颜色是红色,新的是50%透明的黑色,那么融合之后的颜色看起来就应该是暗红色;
5.抖动(Dithering)
这一步是为了解决可使用的颜色过少会出现色带的问题,通过较少的颜色来模拟较多颜色的技术,可以查看这篇文章来理解;
帧缓存
数据经过整个渲染管线处理之后,最终会写入到帧缓存中,帧缓存存储了最终会显示到屏幕上的颜色数据。
帧缓存包含了 3 个具体的缓存:
1.颜色缓存
存储每个像素点的具体颜色值的缓存,常见的具体格式可以分为:
- 16位:RGB565,红色5位,绿色6位,蓝色5位,不保存透明通道(之所以绿色多1位是因为人眼对绿色更加敏感);
- 24位:RGB888,红色8位,绿色8位,蓝色8位,不保存透明通道;
- 32位:RGBA8888,红色8位,绿色8位,蓝色8位,透明通道8位;
2.Z-缓存(深度缓存)
存储每个像素点的深度,用来决定是丢弃当前像素颜色还是保留,假设,新渲染的颜色在旧颜色的前面,那么就覆盖旧颜色,如果新颜色在旧颜色的后面(被遮挡了)则保留旧颜色。
3.模板缓存
用来控制颜色缓存某个位置的写入操作,常用来处理阴影。
WebGL学习笔记(一):理解基本概念和渲染管线的更多相关文章
- .NET Remoting学习笔记(一)概念
目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 背景 自接触编程以来,一直听过这个名词Remotin ...
- WebGL学习笔记(2)
根据上一篇学习笔记,理解WebGL的工作原理及基本调用代码后,可以开始研究3D顶点对象的缩放.旋转.以及对对象进行可交互(鼠标或键盘控制)的旋转或者缩放. 要理解对象的旋转/缩放需要首先学习矩阵的计算 ...
- 【转载】.NET Remoting学习笔记(一)概念
目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 背景 自接触编程以来,一直听过这个名词Remotin ...
- webgl学习笔记五-纹理
写在前面 建议先阅读下前面我的三篇文章. webgl学习笔记一-绘图单点 webgl学习笔记二-绘图多点 webgl学习笔记三-平移旋转缩放 术语 : 纹理 :图像 图形装配区域 :顶点着色器顶点坐标 ...
- webgl学习笔记四-动画
写在前面 建议先阅读下前面我的三篇文章. webgl学习笔记一-绘图单点 webgl学习笔记二-绘图多点 webgl学习笔记三-平移旋转缩放 下面我们将讲解下如何让一个正方形动起来~不断擦除和重绘 ...
- webgl学习笔记三-平移旋转缩放
写在前面 建议先阅读下前面我的两篇文章. webgl学习笔记一-绘图单点 webgl学习笔记二-绘图多点 平移 1.关键点说明 顶点着色器需要加上 uniform vec4 u_Translation ...
- webgl学习笔记二-绘图多点
写在前面 建议先看下第一篇webgl学习笔记一-绘图单点 第一篇文章,介绍了如何用webgl绘图一个点.接下来本文介绍的是如何绘制多个点.形成一个面. webgl提供了一种很方便的机制,即缓冲区对象, ...
- 微信小程序开发:学习笔记[7]——理解小程序的宿主环境
微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器
- WebGL学习笔记二——绘制基本图元
webGL的基本图元点.线.三角形 gl.drawArrays(mode, first,count) first,代表从第几个点开始绘制即顶点的起始位置 count,代表绘制的点的数量. mode,代 ...
- WEBGL学习笔记(七):实践练手1-飞行类小游戏之游戏控制
接上一节,游戏控制首先要解决的就是碰撞检测了 这里用到了学习笔记(三)射线检测的内容了 以鸟为射线原点,向前.上.下分别发射3个射线,射线的长度较短大概为10~30. 根据上一节场景的建设,我把y轴设 ...
随机推荐
- java继承 、方法重写、重写toString方法
1.Java的继承,关键词Extends package cn.mwf.oo; public class TextExtends { public static void main(String[] ...
- C++(四十五) — 类型转换(static_cast、dynamic_cast 、const_cast、reinterpreter_cast)
0.总结 (1)要转换的变量,转换前.转换后.转换后的结果. (2)一般情况下,避免进行类型转换. 1._static_cast(静态类型转换,int 转换为char) 格式:TYPE B = st ...
- 移动架构师第一站UML建模
回想一下自己的Android生涯已经经历过N多个年头了,基本都是在编写业务代码,都知道35岁程序员是一个坎,当然如果有能力能做到Android架构师的职位其生命周期也会较长,毕境不是人人都能轻易做到这 ...
- app开发-1
一.了解HBuilder HBuilder内封装了大量的书籍,极大方便了使用 官方文档: http://dev.dcloud.net.cn/mui/ui/ 关于布局: mhead 表头.mbody ...
- solr和ElasticSearch(ES)的区别?
Solr2004年诞生 ElasticSearch 2010年诞生 ES更新 ElasticSearch简介: ElasticSearch是一个实时的分布式的搜索引擎和分析引擎.它可以帮助你用前所未有 ...
- 通过iptables限制docker容器端口
如何限制docker暴露的对外访问端口 docker 会在iptables上加上自己的转发规则,如果直接在input链上限制端口是没有效果的.这就需要限制docker的转发链上的DOCKER表. # ...
- vue组件通信方式(多种方案)
一.Props传递数据 components |-Grandson1.vue //孙子1 |-Grandson2.vue //孙子2 |-Parent.vue //父亲 |-Grandson1.vue ...
- Java中String、LocalDateTime、LocalDate、Date互转
String 转LocalDate和LocalDateTime LocalDate startDate = LocalDate.parse("2019-12-05", DateTi ...
- vue cli4.0 快速搭建项目详解
搭建项目之前,请确认好你自己已经安装过node, npm, vue cli.没安装的可以参考下面的链接安装. 如何安装node? 安装好node默认已经安装好npm了,所以不用单独安装了. 如何安装v ...
- Problem F. Wiki with String
Problem F. Wiki with StringInput file: standard input Time limit: 1 secondOutput file: standard outp ...