WebGL入门教程2 - GPU基本概念和工作流水线(渲染管道)

techbrood 发表于 2016-05-25 19:44:13

标签: webgl, 渲染, canvas, 教程, pipeline

- +

教程1中,我们已经讲述了基础的3D图形知识,接下来我们了解具体的硬件结构、GPU基本概念。

计算机图形硬件结构

如前所述,WebGL能利用硬件加速来完成绘图,计算机硬件结构如下图所示:

WebGL直接基于GPU来绘制图像,GPU利用专有的图形内存/缓存来加速渲染,帧缓存包含颜色、透明度、深度和模版掩码属性。GPU把像素写入帧缓存,显示设备从缓存中进行光栅化扫描读取,为了保持读写同步,GPU使用了双缓存(前缓存和后缓存)以及垂直同步(vSync)技术,所谓vSync就是在光栅扫描结束时给GPU发出信号,使得GPU可以置换前后缓存。

WebGL渲染工作流水线

blob.png

工作流水线指的是WebGL程序的执行过程,如上图所示,主要分为4个步骤,第1步是顶点着色器的处理,主要是一组矩阵变换操作,用来把3D模型(顶点和原型)投影到Viewport上,输出是一个个多边形(比如三角形),第2步是光栅化,也就是把三角形连接区域按一定的粒度逐行转化成片段(fragement),我们可以把这些片段看做是3D空间的像素点,第3步是片段着色器的处理,为每个像素添加颜色,第4步把3D空间的片段合并输出为2D像素数组并显示在屏幕上。

顶点(Vertex)、图元(Primitives)、片段和像素

顶点不只是立体几何中的坐标点,它还包含颜色、纹理,以及表面法向量(通常是由表面向外)用来区分对象的正反面。表面法向量遵循右手规则(或逆时针旋转)。

图元(或原始对象)是一组最简单的图形元素,如点、线段和若干点的闭合连接,下面是常用的原型:

blob.png

我们在后续文章中的例子中就将使用GL_TRIANGLE_STRIP来创建一个简单的矩形。

像素是二维空间数据,坐标为(x,y),然后还有颜色,用于在物理屏幕上显示。

片段是三维空间的数据,坐标为(x,y,z),x/y和2D像素相同,z表示颜色深度,合成时需要处理前后遮挡关系以及透明度的处理。除此之外,片段是顶点光栅化而来,其还包含和Vertex对象相同的属性,比如纹理。

顶点着色器的变换操作

现代GPU中,顶点处理和片段处理都是可编程的,称之为着色器(Shader)。顶点处理包括如下变换:

  1. 放置对象在3D空间中,也就是模型变换(Model Transformation)

  2. 设定相机的位置和观察方向,称之为视图变换或取景变换(View transformation)

  3. 选择相机镜头(广角,正常或可伸缩的),调整焦距和缩放系数来设定相机的视觉空间(实际就是调整视锥体范围内的某个投影截面的位置),称之为投影变换(Projection transformation),投影方式有两种:正交投影和远景投影,其中常用的是远景投影,即模拟人眼来观察真实世界中的对象,正交投影可以理解为把观察点拉到足够远,此时视觉空间将逼近为平行的长方体而不再是一个视椎体。

  4. 把相片打印到选定纸面区域,称之为视窗变换(Viewport transformation),这一步是在光栅化的时候执行的,注意Viewport实际对应于屏幕Web应用程序的窗口,其坐标原点是在左上角,y轴的方向向下。

我们这里主要讲解概念,不列出实际的变换矩阵和公式,想了解细节的请参考计算机图形学教程相关章节。

接下来的教程中我们将说明如何具体编写WebGL的应用程序。

possitive(31) views28321 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章
  • Monaco Editor 编辑器拷贝粘贴功能调用和获取选中文本

    有时候需要在monaco editor外部调用编辑器的内置功能比如希望在页面主工具栏实现一些快捷操作。button

  • 踏得网精选2016年度10大最佳HTML5动画

    踏得网精选2016年度最酷最新的HTML5动画集,评选标准为:创意新颖度+实现技术难度+趣味程度。使用一些在线H5生成工具的作品,因其主要使用图片和CSS3套路动画,...

  • 如何使用BabylonJS加载OBJ或STL模型

    BabylonJS(也就是babylon.js,这是一个和three.js类似的WebGL开发框架),更多的用在游戏领域。
    本文说明和演示如何使用babylon.js来加载一个标准3d模型文...

  • CSS3属性选择器特性使用详解

    CSS3除了引入动画、滤镜(用于特效)以及新的布局技术外,在选择器(selector)方面也有增强。属性选择器根据元素的属性(attributes)来匹配。这可以是一个单独...

  • CSS3原生变量(Native Variables)新特性简介

    对Web开发者来说,一个盼望已久的特性是CSS终于支持原生变量了!
    变量是程序语言中用来解决代码重复和进行表达式计算的关键概念(想想数学方程式中的x)。...

  • 深入理解JS和CSS3动画性能问题和技术选择

    本文对比了JS及其框架和CSS3的动画性能,并深入剖析了其内在原因。技术结论大致如下:1. jQuery出于设计原因,在动画性能上表现最差2. CSS3由于把动画逻辑推给了...

  • 使用HTML5 FileReader和Canvas压缩用户上传的图片

    手机用户拍的照片通常会有2M以上,这对服务器带宽产生较大压力。因此在某些应用下(对图片要求不那么高)我们可以在客户端来压缩图片,然后再提交给服务器。总体...

  • HTTP1.1协议现状、问题和解决方案

    HTTP的现状最早的HTTP协议非常简单,只能用来传送文本,方法也只有GET,后来逐步发展到1.1,能够支持多种MIME格式数据(如文本、文件),支持GET,POST,HEAD,OPTI...

  • 深入理解Three.js(WebGL)贴图(纹理映射)和UV映射

    本文将详细描述如何使用Three.js给3D对象添加贴图(Texture Map,也译作纹理映射,“贴图”的翻译要更直观,而“纹理映射”更准确。)。为了能够查看在线演示效...

  • Three.js 对象局部坐标转换为世界坐标

    在Three.js中进行顶点几何计算时,一个需要注意的地方是,需要统一坐标系。比如你通过Three.js提供的API创建了一个球体网孔对象,那么默认情况下,各网孔顶点的...

  • 如何使用Three.js加载obj和mtl文件

    OBJ和MTL是3D模型的几何模型文件和材料文件。在最新的three.js版本(r78)中,以前的OBJMTLLoader类已废弃。现在要加载OBJ和MTL文件,需要结合OBJLoader和MTLLoade...

  • 使用top/left/margin和CSS3 translate两种方法实现标题居中的性能差异详解

    要实现标题全屏居中(同时在垂直和水平方向居中),有若干种方法,包括使用弹性布局、表格单元、绝对定位、自动外边距和CSS3平移变换等。你可能已经使用了这些方...

  • 如何使用纯CSS3实现一个3D泡沫

    要实现一个逼真的泡沫,涉及到比较复杂的光学/物理学知识。我们这里先简化下问题,实现一个相对简单而足够实用的泡沫元素。我们可以把基础的泡沫元素应用在很多场景中,比如水景、泡咖啡、啤酒甚至火焰特效中。泡沫首先是一个圆形元素.bubble

  • 更多...