2.4 图形硬件

文章内容源自《GPU编程与CG语言之阳春白雪下里巴人》,因笔者读书易中途放弃,遂每读一章节,将其移至简书平台,以此作为对自己读书的勉励。笔者用粗体斜体 标注了关键词句,望感兴趣的读者们一起学习共勉。猛戳这里查看更多!

2.4 图形硬件

这一节中主要阐述图形硬件的相关知识,主要包括 GPU 中数据的存放硬件, 以及各类缓冲区的具体含义和用途,如:z buffer(深度缓冲区)、stencil buffer (模板缓冲区)、frame buffer(帧缓冲区)和 color buffer(颜色缓冲区)

2.4.1 GPU 内存架构

寄存器和内存有什么区别?

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

图 6 GPU 存储架构

2.4.2 Z Buffer 与 Z 值

Z buffer 应该是广大家为熟悉的缓冲区类型,又称为 depth buffer,即深度缓冲区,其中存放的是视点到每个像素所对应的空间点的距离衡量,称之为 Z 值 或者深度值。可见物体的 Z 值范围位于【0,1】区间,默认情况下,接近眼睛的顶点(近裁减面上)其 Z 值为 0.0,离眼睛远的顶点(远裁减面上)其 Z 值为 1.0。使用 z buffer 可以用来判断空间点的遮挡关系,著名的深度缓冲区算法(depth-buffer method,又称 Z 缓冲区算法)就是对投影平面上每个像素所对应的 Z 值进行比较的。

Z 值并非真正的笛卡儿空间坐标系中的欧几里德距离(Euclidean distance), 而是一种“顶点到视点距离”的相对度量。所谓相对度量,即这个值保留了与其他 同类型值的相对大小关系。在 steve Baker 撰写的文章“Learning to love your Z-buffer”中将 GPU 对 Z 值的计算公式描述为:

其中 f 表示视点到远裁减面的空间距离,n 表示视点到近裁减面的空间距离,z 表示视点到顶点的空间距离,N 表示 Z 值精度。

大多数人所忽略的是,z buffer 中存放的 z 值不一定是线性变化的。在正投影中同一图元相邻像素的 Z 值是线性关系的,但在透视投影中却不是的。在透视投影中这种关系是非线性的,而且非线性的程度随着空间点到视点的距离增加而越发明显。

当 3D 图形处理器将基础图元(点、线、面)渲染到屏幕上时,需要以逐行扫描的方式进行光栅化。图元顶点位置信息是在应用程序中指定的(顶点模型坐标),然后通过一系列的过程变换到屏幕空间,但是图元内部点的屏幕坐标必须由已知的顶点信息插值而来。例如,当画三角形的一条扫描线时,扫描线上的每个像素的信息,是对扫描线左右端点处已知信息值进行插值运算得到的,所以内部点的 Z 值也是插值计算得到的。同一图元相邻像素点是线性关系(像素点是均分布的,所以一定是线性关系),但对应到空间线段上则存在非线性的情况,如图 7所示。所示:线段 AE 是某三角面片的两个顶点,投影到屏幕空间对应到像素 1 和像素 5;光栅化时,需要对像素 2、3、4 进行属性插值,从视点引射线到空间线段上的交点分别为 B、C、D。从图中可以看出,点 B、C、D 并不是均分布在空间线段上的,而且如果离视点越远,这种差异就越发突出。即,投影面上相等的步长,在空间中对应的步长会随着离视点距离的增加而变长。所以如果对内部像素点的 Z 值进行线性插值,得到的 Z 值并不能反应真实的空间点的深度关系。Z 值的不准确,会导致物体显示顺序的错乱,例如,在游戏中常会看到远处的一些面片相互交叠。

为了避免或减轻上述的情况,在设置视点相机远裁减面和近裁减面时,两者的比值应尽量小于 1000。要想解决这个问题,简单的方法是通过将近截面远离眼睛来降低比值,不过这种方法的副作用时可能会将眼前的物体裁减掉。

图 7 Z 值的非线性关系

很多图形硬件使用 16 位的 Z buffer,另外的一些使用 24 位的 Z buffer,还有一些很好的图形硬件使用 32 位的。如果你拥有 32 位的 Z buffer,则 Z 精度 (Z-precision)对你不是一个问题。但是如果你希望你的程序可以灵活的使用各种层次的图形硬件,那么你就需要多思考一下。Z 精度之所以重要,是因为 Z 值决定了物体之间的相互遮挡关系,如果没有足够的精度,则两个相距很近的物体将会出现随机遮挡的现象,这种现象通常称 为“flimmering”或“Z-fighting

2.4.3 Stencil Buffer

