US3S4L2——前向渲染路径
US3S4L2——前向渲染路径 前向渲染路径 前向渲染路径处理光照的方式 有一套划分光源 “三六九等” 的规则,将光源分成了高中低三种身份,主要通过灯光渲染模式、项目质量设置中的像素灯光计数的数量、光照强度、距离物体距离来综合判定 前向渲染路径在哪里进行光照计算 Base Pass(基础渲染通道):主要用于处理影响该物体的一个高质量光源(平行光)、所有中(逐顶点处理)低质量(SH处理)光源等 Additional Pass(附加渲染通道):主要用于处理影响该物体的除平行光以外的其它高质量光源(每个高质量光源都会调用) 前向渲染路径的内置光照变量和函数 有了内置光照变量,我们便可以获取到前向渲染路径当中,对渲染质量有不同要求的光源们的相关数据,利用这些数据和函数在Base Pass(基础渲染通道)和 Additional Pass(附加渲染通道)中按照需求进行相关的逻辑处理即可 前向渲染路径对处理光源的方式 前向渲染路径中会将光源分为以下 3...
US3S4L1——渲染管线概述
US3S4L1——渲染管线概述 渲染路径 渲染路径(Rendering Path)是指在图形渲染过程中,图形引擎按照特定的步骤和顺序来处理场景中的几何、光照、材质等信息,最终生成屏幕上的图像的一种算法或策略。它决定了图形引擎如何组织和执行渲染过程,以产生最终的视觉效果。 对于我们来说:在 Unity 中,渲染路径决定了光照如何应用到 Unity Shader 中,如果要在 Unity Shader 中和光源打交道,我们需要为每个 Pass 渲染通道匹配对应的渲染路径,这样才能在 Shader 当中获取到正确的光源数据进行处理。 总而言之:渲染路径会影响光照处理,从而影响最终的渲染效果(光照、阴影等),Unity 存在多种不同的渲染路径 影响原因:简单来说,使用不同的渲染路径时,Unity 在 Shader 中准备光源数据的流程是不同的,那么在 Shader 开发时,获取光源数据的方式就会有所不同 渲染路径的种类和设置 我们可以在 Camera 组件中的 Rendering...
US3S3L7——双面渲染
US3S3L7——双面渲染 双面渲染的透明效果的需求 对于现实世界的半透明物体,我们不仅可以透过它看到其他物体的样子,也可以看到这个物体自己的内部结构 但是我们之前实现的 透明度测试 和 透明度混合 相关Shader,都无法看到模型的内部结构 如下图,左边的立方体使用透明混合,右边的立方体使用透明测试,它们都无法看到模型内部的结构 而双面渲染的透明效果 Shader 就是来解决该问题的, 让我们不仅可以透过半透明物体看到其他物体的样子,还可以看到自己的内部结构 双面渲染的透明效果的基本原理 基本原理:默认情况下,Unity会自动剔除物体的背面,而只渲染物体的正面 双面渲染的基本原理就是利用我们之前学习过的 Cull 剔除指令来进行指定操作 Cull Back —— 背面剔除 Cull Front —— 正面剔除 Cull Off —— 不剔除 不设置的话,默认为背面剔除 对于透明度测试 Shader,由于它无需混合,因此我们直接 关闭剔除 即可 对于透明度混合 Shader,由于它需要进行混合,需要使用两个...
US3S3L6——开启深度写入的半透明
US3S3L6——开启深度写入的半透明 开启深度写入的半透明效果用来处理的需求 对于本身结构较为复杂的模型,使用之前的透明度混合Shader会由于关闭了深度写入,会产生错误的渲染效果 虽然我们可以通过拆分模型的方式解决部分问题,但是对于一些结构复杂的模型,拆分模型的方式会增加工作量 以下面的模型为例,左边不使用 半透明Shader 的材质,右边使用了 关闭深度写入的半透明Shader 的材质 可以看到,对于这种自带遮挡关系的复杂模型,关闭深度写入会出现遮挡关系错误的渲染问题 对于这种情况,我们可以采用 开启深度写入的半透明 Shader...
US3S3L5——透明度混合
US3S3L5——透明度混合 透明度混合 透明度测试,并不能用于实现半透明效果, 它只存在看得见和完全看不见两种状态,一般用来处理镂空效果 而透明度混合,主要就是用来实现半透明效果的 透明度混合的基本原理 基本原理:关闭深度写入,开启混合,让片元颜色和颜色缓冲区中颜色进行混合计算 具体实现: 采用半透明的混合因子进行混合,以 Blend SrcAlpha OneMinusSrcAlpha 为例: 因此: 输出颜色=SrcAlpha×源颜色+(1−SrcAlpha)×目标颜色=源颜色透明度×源颜色+(1−源颜色透明度)×目标颜色\begin{align*} 输出颜色 & = SrcAlpha \times 源颜色 + (1 - SrcAlpha) \times 目标颜色 \\ & = 源颜色透明度 \times 源颜色 + (1 - 源颜色透明度) \times 目标颜色 \end{align*} 输出颜色=SrcAlpha×源颜色+(1−SrcAlpha)×目标颜色=源颜色透明度×源颜色+(1−源颜色透明度)×目标颜色 声明一个 0~1 区间的...
US3S3L4——透明度测试
US3S3L4——透明度测试 透明测试 在游戏开发中,对象的某些部位完全透明而其他部位完全不透明 这种透明需求往往不需要半透明效果,相对比较极端,只有看得见和看不见之分 比如树叶、草、栅栏等等,如下图: 因为单纯的透明测试是不需要进行混合操作的,因此无需去关闭深度写入 透明测试的基本原理 基本原理:通过一个阈值来决定哪些像素应该被保留,哪些应该被丢弃 具体实现:通过片元携带的颜色信息中的透明度(A值)来计算 不满足条件时(通常是小于某个阈值) 该片元就会被舍弃,被舍弃的片元不会在进行任何处理,不会对颜色缓冲区产生任何影响 满足条件时(通常是大于等于某个阈值) 该片元会按照不透明物体的处理方式来处理 阈值判断使用的方法:利用 CG 中的内置函数:clip() 该函数有重载,参数类型可以是 float4,float3,float2,float 等等 如果传入的参数任何一个分量是负数就会舍弃当前片元 它的内部实现会用到一个 discard 指令,代表剔除该片元 不再参与渲染 它的实现大致为: 12345void clip(float4 x){ ...
US3S7——标准光照着色器
US3S7——标准光照着色器 标准光照着色器 目前已经完成了光源和阴影的主要知识点学习,学习了多光源、阴影、光照衰减等等知识 已经可以在 Shader 中处理光和阴影相关的效果了,那么我们将结合之前所有所学的知识(法线等知识)实现一个标准光照Shader 说是标准,其实就是实现一个较为通用的 Shader 本系列学习内容: 标准漫反射Shader 标准高光反射Shader
US3S6——阴影
US3S6——阴影 阴影 目前的光照 Shader 虽然可以让物体接收到多个光源的光照效果,但是目前的物体还不能接收和投射阴影, 因此,目前我们还需要在 Shader 内实现阴影效果,这样才能完全补全光照效果 本系列学习内容: 阴影的基本原理 Unity中阴影的实现原理 不透明物体阴影 让物体投射阴影 让物体接收阴影 光照衰减和阴影 透明物体阴影 透明度测试物体阴影实现 透明度混合物体阴影实现
US3S5——多种光源处理
US3S5——多种光源处理 前置知识:Unity入门 —— 光源组件,C# 进阶 —— 预处理器指令(#TODO#) 多种光源处理 目前的 Shadow 并不能处理多光源的光照效果,了解了渲染路径后,可以实现多光源的光照效果了,但是 Unity 的光源不止存在平行光, 之前在讲解光照模型相关知识点时,场景中仅仅只有一个光源,并且光源类型为平行光,但是在 Unity 当中一共支持四种光源类型: 平行光(Directional) 点光源(Point) 聚光灯(Spot) 面光源(Area)—— 面光源仅在烘焙时有用,因此我们不讨论它 不管光源类型到底是什么,我们在 Shader 开发当中经常会使用到的光源相关属性有:位置、方向、颜色、强度、衰减 也就是说我们在 Shader 中处理光照效果时,经常会用到这些光的属性参与到计算当中 本系列学习内容: 多种光源 前向渲染中处理多种光源 在 Shader 中判断光源类型 光照衰减 点光源衰减计算 聚光灯衰减计算 多种光源综合实现
US3S4——渲染路径
US3S4——渲染路径 我们在之前的 Shader 入门相关知识的学习中,已经学习过光照模型相关知识,我们目前已经可以实现出一些基础的光照表现效果 但是需要注意的是,我们之前实现的那些光照相关 Shader 都不能直接应用到项目开发中,因为它还不够完善。 比如,之前的光照模型相关知识中,我们在 Shader 中只考虑了场景中的平行光, 如果我们的场景中没有平行光,会导致之前的 Shader 出现错误的表现效果。 在实际的游戏开发中,我们场景中的光源肯定是更多、更复杂的!一个平行光的处理,完全不能满足我们的需求。 因此之前关于光照模型的相关学习,只是为了给我们打下一个基础,让我们能够理解光照处理的底层逻辑是光照模型的计算。 要处理更多的光源,我们就需要了解 Unity 底层是如何处理这些光源的,我们将首先学习渲染路径相关的知识来了解这一点 渲染路径相关 本系列学习内容: 渲染管线概述 前向渲染路径 顶点照明渲染路径 延迟渲染路径 渲染路径对比