GPU 图形绘制管线

参考自 《GPU 编程与CG 语言之阳春白雪下里巴人》


图形绘制管线描述 GPU 渲染流程,即"给定视点、三维物体、光源、照明模式和纹理等元素,如何绘制一幅二维图像"。

在《实时计算机图形学》一书中,将图形绘制管线分为三个主要阶段:应用 程序阶段、几何阶段、光栅阶段。

应用程序阶段,使用高级编程语言(C、C++、JAVA 等)进行开发,主要和 CPU、内存打交道,诸如碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等 经典算法都在此阶段执行。在该阶段的末端,几何体数据(顶点坐标。法向量、纹理坐标、纹理等)通过数据总线传送到图形硬件(时间瓶颈);数据总线是一个可以共享的通道,用于在多个设备之间传送数据;端口在两个设备之间传送数据的通道;带宽用来描述端口或者总线上的吞吐量,可以用每秒字节(b/s) 来度量,数据总线和端口(如加速图形端口,Accelerated Graphic Port,AGP)将 不同的功能模块“粘接”在一起。由于端口和数据总线均具有数据传输能力,因此 通常也将端口认为是数据总线。

几何阶段,主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,该阶段基于GPU进行运算,在该阶段的末端得到了经过 变换和投影之后的顶点坐标、颜色、以及纹理坐标。

光栅阶段,基于几何阶段的输出数据,为像素(Pixel)正确配色,以便绘制 完整图像,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲 器( color buffer 或者 frame buffer )中。

1.几何阶段

几何阶段的主要工作是"是变换三维顶点坐标"和"光照计算"。

输入到计算机中的是一系列三维坐标点,但是我们最终需要看到的是,从视点出发观察到特定点(可以理解为,三维坐标点,要使之显示在二维的屏幕上)。一般情况下, CPU 帮我们自动完成了这个转换。基于 GPU 的顶点程序为开发人员提供了控制顶点坐标空间转换的方法。

根据顶点坐标转换的先后顺序,主要有如下几个坐标空间,或者说坐标类型: Object space,模型坐标空间; World space,世界坐标系空间;Eye space,观察坐标空间;Clip and Project space,屏幕坐标空间。

无论在现实世界,还是在计算机的虚拟空间中,物体都必须和一个 固定的坐标原点进行参照才能确定自己所在的位置。

每个人都是从各自的视点出发观察这个世界,无论是主观世界还是客观世 界。在计算机中每次只能从唯一的视角出发渲染物体。在游戏中,都会提供漫游的功能,屏幕显示的内容随着视点的变化而变化。这是因为 GPU 将物体顶点坐标从 world space 转换到了 eye space。

所谓 eye space ,即以 camera (视点或相机)为原点,由视线方向。视角和远近平面,共同组成一个梯形的三维空间,称之为 viewing frustum (视锥),如下图,

Paste_Image.png

一旦顶点坐标转换到 eye space 中,就需要判断哪些点是视点可见的。位于 viewing frustum (视锥)梯形体以内的顶点,被认定为可见,而超出这个梯形体之外的的场景数据,会被视点去除(Frustum Culling,也称之为视锥裁剪)。这一步通常称之为『 Clip(裁剪) 』,识别指定区域内或区域外的图形部分的过程称之为裁剪算法。

很多人在理解该步骤时存在一个混乱,即“不清楚裁减与投影的关系和两者 发生的先后顺序”,不少人觉得是“先裁减再投影”,不过事实并非如此。因为在不规则的体中进行裁剪并非易事,所以经过图形学前辈们的 精心分析,裁剪被安排到一个单位立方体中进行,该立方体的对角顶点分别是 (-1,-1,-1)和(1,1,1),通常称这个单位立方体为规范立方体(Canonical view volume, CVV)。

从视点坐标空间到屏幕坐标空间 (screen coordinate space)事实上是由三步组成:

1).用透视变换矩阵把顶点从视锥体中变换到裁剪空间的 CVV 中;

2).在 CVV 进行图元裁剪;

3).屏幕映射:将经过前述过程得到的坐标映射到屏幕坐标系上。

确定只有当图元完全或部分的存在于视锥内部时,才需要将其光栅化。当一个图元完全位于视体(此时视体以及变换 为 CVV )内部时,它可以直接进入下一个阶段;完全在视体外部的图元,将被剔除;对于部分位于视体内的图元进行图元进行裁剪处理。

