[[材质/材质蓝图]]:降低学习渲染的门槛。
[[材质/材质函数]]:用于封装复用的代码,便于使用维护和修改。
[[Shader]]:着色器、着色程序。GPU执行的程序。
[[../UI/RGB颜色]]
[[Mips]]
[[UI/纹理]]
[[材质/UVs]]
3D渲染:
计算机图形渲染风格主要的两种
1. PBR渲染(Physically Based Rendering):基于物理的渲染
2. NPR渲染:非真实渲染
渲染风格的改变主要决定于光照。
PBR:
经典光照模型,Lambert光照模型:实现了光的漫反射
LightColor光照颜色 LightDir光照方向 Normal法线 BaseColor基础颜色
漫反射系数:dot(光照方向,法线)\*0.5+0.5 = (0,1)
最终颜色 = 光照颜色\*基础颜色\*漫反射系数
Phong 光照模型 :在漫反射的基础上增加了高光(镜面反射效果)
NPR渲染特点
1. 色阶的明暗分界
2. 描边
3. 边缘光
4. 头发高光
5. 面部修正
渲染流水线
+ 将3D场景 通过摄像机的视口 呈现的效果转换到2维坐标系的过程
渲染流程
1. 应用阶段:粗粒度剔除 渲染设置 准备渲染数据 输出到几何阶段
2. 几何阶段:顶点着色器 曲面细分 几何着色器 顶点裁剪 屏幕映射
3. 光栅化阶段:三角形设置 三角形遍历 片元着色器
4. 逐片元操作:裁剪测试 透明度测试 深度测试 模板测试 混合
5. 后处理
应用阶段:CPU处理 其他由GPU处理
由CPU准备场景数据 经过加速算法 粗粒度剔除等操作 设置渲染状态
准备渲染参数 调用==DrawCall== 输出渲染图元到显存
准备场景数据:场景物体数据 摄像机数据 光源以及阴影数据 其他全局数据
加速算法、粗粒度剔除:碰撞检测、加速算法、遮挡剔除等
设置渲染状态:材质Shader设置,绘制顺序设置、渲染模式(向前渲染、延迟渲染)
数据传输给GPU显存、传递顶点颜色、位置、法线\UV、贴图、纹理。调用DrawCall
几何阶段:
1. ==顶点着色器==: MVP:模型矩阵(Model)->观察矩阵(View)->投影矩阵(Projection)。
2. 模型空间坐标系->世界空间坐标系->观察空间坐标系->投影(NDC立方体空间坐标)
3. 曲面细分:用来生成新的顶点或者修改顶点。
4. 几何着色器:前面阶段的变化和修改,影响到模型的三角面,在此阶段生成新的三角面,构建新的模型。
5. 顶点裁剪:NDC空间以外的删除,完全在NDC空间内的保留,一半在内一半在外的裁剪,生成新的顶点。
6. 屏幕映射:经过缩放 将NDC空间的信息映射到实际屏幕上。到屏幕空间坐标系(2D),视口坐标3D(百分比).
光栅化阶段:
1. 三角形设置:将模型点点投射在画布的片元信息 进行顶点渐变的连线 绘制出三角形
2. 三角形遍历:三角形的内部点的查找,进行抗锯齿处理SSA MSAA FXAA 找到覆盖的像素生成片元。
3. ==片元着色器==:开发着发挥能力影响最终颜色的算法 片元的着色 基色 光照 透明度 混合起来得到最终颜色
逐片元操作:
1. 透明度测试
2. 深度测试
3. 模板测试
4. 三大测试用于 确定当前片元像素是否可以显示出来、是否舍弃
5. 混合
6. 屏幕图像:经过以上计算,图像显示在屏幕上,GPU采用多重缓冲机制,渲染发生在后置缓冲,渲染结束后GPU切换到前置缓冲再显示。
后处理:
1. 在整个渲染结束之后的额外处理。
==顶曲几裁屏
三三片逐屏==
[[材质/后处理材质]]
# 光照
光照的计算
1. 预计算阶段 离线渲染
2. 实时渲染
**能预计算都尽量预计算** -- **空间换时间**
## 静态光 和 动态光
静态光/离线渲染 数据存储在光照贴图(LightMap)
光照贴图 LightMap
本质是一张烘焙了有光照和阴影信息的纹理 最大尺寸8192(512-2048)
类似于纹理采样 计算完物体的基础颜色 使用光照贴图进行UV采样
将采样颜色和物体基色相乘进行混合。
优点:不需要实时运行、节省性能
缺点:占用内存,预计算时间比较长,而且移动一个物体就需要重新构建。
光照专用UV通道(模型导进来没有的话,引擎自动生成)
![[Picture/光照UV通道.png]]
1. 低质量光照图 (用于移动平台) RGB24
2. 高质量光照图 (用于主机、PC的静态光照) RGBA32
3. ShadowMap阴影贴图 Z-Buffer 深度缓冲
先纹理采样,计算法相方向和光照方向的结果 映射最终的颜色 亮度还原(0-1)
阴影贴图:
把光源和相机设置在相同的位置上
是否有阴影 等价 是否相机可见
**实时光源**
两种3D实时渲染的方式:
1. 向前渲染 ForwardRendering
几何体->顶点着色器->片元着色器(基色+光照信息)->渲染目标
劣势:
无效渲染太多,场景中有n个物体存在遮挡关系
逐个进行渲染、被遮挡的部分也一定会渲染
如果场景中光源过多,每个片元着色器都要计算每一个光源的信息。
如果场景中有m个光源,就意味着一共需要`m*n`次光照运算。
优势:
如果场景中需要使用多个着色模型,使用不同的材质蓝图,前向渲染效率较好
因为是逐个渲染的顺序,适合渲染半透明的物体。
2. 延迟渲染 DeferredRendering
为了更好解决大量光照的渲染才出现的。
所谓延迟,就是先进行
渲染每一个几何体的信息到G-Buffer,然后在GBuffer中进行操作 计算光照
延迟渲染的光照运算是发生在二维空间的。
只渲染,可见的像素。不可见的,不会参与运算,在大量光照之下有优势。
**对半透明物体,无法实现延迟渲染**
半透明物体都是等待到延迟渲染完成后,用向前渲染方式完成的。
# LOD