WebGL 渲染管线
WebGL 是以 OpenGL ES 2.0 为基础的 3D 编程应用接口。
WebGL依赖GPU的图形渲染能力,即依赖硬件设备,所以其渲染流程和GPU内部的渲染管线是相符的。渲染管线的作用是将3D模型转换为2维图像。
渲染管线(图形流水线)
渲染管线是指将数据从3D场景转换成2D图像,最终在屏幕上显示出来的总过程。它分为几个阶段:应用阶段、几何阶段和光栅阶段。
顶点着色器
顶点着色器一般用来对模型的顶点进行矩阵变换,一般就是将模型的所有顶点乘于一个变换矩阵,使该模型位于相对于WebGL坐标系中的某个位置。
顶点着色器是可编程的,使用的语言是 GLSL 来进行编写,下面我们主要说一下几种常用的属性类型:
- attribute变量:用户自定义变量,一般是存储顶点属性的变量;
- uniform变量:恒值变量,一般表示每个顶点都一致的变量,比如变换矩阵、光照等;
- varying变量:易变变量,将顶点着色器的数据传递给片元着色器时使用;
- 内置常量:WebGL 内部的常量;
图元装配
GPU会将我们传入的顶点装配成三角形、线段或者点;装配好之后,会自动截去不在可视区域内的信息;
裁剪
把坐标全在区间内的图元(或者图元的部分)抛弃掉
光栅化
GPU会将装配好的三角形转换成对应的像素,并将这些像素传入下一个阶段;
片元着色器
得到光栅化的片段像素位置数据之后,就可以通过片段着色器为这些像素进行上色了,这是第二个可以编程的地方;
我们可以对图片进行采样之后,再这里进行上色;
逐片元挑选
本步骤包含了多个子操作,每个操作都会影响当前片段最终的显示效果,下面我们看下几个常见的子操作:
1.裁剪测试
会有一个裁剪的范围,如果像素位于该范围之外,会被剔除,不会到达绘制缓存;
2.多重采样片段操作
这一步会修改像素的alpha值和覆盖值,主要用来实现抗锯齿的效果;
3.背面剔除
剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施,比如一个立方体,你不会看到背离你的那一面(总是只有一面在你的前方),因此我们不需要绘制出背面;
4.alpha测试
指的是将一个像素点的alpha值和一个固定值比较,如果比较的结果失败,像素将不会被写到显示输出中;
5.模板测试
模板缓存与颜色缓存的大小一致,模板缓存中的像素点与后台缓存的像素点是一一对应的。
模板缓存允许我们动态地、有针对性地决定是否将某个像素写入后台缓存中。模板缓存用与获得某种特效,如镜面效果或阴影效果。在实现镜面效果时,我们在“镜子”这块区域中绘制某个特定物体的映像,而使用模板缓存来阻止物体映像在“非镜子”的区域中进行绘制;
为了进行这种阻止,就需要使用模板测试。判断是否将某个像素写入后台缓存的决策过程,称为模板测试;
6.alpha融合
融合技术能使我们将当前要进行的光栅化的像素的颜色与先前已经光栅化并处于同一位置的像素的颜色进行合成,即将正在处理的图元颜色值与存储中后台缓存中的像素颜色值进行合成。利用该技术,我们可以获得各种各样的效果,尤其是透明效果。不过值得注意的是,为了场景中绘制透明物体,通常需要对物体按照由后到前的顺序进行混合处理,如果按照任意顺序进行处理将会产生严重的失真。所以在blending(混色)操作之前要来一次深度测试;
7.深度测试
这一步会进行深度测试,抛弃掉位置靠后的像素值,因为这个位置的像素本身就是被更前面的像素覆盖的;
8.融合
这一步会将新的颜色值和已经存在的颜色值进行组合,得出融合后的颜色值,比如,老的颜色是红色,新的是50%透明的黑色,那么融合之后的颜色看起来就应该是暗红色;
9.抖动(Dithering)
这一步是为了解决可使用的颜色过少会出现色带的问题,通过较少的颜色来模拟较多颜色的技术
WebGL 渲染管线的更多相关文章
- 一篇文章理清WebGL绘制流程
转自:https://www.jianshu.com/p/e3d8a244f3d9 目录 初始化WebGL环境 顶点着色器(Vertex Shader)与片元着色器(Fragment Shader) ...
- 初级入门 --- 认识 WebGL
WebGL 是什么? WebGL 是一组基于 JavaScript 语言的图形规范,浏览器厂商按照这组规范进行实现,为 Web 开发者提供一套3D图形相关的 API. 这些 API 能够让 Web 开 ...
- 学废了系列 - WebGIS vs WebGL图形编程
目前工作中有不少涉及到地图的项目,我参加了几次技术评审,前端伙伴们在 WebGIS 方面的知识储备稍有不足,这次分享的主要目的是科普一些在前端领域比较常用的 WebGIS 知识.另外,我之前的工作中积 ...
- 学废了系列 - WebGL与Node.js中的Buffer
WebGL 和 Node.js 中都有 Buffer 的使用,简单对比记录一下两个完全不相干的领域中 Buffer 异同,加强记忆. Buffer 是用来存储二进制数据的「缓冲区」,其本身的定义和用途 ...
- LayaAir引擎——(一)
LayaAir是LayaBox推出的Html5游戏引擎,支持 ActionScript3.TypeScript.JavaScript,开源,并且商用免费. LayaAir IDE 是一款使用Lay ...
- WebGL学习笔记(一):理解基本概念和渲染管线
WebGL 是以 OpenGL ES 2.0 为基础的 3D 编程应用接口. 渲染管线(图形流水线) 渲染管线是指将数据从3D场景转换成2D图像,最终在屏幕上显示出来的总过程.它分为几个阶段:应用阶段 ...
- Web3D编程入门总结——WebGL与Three.js基础介绍
/*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...
- 分享我收集的引擎、图形学、WebGL方面的电子资料
本文分享我这一年以来收集的我认为比较经典的电子资料,希望能对大家有所帮助! 本文会不断更新! 目录 WebGL Insights OpenGL Insights Game Programming Pa ...
- CSGrandeur的WebGL学习——WebGL教程
在线查看:http://csgrandeur.gitbooks.io/webgl-learn/content/ 离线mobi:http://files.cnblogs.com/files/CSGran ...
随机推荐
- P1432
这个题是一个很简单的等比数列. 题目大意是:初始第一步 $ n_1 = 2 $,之后的每一步都比前一步减少 98%,即满足等比数列 $ 2 + 2 \times 0.98 + 2 \times 0.9 ...
- 如何在Windows中使用Eclipse访问虚拟机Linux系统中的hadoop(伪分布式)
因为计算机配置过低,在虚拟机里几乎无法使用Eclipse,效率极低! 所以现在尝试使用Windows下Eclipse操作虚拟机中Hadoop,步骤如下: 开发环境:Hadoop2.7.1,Ubuntu ...
- [Thiinking in Java]自闭学习之路(一)构造器
前言- 本文是为个人学习做的整理性质的笔记,肯定带有许多不妥的地方,仅供参考. (第五章·初始化与清理 <Thinking in Java>) 用构造器确保初始化 正文- 构造器: 什么是 ...
- SQL 游标介绍及使用
游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理. 游标是处理 ...
- win10 下安装 tesseract + tesserocr
首先参考博文一贴:https://blog.csdn.net/u014179267/article/details/80908790 1.那么安装这两个模块是为了爬虫的时候识别验证码用的,但是安装的过 ...
- ETCD的常用命令
Note that any key that was created using the v2 API will not be able to be queried via the v3 API. A ...
- git合并分支到master上面
转自:https://www.cnblogs.com/mafeng/p/10173919.html 假如我们现在在dev分支上,刚开发完项目,执行了下列命令 git add .git commit - ...
- BOSS标准版-电话收费结账明细费用sql语句
明细费用页面-所在jsp路径-:/EtcomWeb_BZvx/WebRoot/hfys/manage/telCharge/detailInfo.jsp exec Hfys_Sp_CaculCharge ...
- 【原】Mysql最大连接数
MySQL最大连接数的默认值是100, 这个数值对于并发连接很多的数据库的应用是远不够用的,当连接请求大于默认连接数后,就会出现无法连接数据库的错误,因此我们需要把它适当调大一些. 在使用MySQL数 ...
- Python学习第二十五课——Mysql (多表查询)
多表查询: 内连接查询: 首先:创建两个表一个为tableA,一个为tableB,并且插入数据(代码省略) 同时查询两个表的记录: select * from tableA,tableB; 根据tab ...