裁减算法主要包括:视域剔除( View Frustum Culling )、背面剔除 ( Back-Face Culling )、遮挡剔除( Occlusing Culling )和视口裁减等。

2.光栅化阶段

光栅化:决定哪些像素被集合图元覆盖的过程( Rasterization is the process of determining the set of pixels covered by a geometric primitive )。

经过坐标转化之后,可以得到每个点的屏幕坐标值,但是存在两个问题:

问题一:点的屏幕坐标值是浮点数,但像素都是由整数点来表示的,如果确定屏幕坐标值做对应的像素?

问题二:在屏幕上需要绘制的有点、线、面,如何根据两个已经确定位置的 2 个像素点绘制一条线段,如果根据已经确定了位置的 3 个像素点绘制一个三角面片?

Pixel operation 又称为 Raster Operation ,是在更新帧缓存之前,执行最后一系列针对每个片段的操作,其目的是:计算出每个像素的颜色值。 Pixel operation 包含如下四个方面:

1). 消除遮挡面

2). Texture operation,纹理操作,也就是根据像素的纹理坐标,查询对应的纹理值;

3). Blending,混色,根据目前已经画好的颜色,与正在计算的颜色的透明度(Alpha),混合为两种颜色,作为新的颜色输出。

4). Filtering,将正在算的颜色经过某种 Filtering (滤波或者滤镜)后输出。 可以理解为:经过一种数学运算后变成新的颜色值。

GPU 内存架构

寄存器和内存的区别:

从物理结构而言,寄存器是 CPU 或 GPU 内部的存储单元,即寄存器是嵌在 CPU 或者 GPU 中的,而内存则可以独立存在;从功能上而言,寄存器是有限存储容量的高速存储部件,用来暂存指令、数据和地址。Shader 编程是基于计算机图形硬件的,这其中就包括 GPU 上的寄存器类型, glsl 和 hlsl 的着色器虚拟机版本就是基于 GPU 的寄存器和指令集而区分的。

Paste_Image.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏落影的专栏

OpenGL ES实践教程(四)VR全景视频播放

教程 OpenGL ES实践教程1-Demo01-AVPlayer OpenGL ES实践教程2-Demo02-摄像头采集数据和渲染 OpenGL ES实践...

4124
来自专栏北京马哥教育

Python数据挖掘:Kmeans聚类数据分析及Anaconda介绍

糖豆贴心提醒,本文阅读时间8分钟 今天我们来讲一个关于Kmeans聚类的数据分析案例,通过这个案例让大家简单了解大数据分析的基本流程,以及使用Python实现...

48113
来自专栏web前端教室

面对一个需求,我们怎么开始?

之前在作业区我出过一道题“用JS做一个抛物线下落的球”。这个题就是一个需求,内容是让你做一个抛物线下落的球。 我们把这个需求拆分一下,会发现它里面有以下几个内容...

1915
来自专栏我的技术专栏

浅谈 GPU图形固定渲染管线

图形渲染管道被认为是实时图形渲染的核心,简称为管道。管道的主要功能是由给定的虚拟摄像机、三维物体、灯源、光照模型、纹理贴图或其他来产生或渲染一个二维图像。由此可...

2398
来自专栏PPV课数据科学社区

ECharts又搞大动作!3.5 版本提供更多数据可视化图表

在 echarts 新发布的 3.5 版本中,新增了日历坐标系,增强了坐标轴指示器。同时,echarts 统计扩展 1.0 版本发布了。日历坐标系用于在日历中绘...

3806
来自专栏PPV课数据科学社区

【学习】SPSS探索分析实践操作

SPSS为我们提供了探索分析,所谓探索分析之所以是探索,是因为有时候我们对于变量的分布特点不是很清楚,探索的目的在于帮助我们完成以下的工作:识别...

3738
来自专栏数据小魔方

图表案例|纵向折线图

今天要跟大家分享的是纵向折线图! 本例中要展示的是纵向折线图的制作技巧! 在excel中折线图、散点图等图表类型是没有办法直接做成纵向的那种的(就像是柱形图和条...

3825
来自专栏人工智能头条

AI 可能真的要代替插画师了……

1373
来自专栏CSDN技术头条

AI 可能真的要代替插画师了……

事先声明,这篇文章的标题绝不是在耸人听闻。事情的起因是前段时间在朋友圈看到同学在转发一篇论文,名字叫《Create Anime Characters with ...

2068
来自专栏人工智能头条

手把手教你实战汉字书法识别

8254

扫码关注云+社区