第二章:图形渲染管线(The Graphics Rendering Pipeline)总结

Real-Time Rendering 4th Edition 读书笔记-Chapter 2:The Graphics Rendering Pipeline

      • 概述
      • 基础架构
      • 各阶段总结
        • 应用阶段(The Application Stage)
        • 几何处理阶段(Geometry Processing)
          • 顶点着色阶段(Vertex Shading)
          • 投影阶段(Projection)
          • 可选的顶点处理阶段
          • 裁剪阶段(Clipping)
          • 屏幕映射(Screen Mapping)
        • 光栅化(Rasterization)
          • 三角形设置(Triangle Setup)
          • 三角形遍历(Triangle Traversal)
        • 像素处理阶段(Pixel Processing)
          • 像素着色阶段(Pixel Shading)
          • 合并阶段(Merging)

概述

图形渲染管线(the pipeline)是实时计算机图形学(real-time graphics)的核心部分。在图形渲染管线中,几何图元和光照一起被处理之后,通过虚拟摄像机呈现到我们眼前。第二章聚焦整个管线的功能部分(不涉及实现),依次介绍了管线各个阶段是用来做什么的。

基础架构

  • 计算机为什么选择管线的方式处理图形呢?
    答案是:效率更高。解释如下(参考了《Unity Shader入门精要》的说法),如图:
    第二章:图形渲染管线(The Graphics Rendering Pipeline)总结_第1张图片
    在这张图上,我们很清晰地看到,使用了流水线的工程效率是未使用流水线的工程的n倍!

    对于一条流水线而言,所用时间最长的阶段称为这条流水线的瓶颈(bottleneck)

    衡量一条渲染管线渲染速度的指标是每秒钟帧率(FPS,frames per second),当然,也可以用Hz来表示。

  • 一条图形渲染管线架构示例图如下:第二章:图形渲染管线(The Graphics Rendering Pipeline)总结_第2张图片
    对于其中每个阶段,在自己内部又是一条独立的管线。

    • 在应用阶段(Application Stage),系统应用作为CPU上的软件对渲染项目作最初步的处理。凭借着CPU多核多线程的特性,所以像是碰撞检测、全局加速算法、动画系统和物理仿真等复杂计算全都交给CPU去处理,这样能大大加快渲染速度。
    • 在几何处理阶段(Geometry Processing Stage),确定绘制的几何图元、绘制方式和绘制位置。几何处理阶段运行在GPU(Graphics Processing Unit)上
    • 光栅化阶段(Rasterization)使用上一阶段提供的几何数据,在屏幕上设置对应像素,然后将这些像素传到下一阶段。这个阶段也是在GPU上执行。
    • 像素处理阶段(Pixel Processing Stage)逐像素地确定像素颜色,进行深度测试、可见性测试、颜色混合等操作。同样地,这个阶段也是GPU执行的。

各阶段总结

应用阶段(The Application Stage)

用户完全可以控制应用阶段的执行,因为这个阶段是执行在CPU上软件层实现的。应用层对于后序阶段也有一定的指导意义,因为用户可以在应用层配置后序阶段的某些行为。当然,应用阶段的一些工作也可以在GPU上执行,这种类型的操作可以通过一种叫做computer shader的着色器实现,在这种情况下,相当于是将GPU看做是一个高度并行化的通用处理器。
应用阶段最最重要的功能是:将几何处理阶段需要渲染的几何体成功地传递出去,这些几何体称为渲染图元(rendering primitives)。

为了提高处理性能,应用阶段在CPU的多个核心上并行处理,这种特性称为超标量体系结构(superscalar)

几何处理阶段(Geometry Processing)

GPU在几何处理阶段对几何图元进行逐三角形和逐顶点操作。

  • 几何处理阶段内部管线架构如下:第二章:图形渲染管线(The Graphics Rendering Pipeline)总结_第3张图片
顶点着色阶段(Vertex Shading)

