渲染管线 学习摘录

本博客为个人学习摘录,内容摘录自知乎:细说图形学渲染管线

概述

图形渲染管线是实时渲染的核心组件。渲染管线的功能是通过给定虚拟相机、3D场景物体以及光源等场景要素来产生或者渲染一幅2D的图像。

主要功能

  1. 将物体3D坐标转变为屏幕空间2D坐标

  2. 为屏幕每个像素点进行着色

一般流程

1.顶点数据的输入 (Vertex Data)

  顶点数据用来为后面的顶点着色器等阶段提供处理的数据。是渲染管线的数据主要来源。送入到渲染管线的数据包括顶点坐标、纹理坐标、顶点法线和顶点颜色等顶点属性
  为了让OpenGL明白顶点数据构成的是什么图元,我们需要在绘制指令中传递相对应的图元信息。常见的图元包括:点(GL_POINTS)、线(GL_LINES)、线条(GL_LINE_STRIP)、三角面(GL_TRIANGLES)。

2.顶点着色器 (Vertex Shader)

  顶点着色器主要功能是进行坐标变换。将输入的局部坐标变换到世界坐标、观察坐标和裁剪坐标
  虽然我们也会在顶点着色器进行光照计算(称作高洛德着色),然后经过光栅化插值得到各个片段的颜色,但由于这种方法得到的光照比较不自然,所以一般在片段着色器进行光照计算

3.曲面细分过程 [可选] (Tessellation Control Shader & Tessellation Evaluation Shader)

  曲面细分是利用镶嵌化处理技术对三角面进行细分,以此来增加物体表面的三角面数量,是渲染管线一个可选的阶段。
  它由外壳着色器(Hull Shader)、镶嵌器(Tessellator)和域着色器(Domain Shader)构成,其中外壳着色器和域着色器是可编程的,而镶嵌器是有硬件管理的。我们可以借助曲面细分的技术实现细节层次(LOD)的机制,根据与摄像机的距离来进行镶嵌,使得离摄像机越近的物体具有更加丰富的细节(第一个LOD通常称为LOD 0,代表最高程度的镶嵌),而远离摄像机的物体具有较少的细节,使得每个三角形的尺寸都小于1个像素。
Level of Detail

  镶嵌(tessellation) 是指把表面分割为一组离散多边形的过程,这些多边形通常是三角形或四边形。三角化(triangulation) 专指把表面镶嵌为三角形。
  游戏引擎会用使用动态镶嵌技术来处理可扩展网格(如地形、水面),实现动态镶嵌技术有两种策略:1.将网格以高度场(height field)来表示,而高度场则在某种栅格模式上定义。2.渐近网格(progressive mesh)相关文献

4.几何着色器[可选] (Geometry Shader)

  几何着色器也是渲染管线一个可选的阶段。我们知道,顶点着色器的输入是
单个顶点(以及属性), 输出的是经过变换后的顶点。
  与顶点着色器不同,几何着色器的输入是完整的图元(比如,点),输出可以是一个或多个其他的图元(比如,三角面),或者不输出任何的图元。几何着色器的拿手好戏就是将输入的点或线扩展成多边形

5.图元组装 (Primitive Setup)

  图元组装将输入的顶点组装成指定的图元。
  图元组装阶段会进行裁剪和背面剔除相关的优化,以减少进入光栅化的图元的数量,加速渲染过程
  在光栅化之前,还会进行屏幕映射的操作:透视除法和视口变换。关于透视除法和视口变换到底属于流水线的哪个阶段并没有一个权威的说法,某些资料将这两个操作归入到图元组装阶段,某些资料将它归入到光栅化过程,但这对我们理解整个渲染管线并没有太大的影响,我们只需要知道在光栅化前需要进行屏幕映射就可以了,所以我们这里将屏幕映射放到了图元组装过程。这两个操作主要是硬件实现,不同厂商会有不同的设计。

6.光栅化 (Rasterization)

  经过图元组装以及屏幕映射阶段后,我们将物体坐标变换到了窗口坐标。光栅化是个离散化的过程 : 将3D连续的物体转化为离散屏幕像素点的过程。包括三角形组装三角形遍历两个阶段。光栅化会确定图元所覆盖的片段,利用顶点属性插值得到片段的属性信息,然后送到片段着色器进行颜色计算,我们这里需要注意到片段的是像素的候选者,只有通过后续的测试,片段才会成为最终显示的像素点。
光栅化

7.片段着色器 (Fragment Shader)

片段像是培训过程中的像素,把一个片段写进最终的帧缓冲前,需要进行多道测试。

  片段着色器在DirectX中也称为像素着色器(Pixel Shader)。片段着色器用来决定屏幕上像素的最终颜色。在这个阶段会进行光照计算以及阴影处理,是渲染管线高级效果产生的地方。

8.混合测试

  管线的最后一个阶段是测试混合阶段。测试包括裁切测试、Alpha测试、模板测试和深度测试。没有经过测试的片段会被丢弃,不需要进行混合阶段,经过测试的片段会进入混合阶段。
  测试混合阶段虽然不是可编程阶段,但是我们可以通过OpenGL或DirectX提供的接口进行配置,定制混合和测试的方式。
  半透明物体的绘制需要遵循画家算法(painter Algorithm)由远及近进行绘制,因为半透明的混合跟物体的顺序有严格的对应关系。在绘制半透明物体之前,我们可以按照距离远近对场景中的物体进行严格排序,然后从后往前绘制。
  但是这种做法的时间开销很大、实现很复杂且并不适用于一些复杂的情况(比如几个半透明几何体互相镶嵌),所以渲染半透明几何体更通常使用OIT((order-independent transparency),OIT在光栅化后以像素为单位对几何形进行排序,它需要在进行排序和混合之前储存所有的片段(fragments)以获得精确的渲染效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值