前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GPU 图形绘制管线

GPU 图形绘制管线

作者头像
hrscy
发布2018-08-30 12:28:01
1.2K0
发布2018-08-30 12:28:01
举报
文章被收录于专栏:hrscyhrscy

参考自 《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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.05.09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考自 《GPU 编程与CG 语言之阳春白雪下里巴人》
  • 1.几何阶段
  • 2.光栅化阶段
  • GPU 内存架构
相关产品与服务
流计算 Oceanus
流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的企业级实时大数据分析平台,具备一站开发、无缝连接、亚秒延时、低廉成本、安全稳定等特点。流计算 Oceanus 以实现企业数据价值最大化为目标,加速企业实时化数字化的建设进程。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档