顶点着色器最基本的功能是计算顶点位置,这个功能主要是通过依赖各种矩阵进行一系列空间变化而实现的。其次,它也可以计算任何用户感兴趣的顶点输出信息,例如法线和纹理坐标。
对于定点着色器而言,在顶点着色阶段,着色器根据光照和法线信息逐顶点计算光照,其中最著名的模型是Gouraud模型(具体实现可参考3D游戏与计算机图形学中的数学方法读书笔记–第七章–光照部分和Unity基础光照shader总结这两篇文章)。顶点光照信息之后会经过插值运算自动生成逐像素光照信息。
在现代GPU出现之后,顶点着色阶段通常不进行光照计算,只是为后序逐像素光照计算提供插值参数,或者只是单纯计算与顶点有关的数据信息。
在顶点位置生成过程中,模型顶点首先从模型空间通过模型变换转化到世界坐标系下的表示,再通过视图变换转化到视点坐标系中(注意z轴变化),此时顶点着色阶段的位置变换就完成了(在Unity Shader中使用的是矩阵MVP),如图:第二章:图形渲染管线(The Graphics Rendering Pipeline)总结_第4张图片

投影阶段(Projection)

投影分为透视投影(perspective)和正交投影(orthographic)两种,如下图所示,两种投影方式的视域体完全不同。但是为了后序裁剪阶段的统一性,需要把两种不同的视域体转化为一个单位立方体,称为CVV(canonical view volume)。实现投影的方式是进行投影变换,将坐标从视点空间转换到裁剪空间,同时也会把三维坐标转化为四维齐次坐标,供后续裁剪使用。

第二章:图形渲染管线(The Graphics Rendering Pipeline)总结_第5张图片

可选的顶点处理阶段

当先前的阶段结束后,有三个可选阶段:曲面细分阶段(tessellation),几何着色阶段(Geometry Shading)和流输出阶段(stream output)。

裁剪阶段(Clipping)

那些不完全落在视域体内的图元会被裁剪,那些完全落在视域体内的图元不进行任何操作,其余图元被舍弃。
通常而言,裁剪判定是通过CVV的六个面来执行的(透视投影裁剪过程中应该是与坐标w分量对比的,因为投影变换乘以投影矩阵之后的视域体并不是单位立方体,除非直接进行透视除法,所以我觉得这里的unit cube(指的是CVV)应该是不够准确的,否则前后矛盾。但不排除先透视除法再裁剪的情况,但这种情况w分量岂不是丢失了?这个问题尚未解决),如图所示 ,但是我们也可以自定裁减面。
第二章:图形渲染管线(The Graphics Rendering Pipeline)总结_第6张图片
对于变换后的其次坐标而言,坐标的w分量可以保证正确的透视校正插值和裁剪操作。
裁剪操作结束之后,进行透视除法(perspective division)操作,将其次坐标转化到归一化设备坐标(normalized device coordinates)下,进行透视除法之后,视域体才成为真正的CVV(坐标点为(-1,-1,-1)到(1,1,1))。

屏幕映射(Screen Mapping)

上一个阶段通过透视除法之后,得到的结果是三维坐标。这个三维坐标的x,y变换为屏幕坐标(screen coordinates),屏幕坐标和深度坐标z也称为窗口坐标(window coordinates),如图。

注意,不同的底层图形接口对应窗口坐标规范不同,如:DirectX和OpenGL。

第二章:图形渲染管线(The Graphics Rendering Pipeline)总结_第7张图片

光栅化(Rasterization)

注意:对于像素而言,像素坐标是离散的,中心点总是0.5,两边为整数。

光栅化阶段也称为扫描转化(scan conversion),主要任务是寻找图元覆盖的屏幕像素点,为下一个像素阶段提供像素信息。
光栅化分为两个子阶段:三角形设置阶段和三角形遍历阶段,如图所示。
第二章:图形渲染管线(The Graphics Rendering Pipeline)总结_第8张图片
顶点插值计算也是在这个阶段完成的。

三角形设置(Triangle Setup)

计算一系列三角形数据,例如:微分、边方程等,这些数据用于接下来的插值计算。这个阶段是在固定管线硬件上执行的。

三角形遍历(Triangle Traversal)

三角形遍历阶段的主要任务是寻找那些像素在三角形内部。在三角形内部的像素被称作片元(fragment),这个阶段会进行插值运算,将每个片元的详细数据运算出来。在采样过程中,会用到透视校正插值技术(perspective-correct interpolation)

像素处理阶段(Pixel Processing)

像素着色阶段(Pixel Shading)

第二章:图形渲染管线(The Graphics Rendering Pipeline)总结_第9张图片

合并阶段(Merging)

合并阶段是图形渲染管线的最后阶段。在这个阶段中,执行混合、实现双缓存、透明度测试、深度测试和模板测试。最终形成屏幕图像。

你可能感兴趣的:(RTR,4th)