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轴设 ...
随机推荐
- C 是什么样的语言?
学习交流可加 微信读者交流①群 (添加微信:coderAllen) 程序员技术QQ交流①群:736386324 --- ==C 是什么样的语言?== 这个问题不要急于寻找问题的答案,而是应该先去考虑当 ...
- 二进制搭建Kubernetes集群(最新v1.16.0版本)
目录 1.生产环境k8s平台架构 2.官方提供三种部署方式 3.服务器规划 4.系统初始化 5.Etcd集群部署 5.1.安装cfssl工具 5.2.生成etcd证书 5.2.1 创建用来生成 CA ...
- APT 信息收集——shodan.io ,fofa.so、 MX 及 邮件。mx记录查询。censys.io查询子域名。
信息收集 目标是某特殊机构,外网结构简单,防护严密.经探测发现其多个子机构由一家网站建设公司建设. 对子域名进行挖掘,确定目标ip分布范围及主要出口ip. 很多网站主站的访问量会比较大.往往主站都是挂 ...
- Linux系统文件/etc/fstab
挂载可以使用命令或者修改系统文件两种方式,第一种方式使用mount命令挂载文件系统可以立即生效并使用,但计算机重启后无效.另一种方式需要修改系统文件/etc/fstab,这种方式挂载的文件系统在计算机 ...
- 使用 Word 写作论文时设置格式技巧记录
这里主要记录使用 Word 2013 版本的 Microsoft office Word 软件进行论文书写时的一些常用的格式设置技巧,以供分享与记录. Word文档页脚添加页码 Word设置多级标题格 ...
- nginx和ftp搭建图片服务器
一.需要的组件 图片服务器两个服务: Nginx(图片访问): 1.http服务:可以使用nginx做静态资源服务器.也可以使用apache.推荐使用nginx,效率更高. 2.反向代理 实现 负载均 ...
- 【Spring】如何配置多个applicationContext.xml文件
在web.xml中通过contextConfigLocation配置spring 开发Java Web程序,使用ssh架构时,默认情况下,Spring的配置文件applicationContext.x ...
- gulp-htmlmin 页面压缩插件 gulp插件 参数说明
gulpfile.js var gulp = require('gulp'), htmlmin = require('gulp-htmlmin'); gulp.task('testHtmlmin', ...
- java将图片输出base64位码显示
注意需要过滤:\r \n数据 jkd1.7的 import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; /** * 网络图片转换Base ...
- 推荐一款分布式微服务框架 Surging
surging surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希,随机,轮询,压力最小优先作为 ...