1.逐顶点渲染简介
2.One Vertex Light
1.逐顶点渲染简介
逐顶点渲染意味着在顶点着色器中进行光照计算, 计算得出的颜色随后被插值处理并传递给片元着色器, 这种方式性能消耗低; Unity将这类光源包含在base pass中, 使用该方式时,Unity会寻找带有VERTEXLIGHT_ON关键词的着色体变体; 顶点光照仅适用于点光源, 定向光和聚光灯无法作为顶点光照使用
要使用顶点光照, 我们必须在基础通道中添加一个多重编译指令; 它只需一个关键字VERTEXLIGHT_ON; 另一个选项则是完全不使用关键字, 为此我们需要使用 _

2.One Vertex Light
要将顶点光的颜色传递给片元着色器, 我们需要将其添加到v2f结构体中

我们创建一个单独的函数来计算该颜色, 该函数从v2f中读取数据和写入数据, 因此将其设置inout参数

我们仅传递第一个顶点光的颜色, 只有当光源存在时才能执行

1).PBR中将顶点光照的颜色作为间接光a.Unity的现代着色器(如Standard Shader, URP/Lit Shader)都使用基于物理的渲染, 其核心BRDF光照模型(直接光部分)必须在像素级别计算才能得到正确的结果b.不能简单丢掉顶点光照, 确保物体在最差的情况下(无法获得像素光时)也能有一个基础的, 可接受的照明效果,避免场景中出现难看的黑色物体, unity将顶点光照降级为间接光c.打个比方像素光BRDF = 米其林大厨精心烹饪的主菜(精确火候,复杂调味)顶点光照 = 快餐汉堡(快速简单,能填饱肚子)虽然汉堡也是正餐(直接光), 但在米其林餐厅的菜单上, 它不会被当作主菜, 而是可能被归类为简餐或备用选择(间接光); 当客人太多(性能压力大), 大厨忙不过来时, 至少还有汉堡可以供应, 确保客人不会饿肚子(物体不会变黑)
2).PBR中将顶点光照作为漫反射a.顶点光照高光反射效果很差, 因为高光反射的核心是视角方向和法线方向的精确关系- 在顶点级别: 我们只在三角形的三个顶点计算高光- 在像素级别: 我们在每个像素点计算高光b.想象一个三角形平面- 顶点处的法线是已知的- 但三角形内部每个点的法线应该是平滑过渡的- 高光反射需要非常精确的法线信息才能形成光滑、连续的高光区域c.如果用顶点光照计算高光, 你会得到- 高光只出现在顶点位置- 三角形内部通过颜色插值来模拟高光- 结果就是高光会破碎、不连续、形状扭曲,看起来非常假既然顶点高光效果这么差, 那为什么还要计算它? 与其计算一个效果很差的高光, 不如把宝贵的性能用来确保漫反射保底照明更有意义


Unity最多支持四个顶点光源, 这些光源的位置存储在四个float4变量中, 每个坐标对应一个变量; 它们分别是unity_4LightPosX0、unity_4LightPosY0和unity_4LightPosZ0, 并在 UnityShaderVariables中定义; 这些变量的前几个分量包含第一个顶点光源的位置

接下来, 我们计算光线向量、光线方向以及ndotl因子; 此处无法使用 UNITY_LIGHT_ATTENUATION宏; 在顶点光照计算中, 我们通常只计算光照的贡献(包括光强、漫反射系数等), 而不乘以材质颜色(例如漫反射颜色); 这是因为在后续的片段着色器中, 我们还会进行更精确的光照计算, 并且在那里会结合材质颜色

在Unity中,unity_4LightAtten0是一个包含4个顶点光源的衰减参数的向量; 通常, 衰减公式会使用距离的平方乘以一个衰减系数来计算, unity_4LightAtten0帮助我们手动调整衰减系数
