[[材质/材质蓝图]]:降低学习渲染的门槛。 [[材质/材质函数]]:用于封装复用的代码,便于使用维护和修改。 [[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