技术美术入门

1,渲染流水线

image-20250326131318318

image-20250326131929637

详细描述渲染流水线

=应用阶段


==准备好基本场景数据

场景物体数据:物体变换数据(UnityTransform),位置、旋转缩放等等;物体网格数据,顶点位置UV贴图。

光源信息:光源类型:方向光、点光、聚光等等;位置、方向、角度等其他参数。

设置光源
方向光:颜色、方向等
点光源:颜色、位置、范围等
聚光源:颜色、位置、方向、内外圆锥角等

设置阴影
是否需要阴影:判断该光源可见范围内是否有可以投射阴影的物体
阴影参数:对应光源序号、阴影强度、深度偏移、近平面偏移等

逐光源绘制阴影贴图
近平面偏移
逐级联:计算当前光源+级联对应的观察矩阵、投影矩阵、以及对应到阴影贴图里的视口区域
绘制到阴影贴图

摄像机参数:位置、方向、远近裁剪平面;正交、透视Fov;视口比例/尺寸等等


==碰撞检测,加速算法,粗粒度剔除

进行算法上的加速,削除不需要进行渲染的物体,做一些剔除

可见光裁剪:比如说点光和聚光由于它们都有衰减,而且聚光的光椎体还有区域,如果它们距离摄像机很远,比如聚光的光锥和摄像机的视椎体不相交,那么就进行裁剪

可见场景物体裁剪:八叉树、BSP树、K-D树、BVH

==设置渲染状态,准备渲染参数

(比如渲染ui和渲染场景,他们的渲染参数和模式可能是不一样的)

绘制设置
使用着色器:场景中的不同物体可能使用不同的shader进行渲染
合批方式:静态批处理、动态批处理

绘制顺序
比如将透明物体放在不透明度物体之后进行渲染
1,相对摄像机的远近距离进行排序
2,材质上面的RenderQueue进行排序
3,UICanvas
其他方式等

渲染目标:将物体渲染到哪里,RenderTexture或者FrameBuffer

渲染模式:Unity常见的前向渲染和延迟渲染等等。

==调用DrawCall,输出渲染图元到显存

包含顶点数据和其他数据

=几何阶段

image-20250326140340666

==顶点着色:

顶点变换
顶点着色

视图变换:坐标系变换

image-20250326141036428

==可选顶点处理

(比如制作顶点动画的时候可能会用到)

曲面细分

主要是使用顶点着色器输出的顶点,按照一定的规则和算法来生成更多的顶点,将现有的网格和图元细分
image-20250326141438699

==几何着色器(可选步骤)

几何着色器的操作对象是一个图元,这个图元可以是一个顶点,也有可能是一个线段,两个顶点,也有可能是多个顶点构成的连续线段,也有可能是三个顶点构成的三角形

image-20250326141646487

作用是通过给定的·图元生成更多的图元。

==投影Projection

对于顶点在裁剪空间里的位置xyzw,我们会对其进行一次透视除法

把xyz除以w来完成投影操作,这样就可以从投影坐标系转换到了标准设备坐标系(NDC)

image-20250326142340383

在正交投影模式当中,w始终为1,它们的顶点位置xyz除以w,除完之后不会发生变化,它的xyz投影到平面上之后还是保留原来的数字。

==裁剪

CVV
正面或者背面剔除(可以进行配置)

image-20250326142650037

在Opengl中xyz都是-1到1,在D3D当中只有xy两个维度,而z是从0~1

==屏幕映射

从连续到离散(从3d空间变换到2D屏幕空间)
坐标系差异

image-20250326142916815

标准的设备坐标系当中xy的范围是从-1~1,而在屏幕坐标系当中,它的范围是屏幕,或者说是输出设备的长和宽

注意Opengl的原点在左下方,而D3D的原点在左上方

=光栅化阶段

==三角形设置

image-20250326143506100

==三角形遍历

得到三角形的边界信息之后,就遍历所有三角形内部的像素

对覆盖的像素进行线性插值

image-20250326143615426

==抗锯齿
image-20250326143712693

=逐片元操作

image-20250326144113184
==片元着色

image-20250326144151804

第一步进行线性插值:不仅仅是颜色,也包括了uv信息,深度信息等等

==颜色混合

AlphaTest透明度测试

透明度小于给定阈值的片元就会被舍弃不进行渲染

DepthBufferTest深度测试
image-20250326144500641

将片元的深度值和深度缓冲当中的深度值进行比较,如果通过比较那么这个片元就会被我们保留下来

深度比较的方式可以是大于、小于或者是等于,这是可以进行配置的。同时覆盖完之后还可以进行配置,是否向深度缓冲里面写入我们覆盖的深度值

StencilTest模版测试

深度测试比较深度值,模版测试比较模版值

image-20250326145054961

我们希望对这个两个立方体的整体进行描边但是我们不希望任何一个立方体的描边遮挡住其他的立方体,那么我们可以将两个立方体的顶点放大,并且将其绘制成描边的颜色。

并且在绘制的时候我们写入模版值,绘制完进行这一步后我们得到两个绿色区域的立方体

模版测试的比较方式可以进行配置,可以是小于通过也可以是大于通过,也可以是等于通过,也可以配置是否写入模版缓冲

Blending

image-20250326145751709

==目标缓冲区

FrameBuffer

RenderTexture

=后处理

image-20250326150003112

=总结

image-20250326145807578