1.1图形渲染管线概述

2022-3-26 20:42萝卜音乐 201 0

知识框架

什么是渲染?

给定3D场景(物体环境光照camera等)通过渲染生成/绘制一张2D二维图像

实现渲染这一过程的管线叫做渲染管线。

渲染,通俗的讲可以将一些部分理解为日常生活中的拍照:

在拍照时我们需要准备好要拍的东西(类比赋予材质后的模型)摆放好,然后要找到一个比较漂亮的构图(类比移动摄像机,选定视角,确定哪些需要渲染),当然摄影作为光影艺术,还要调节一个适宜的光线,让画面不灰不脏(类比光照的设置,环境光,漫反射,全局光照),这些都设置好了以后(给定3D场景)。然后“咔嚓”,按下快门键(渲染),拍立得的话就会生成一张照片(照片可以类比为渲染的2D图像)。当然有时候会对照片不满意,会拿PS修一修图(修图加滤镜的过程可以类比为后处理)。

渲染管线概述【美术向类比素描绘制】

根据《real- time-rendering》中将渲染管线分为

应用阶段——几何阶段——光栅化阶段

*每个阶段本身也可能是一条管线,此外还可以对有的阶段进行全部或者部分的并行化处理。

*最慢的管线阶段决定绘制速度(图像更新的速度)一般用FPS来表示每秒绘制的图像数量,或者是Hz。

应用阶段

1.准备场景数据:(模型的法线/顶点/材质/UV/光照/摄像机,其他数据如偏移数据等)

2.加速粗粒度剔除:(可见光剔除:视锥体/光锥没有交集不可见剔除AABB包围盒。可见场景剔除:八叉树/k_D树等)

3.设置渲染状态

(a,用什么shader,

b,设置渲染顺序是按照摄像机距离远近,还是材质等,

c,设置渲染目标:frame buffer/render texture,

d渲染模式:前向渲染还是延时渲染)

调用Draw Call/setpass call输出数据到显存

(美术的理解就是,这一过程就是写生前的揣摩,脑内绘画,画画前先动脑!啊,集训PTSD……)

几何阶段

*几何阶段执行的是计算量非常高的任务,在只有一个光源的情况下,每个顶点大约需要100次左右的精确的浮点运算操作。

坐标变换

(将坐标为模型空间--世界空间--观察空间--裁剪空间)

坐标变换我个人的理解是为了简化并且准确的描述位置的必要变换,在生活中我们拥有很多参考系,参照物,指指左右就可以,但如果构建一个虚拟的世界呢?那这个世界我怎么描述我在哪,我的手在哪?那个房子在哪?因此需要坐标,需要原点和参照。(MVP矩阵的推导会详细说明,这里只是介绍)

美术可以以C4D,MAYA为例理解这个变换过程,制作的时候,模型的坐标是可以移动的,整个场景是由一个坐标可以改的(做对称时,常把模型放回原点的操作)无论是外接keyShot,还是直接软件内渲染,都会有个摄像机,观察视图,裁剪后以这个尺寸比例输出。

顶点着色器(顶点shader)

*为了产生逼真的场景,渲染形状和位置是远远不够的,我们需要对物体的外观进行建模。而物体经过建模,会得到对包括每个对象的材质,以及照射在对象上的任何复杂光源的效果在内的一些描述。

*确定材质上的光照效果的这种操作被称为着色,着色过程涉及在对象上的点处计算着色方程。

顶点光照

除此可能设置的shader还有曲面细分shader/几何着色shader

*总之,顶点着色阶段的目的在于确定模型上顶点处材质的光照效果。

投影

透视投影/正交(平行)投影 (w值)——(将模型从三维空间投射到二维空间的过程,相当于快压扁的状态)

*在光照处理之后,将视体变换到一个对角顶点分别是(-1,-1,-1)和(1,1,1)单位立方体内(CVV-规范立方体)

裁剪

NDC,CVV裁剪,(不可见三角片元剔除,边缘裁剪增加顶点,范围内保留)

屏幕映射

裁剪空间--屏幕空间(视口坐标空间)


光栅化阶段

三角形设置:

将顶点试着连线三角面,计算三角网格边界(看三条边的顶点)

用于扫描转换,以及由几何阶段处理的各种着色数据的插值操作所用。

三角形遍历:

产生锯齿的阶段,看哪些像素是覆盖在片元里面的

片元着色器

输出颜色,给片元着色

输出合并,逐片元操作

片元——Alpha测试——模板测试——深度测试——blend混合——输出到帧缓冲区

此外可能还会进行一些后处理


美术理解:

其他

什么是OpenGL/DirectX,HLSL/GLSL/cg?

OpenGL/DirectX是图形API(图像应用编程接口)

HLSL(high level shading language)微软开发的着色器中间语言

GLSL(OpenGL shading language)OpenGL开发中间语言

cg(C for Graphic)跨平台图形中间语言(OpenGL和Dx都可以使用,更加抽象了一层,但可能实现不了GLSL中最新的运用)

4.CPU和GPU是怎么并行工作的?

使用命令缓冲区,将命令放在缓冲区中,CPU添加命令,GPU接收

5.Draw Call多了为什么会影响帧率?

感性一点类比将一个10MB的数据放在1个文件夹和用无数文件夹分装,1个的更快,

Draw Call多了会产生很多重复冗余的操作在cpu端,导致速度变慢

6.如何减少Draw Call

采用批处理技术

将多个需要同一种渲染状态的网格合并成一个

7.什么是固定渲染管线

固定函数的渲染管线,不可编程但可一定配置,目前已经out了

8.什么是Shader

1.即是GPU渲染中高度可编程的阶段,而由着色器编译出来的最终代码是会在GPU上运行的

2.有顶点着色器和片元着色器等(特定类型着色器)

3.能控制渲染细节(例如顶点着色顶点坐标变化,片元着色器进行逐像素的渲染)

相关术语中英文对照

更后续代码和ASE和shader forge连连看需要,先码一码

应用阶段:Applincation Stage 几何阶段:Geometry Stage 光栅化阶段: Rasterizer Stage

渲染图元:rendering primitives 顶点着色器:Vertex Shader 片元着色器:Fragment Shader

曲面细分着色器:Tessellation Shader 裁剪:Clipping 三角形设置:Triangle Setup

三角形遍历:Triangle Traversal 逐片元操作:Per-Fragment Operations 模板测试:Stencil Tset

深度缓冲:Z Buffer(一般Z都代表深度)

参考资料

强烈建议先看完参考资料,再看文章,自己写的目的就是为了内化知识,梳理框架,会精简很多(后续也是)


技术美术百人计划

庄懂的美术向课堂(AP01前半部分)

《Unity Shader入门精要》冯乐乐,第二章

RTR3提炼总结.PDF(毛大),第二章


鲜花

握手

雷人

路过

鸡蛋

最新评论

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-4-18 14:21 , Processed in 0.038853 second(s), 18 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.