A stencil buffer is an extra buffer, in addition to the color buffer and depth buffer found on modern computer graphics hardware. The buffer is per pixel, and works on integer values, usually with a depth of one byte per pixel. The depth buffer and stencil buffer often share the same area in the RAM of the graphics hardware.

Stencil buffer,中文翻译为“模板缓冲区”,它是一个额外的 buffer,通常附加到 z buffer 中 ,例如:15 位的 z buffer 加上 1 位的 stencil buffer(总共 2 个字节);或者 24 位的 z buffer 加上 8 位的 stencil buffer(总共 4 个字节)。每个像素对应一个 stencil buffer (其实就是对应一个 Z buffer)。 Z buffer 和 stencil buffer 通常在显存中共享同一片区域。Stencil buffer 对大部分人而言应该比较陌生,这是一个用来“做记号”的 buffer,例如:在一个像素的 stencil buffer 中存放 1,表示该像素对应的空间点处于阴影体(shadow volume)中。

2.4.4 Frame Buffer

A framebuffer is a video output device that drives a video display from a memory buffer containing a complete frame of data. The information in the buffer typically consists of color values for every pixel on the screen. Color values are commonly stored in 1-bit monochrome, 4-bit palettized, 8-bit palettized, 16-bit highcolor and 24-bit truecolor formats. An additional alpha channel is sometimes used to retain information about pixel transparency. The total amount of the memory required to drive the framebuffer depends on the resolution of the output signal, and on the color depth and palette size.

Frame buffer,称为帧缓冲器用于存放显示输出的数据,这个 buffer 中的数据一般是像素颜色值。Frame buffer 有时也被认为是 color buffer(颜色缓冲器) 和 z buffer 的组合(《实时计算机图形学(第二版)》12 页)。那么 frame buffer 位于什么地方呢?在 webMediaBrands 网站上摘录了一段英文说明,即 frame buffer 通常都在显卡上,但是有时显卡会集成到主板上,所以这种情况下 frame buffer 被放在内存区域(general main memory)。

Frame buffer: The portion of memory reserved for holding the complete bit-mapped image that is sent to the monitor. Typically the frame buffer is stored in the memory chips on the video adapter. In some instances, however, the video chipset is integrated into the motherboard design, and the frame buffer is stored in general main memory

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 3.1 Shader Language 原理第 3 章 Shader Language

    In the last year I have never had to write a single HLSL/GLSL shader. Bottom lin...

    代码咖啡
  • 4.3 CG 编译

    计算机只能理解和执行由 0、1 序列(电压序列)构成的机器语言,所以汇编语言和高级语言程序都需要进行翻译才能被计算机所理解,担负这一任务的程序称为语言处理程序,...

    代码咖啡
  • Android如何将一个项目作为library导入另一个项目

    当我第一次被要求用这样的方法将一个项目当做library导入另一个项目时,其实我是拒绝的,因为,你不能让我导,我就马上导,第一我要试一下,因为我不愿意导入完成后...

    代码咖啡
  • 如何在windows下和linux下获取文件(如exe文件)的详细信息和属性

    最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需...

    业余草
  • 8个绝招,教你快速打造作品的全栈设计感

    1、色彩舒适度 ? 我们都说“一见钟情”,人眼首先看到的,是事物的颜色,其次才是形状。所以,“色彩舒适度”决定了作品是否能在第一时间吸引用户,我们需要避免: ·...

    BestSDK
  • 在windows下模拟鼠标键盘输入的几种方法 (附带源代码)

        最近小叮咚使用的服务器(第3方的asp服务器,不是iis)在启动后总是不能自动运行,可能里面有Bug,需要点击启动按钮后才能连接到internet上. ...

    田春峰-JCJC错别字检测
  • 从零开始学推荐系统二:隐语义模型

    隐语义模型又可称为LFM(latent factor model),它从诞生到今天产生了很多著名的模型和方法,其中和该技术相关且耳熟能详的名词有pLSA、 LD...

    Bo_hemian
  • 数据结构基础温故-5.图(下):最短路径

    图的最重要的应用之一就是在交通运输和通信网络中寻找最短路径。例如在交通网络中经常会遇到这样的问题:两地之间是否有公路可通;在有多条公路可通的情况下,哪一条路径是...

    Edison Zhou
  • 粉丝营销平台:贴吧来了

    05年超女热中诞生的"粉丝"一词在这两年被企业用得淋漓尽致。以小米为代表的粉丝经济快速普及,正在被越来越多的企业所效仿。说到粉丝营销平台人们第一个想到的是新浪...

    罗超频道
  • C++基础-继承

    本文为 C++ 学习笔记,参考《Sams Teach Yourself C++ in One Hour a Day》第 8 版、《C++ Primer》第 5 ...

    用户4940323

扫码关注云+社区

领取腾讯云代金券