Unity Shader URP:法线如何进行光照计算

Unity URP顶点波浪动画Shader实战:从原理到性能优化 顶点动画是计算机图形学中一种高效实现模型动态形变的技术,其核心原理是在顶点着色器阶段,通过数学函数实时修改网格顶点的空间坐标,从而驱动模型产生平滑、连续的动态效果。这项技术具有极高的性能价值,因为它将计算负载从CPU转移至GPU的并行管线,避免了逐帧更新网格数据带来的带宽开销,特别适用于大规模环境效果的实时渲染。在游戏开发、模拟仿真和交互式媒体等应用场景中,顶点动画常用于模拟自然现象,如水面波动、植被摇曳和旗帜飘动。本文聚焦于Unity URP渲染管线下的顶点波浪动画实现,深入剖析了如何利用正弦波函数叠加来 阅读详情

在 URP 自定义光照里,法线不是一个“贴图颜色”,而是一个方向。它告诉 shader:这个像素表面朝向哪里。光照强不强,最核心的一步就是比较“表面朝向”和“光线方向”是否一致。

1. 法线到底是什么

法线 Normal 是垂直于表面的单位向量。假设一个面朝上,它的法线可能是 (0, 1, 0);如果面朝右,法线可能接近 (1, 0, 0)。在光照计算中,法线通常记作 N。

方向光、点光源、聚光灯都会给当前像素一个光线方向,通常记作 L。URP 里我们最终会把 N 和 L 放到同一个坐标空间中,再用点乘计算漫反射强度。

法线 N、光照方向 L、视线方向 V 是 URP 光照计算的三个核心方向。

2. 为什么要做空间转换

模型网格里的法线通常来自模型空间,也叫 Object Space。可光源位置、相机位置、阴影等通常在世界空间或其他 URP 内部空间中处理。做光照时,最忌讳把不同空间的方向直接相乘。

URP 的常见路径是:顶点着色器读取模型空间法线 normalOS,用 TransformObjectToWorldNormal 转成世界空间法线 normalWS,再传给片元着色器参与光照。

自定义 URP 光照里,先把法线变到世界空间,再和世界空间的光线方向做运算。

struct Attributes
{
    float4 positionOS : POSITION;
    half3 normalOS   : NORMAL;
};

struct Varyings
{
    float4 positionHCS : SV_POSITION;
    half3 normalWS    : TEXCOORD0;
};

Varyings vert(Attributes IN)
{
    Varyings OUT;
    OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
    OUT.normalWS = TransformObjectToWorldNormal(IN.normalOS);
    return OUT;
}

3. 漫反射:点乘决定亮不亮

最基础的漫反射是 Lambert 模型。它的核心只有一行:

half NdotL = saturate(dot(normalize(N), normalize(L)));

dot(N, L) 的结果范围是 -1 到 1。当法线正对光源时接近 1,表面最亮;当光从侧面擦过时接近 0;当光在背面时小于 0,通常用 saturate 截到 0。

NdotL 越大,漫反射越强;小于 0 的背面光照通常被截断。

half3 normalWS = normalize(IN.normalWS);
Light mainLight = GetMainLight();

half3 lightDirWS = normalize(mainLight.direction);
half NdotL = saturate(dot(normalWS, lightDirWS));

half3 diffuse = baseColor.rgb * mainLight.color * NdotL;

4. 高光:法线还要和视线一起算

漫反射只关心表面朝不朝向光。高光还关心观察者在哪里。Blinn-Phong 常用半角向量 H,它是光线方向 L 和视线方向 V 的折中方向。

half3 H = normalize(lightDirWS + viewDirWS);
half spec = pow(saturate(dot(normalWS, H)), smoothnessPower);

当法线 N 越接近半角向量 H,高光越强。smoothnessPower 越大,高光越小、越锐利;越小,高光越宽、越柔。

高光不是只看光,还要看相机。半角向量 H 越接近法线 N,高光越明显。

5. 法线贴图:把细节写进切线空间

模型顶点法线只能描述大形体。如果要让砖缝、皮革、金属划痕看起来有凹凸,就会使用法线贴图。法线贴图通常存储的是切线空间 Tangent Space 的法线。

切线空间由三个方向组成:切线 T、副切线 B、法线 N。shader 会采样法线贴图,把贴图里的方向从切线空间转换到世界空间,再参与同样的 dot(N, L) 和 dot(N, H) 计算。

法线贴图常在切线空间中表达方向,需要借助 TBN 矩阵变到世界空间。

// 顶点阶段需要提供 tangentWS、bitangentWS、normalWS。
half3 normalTS = UnpackNormal(SAMPLE_TEXTURE2D(_NormalMap, sampler_NormalMap, uv));

half3x3 tangentToWorld = half3x3(
    normalize(tangentWS),
    normalize(bitangentWS),
    normalize(normalWS)
);

half3 normalWS = normalize(mul(normalTS, tangentToWorld));

注意:如果模型有非等比缩放、镜像 UV、负缩放或错误的切线数据,法线贴图很容易出现“光照反了”“接缝发黑”的问题。排查时先显示世界空间法线颜色,再看 TBN 是否正确。

6. 一个最小 URP 自定义光照片元

下面这段代码展示了核心思路:包含 URP 的 Lighting.hlsl,取主光源,归一化法线,计算漫反射和简单高光。真实项目还会加入阴影、附加光、GI、雾效、PBR 参数等,但法线参与光照的骨架就是这些。

#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

half4 frag(Varyings IN) : SV_Target
{
    half3 baseColor = _BaseColor.rgb;

    half3 normalWS = normalize(IN.normalWS);
    half3 viewDirWS = normalize(GetWorldSpaceViewDir(IN.positionWS));

    Light mainLight = GetMainLight();
    half3 lightDirWS = normalize(mainLight.direction);

    half NdotL = saturate(dot(normalWS, lightDirWS));
    half3 diffuse = baseColor * mainLight.color * NdotL;

    half3 halfDirWS = normalize(lightDirWS + viewDirWS);
    half specTerm = pow(saturate(dot(normalWS, halfDirWS)), _SpecularPower);
    half3 specular = mainLight.color * specTerm * _SpecularColor.rgb;

    return half4(diffuse + specular, 1.0);
}

7. 调试法线:先把方向画出来

法线调试最直观的方法是把方向当颜色显示。因为法线分量范围是 -1..1,而颜色范围是 0..1,所以常用下面的映射:

half3 debugColor = normalize(normalWS) * 0.5 + 0.5;
return half4(debugColor, 1.0);
现象常见原因排查方向
模型转动后光照方向不对模型空间法线直接拿去和世界空间光线点乘确认使用 TransformObjectToWorldNormal
法线贴图左右反了切线、副切线方向或 normal map 导入设置不匹配检查 Tangent、UV 镜像、Normal Map 类型
高光碎裂或忽明忽暗法线、视线、光线未归一化在片元阶段重新 normalize
背面异常发亮未使用 saturate 或双面法线处理不当检查 NdotL、Cull、双面翻转逻辑

总结

URP 里法线参与光照计算,可以压缩成一句话:把法线转换到正确空间,归一化,然后用它和光线、视线方向做点乘。漫反射看 dot(N, L),高光看 dot(N, H),法线贴图则是在这个基础上替换成更细节的每像素法线。

只要记住“同空间、单位向量、点乘、截断”这四件事,大多数自定义光照问题就能被定位到很小的范围里。

Unity URP下Matcap着色器避坑指南:解决平面渲染发黑和边缘裂缝 本文针对Unity URP管线中实现Matcap着色器时常见的平面渲染发黑和边缘裂缝问题,提供了详细的避坑指南和解决方案。文章深入剖析了问题根源,并给出了在Shader Graph中获取正确视图空间法线、使用反射向量改进算法、优化纹理采样与边界处理等核心技巧,帮助开发者高效集成Matcap效果,兼顾视觉质量与性能。 阅读详情

相关推荐

Unity几何草渲染实战:从几何着色器到动态草海实现

在实时渲染领域,程序化几何体生成是一项关键技术,它允许开发者在GPU上动态创建复杂的3D模型,从而极大地提升了场景的丰富性和真实感。其核心原理在于利用着色器编程,绕过传统的建模流程,直接通过算法生成顶点数据。这项技术的价值在于能够实现传统方法难以企及的大规模、动态变化的场景元素,例如随风摇曳的植被、流动的水体或破碎的效果。在游戏开发,尤其是开放世界和模拟类应用中,程序化生成对于创建生动、可交互的环境至关重要。本文聚焦于Unity引擎中的几何草渲染,深入探讨了如何利用几何着色器这一工具,从基础草叶生成、风场模

weixin_34416754的博客 522

Unity中Blendshape动画导致全身光照异常的排查与修复指南

在3D渲染中,法线是决定模型表面光照、阴影和高光表现的核心数据。其原理是通过顶点法线向量与光照方向进行计算,直接影响漫反射和镜面反射效果,是呈现模型立体感的关键。在游戏开发与实时渲染领域,正确的法线数据对于保证角色和场景视觉质量至关重要。当从Blender、Maya等DCC工具导出带有混合形状(Blendshape)的模型至Unity时,若导出设置不当,Blendshape可能会携带仅为局部变形区域计算的“法线偏移量”数据。Unity导入这些数据后,在动画播放时,局部的错误法线信息会覆盖并污染模型其他部分的

weixin_29628635的博客 294

深入Unity内置Shader源码:从PBR原理到实战优化与风格化渲染

在实时图形渲染领域,着色器(Shader)是实现视觉效果的核心技术组件,它定义了三维模型表面每个像素的颜色、光照和材质属性。其工作原理基于图形渲染管线,通过顶点着色器和片元着色器对几何数据进行变换与计算。掌握Shader编程对于提升渲染质量与性能具有重要价值,广泛应用于游戏开发、影视特效和交互式应用等场景。本文聚焦Unity引擎内置Shader源码的深度解析,通过剖析URP Lit Shader的PBR(基于物理的渲染)全流程,揭示其模块化设计、BRDF光照模型与变体管理机制。针对开发中的常见需求,如实现风

weixin_32382335的博客 337

【Unity Shader URP】Matcap 材质捕捉实战教程

Matcap(Material Capture,材质捕捉)是一种用一张球形光照贴图伪造任意材质效果的技巧:金属高光、玉石通透、卡通光泽、X 光效果——换张贴图就换一种材质,不需要真正的光照计算。原理极简、性能极低、效果极好,是角色展示、雕刻预览、风格化渲染的利器。

Fresh_Free的博客 735

Unity URP水体焦散效果实现:从原理到实战的完整指南

焦散是光线通过非均匀介质(如波动水面)折射后,在接收面上形成明暗相间光斑的光学现象。其物理原理基于斯涅尔定律,描述了光线在界面处的偏折与汇聚。在实时计算机图形学中,精确模拟这一现象对提升水体、玻璃等材质的视觉真实感至关重要。技术实现上,开发者常借助屏幕空间着色技术,通过采样深度与法线纹理,重建世界空间位置,并模拟光线追踪来高效近似焦散效果。这为游戏与交互应用提供了动态、逼真的光照交互方案。本文聚焦Unity通用渲染管线,深入剖析水体焦散的核心实现方案,涵盖从基础的预烘焙纹理投影,到基于屏幕空间深度与法线信息

weixin_30388677的博客 377

Unity URP次世代角色渲染实战:皮肤次表面散射与头发各向异性高光

在实时渲染与游戏开发领域,光照模型是塑造视觉真实感的核心技术。其原理在于通过数学模型模拟光线与物体表面的交互行为,例如漫反射、镜面反射以及更复杂的次表面散射现象。这些技术的工程价值在于,它们能以可计算的性能开销,在动态环境中实现逼近物理真实的材质表现,从而极大地提升角色、场景等数字资产的视觉沉浸感。其中,皮肤渲染因其需要模拟光线在皮下组织的散射而极具挑战,而头发渲染则需处理由发丝圆柱几何与鳞片结构导致的各向异性高光。这些高级渲染技术广泛应用于追求电影级画质的3A游戏、虚拟制片以及数字人开发等场景。本文聚焦于

weixin_32479897的博客 239

Unity URP水体渲染进阶:Blinn-Phong高光与动态波浪融合技法

本文详细解析了在Unity URP中实现动态水体高光效果的核心技法。通过结合Blinn-Phong光照模型与动态法线贴图技术,解决了静态水面缺乏真实感的问题。文章提供了从原理分析到Shader代码实战的完整指南,包括关键向量计算、参数调优及性能考量,帮助开发者创造出波光粼粼的生动水面效果。

tcp8optimizer的博客 480

Shader实现逼真翻书弯曲效果:从圆柱体模型到光影渲染

在计算机图形学中,着色器(Shader)是实现复杂视觉效果的核心技术,它通过在GPU上运行的程序,对顶点和像素进行数学变换与着色,从而模拟真实世界的物理现象。其原理基于可编程渲染管线,允许开发者深度控制几何变形、纹理映射和光照计算。这项技术的价值在于能以极高效率实现传统方法难以达到的逼真动态效果,广泛应用于游戏UI、电子书、交互式手册等数字内容场景。本文聚焦于利用顶点着色器和片元着色器,构建一个基于圆柱体几何模型的翻书弯曲效果,通过动态计算顶点位置、法线及UV坐标,结合兰伯特漫反射与边缘光渲染,模拟出纸张翻

weixin_29973493的博客 317

从原理到实战:Lambert光照模型在Unity Shader中的演进与应用

本文深入解析了Lambert光照模型在Unity Shader中的核心原理与实现路径。Lambert模型通过点乘计算模拟了光线在粗糙表面的漫反射现象,即兰伯特定律。文章详细对比了逐顶点、逐像素及半兰伯特三种实现方式,分析了各自的性能与视觉效果差异,并提供了Unity中的实战应用与避坑指南,是掌握基础光照渲染的关键。

weixin_29007135的博客 211

Unity URP Shader(HLSL)踩坑日记(一)

最近开始转TA,刚开始学习,资料比较杂乱,其中遇到的问题和一些计算方式,记录一下,后续会一直完善补充。

Star_MengMeng的博客 6445

Unity中URP下实现水体(水面高光)

在上一篇文章中,我们实现了水体的水下扭曲效果。在这篇文章中,我们来实现水面的高光效果。

楠溪泽岸的博客 2799

Unity Shader入门指南:从ShaderLab到顶点片元着色器实战

在实时图形渲染中,着色器(Shader)是控制GPU渲染流程的核心程序,它决定了模型表面最终在屏幕上的像素颜色与外观。其工作原理基于可编程渲染管线,开发者通过编写顶点着色器和片元着色器,分别处理模型的顶点数据与光栅化后的片元,实现从3D坐标到2D像素的转换与着色。掌握着色器技术对于游戏开发与图形应用至关重要,它能突破内置材质的限制,实现高度定制化的视觉效果,如风格化渲染、复杂材质模拟和性能优化。本文以Unity引擎为实践环境,系统讲解ShaderLab语法框架、顶点/片元着色器的数据流转与编写方法,并通过纹

weixin_30325487的博客 771

c#源码,将矩阵(二维数组)渲染成云图,强度图,热力图,均匀性图,伪彩图

优快云软件0积分下载链接:https://download.youkuaiyun.com/download/wanghuannihao1992/86656759。6、渲染效果良好,颜色均匀分布,不存在等高线,交叉点。3、纯粹的C#代码编写,不含第三方dll或者控件。4、支持ColorBar显示,强度值颜色坐标显示。2、渲染时间60ms左右,速度快,1、二维数据最小支持2*2,7、采样全新数据插值算法。先直接上C#软件效果图。5、整图保存为单个图片。

业余程序员小徐的博客 6880

Unity基于自定义管线实现经典经验光照模型

SRP管线的好处就是任何渲染效果都可以自己去实现,坏处就是任何渲染效果都要自己去实现。本文在Catlike Coding 实现的基础上给出几个经典光照模型的Shader实现,Catlike Coding在这教程中使用的是PBR光照模型,网上常见的实现范例都是基于Unity预设的管线,这边给出这个教程框架下的实现。

GLDbalala的博客 718

雪球股票数据接口

周期(day-日,week-周,…表示获取前8个周期(日)数据):类型(before-历史)表示深圳证券交易所,表示上海证券交易所):开始时间戳(一定要。

qq_31856061的博客 6807

QT窗体大小控制全攻略:从setFixedSize到事件过滤器的进阶用法

本文深入探讨了QT窗体尺寸控制的进阶实践,从基础的setFixedSize方法到结合事件过滤器实现智能动态适配。通过分析窗口状态变化、多显示器环境处理以及布局策略,提供了实现禁止缩放但支持最大化、多屏智能适配及动态约束等复杂场景的完整解决方案与核心代码示例。

weixin_29229261的博客 299

Unity中Raymarching渲染器实现:从SDF到光影的完整指南

在计算机图形学中,渲染技术决定了虚拟世界的视觉呈现。传统光栅化基于三角形网格,而距离场(SDF)则通过数学函数定义几何形状,为渲染提供了新的范式。Raymarching(光线步进)正是基于SDF的核心算法,它通过从摄像机发射光线并逐步前进,利用SDF值安全推进,直至命中表面或超出范围。这种技术突破了网格建模的限制,能高效渲染平滑曲面、复杂分形和动态体积等难以用三角形表达的效果。其技术价值在于将程序化生成与实时渲染结合,极大提升了视觉表达的灵活性与艺术风格化能力。在游戏开发、动态特效、建筑可视化等领域,Ray

weixin_30906185的博客 339

非root用户如何在CentOS7集群上编译安装OpenFOAM6

本文详细介绍了在CentOS7集群上以非root用户身份编译安装OpenFOAM6的完整流程。通过环境准备、依赖包离线获取、源码编译安装等步骤,解决了集群环境下权限和依赖问题,特别针对OpenMPI和Boost库提供了优化配置建议,帮助用户高效完成安装并优化性能。

weixin_28826961的博客 681

【URP】Unity[内置Shader]复杂光照ComplexLit

Unity URP中的ComplexLit是一种高级PBR着色器,支持多光源、法线贴图等特性,通过BRDF计算实现真实材质表现。相比基础Lit着色器,ComplexLit增加了视差映射、次表面散射等高级功能,但需要更高硬件支持。它适用于写实风格的高端设备场景,而Lit更适合常规项目。ComplexLit支持通过ShaderGraph配置,能实现各向异性高光、清漆涂层等特殊效果,但需注意在移动端的性能优化。该技术自Unity2019年SRP重构后持续发展,已成为跨平台开发的重要渲染解决方案。

设计 AI 玩游戏🎮 2329

为YOLOv11引入加权双向特征金字塔(BiFPN)

本文介绍了将BiFPN应用于YOLOv11模型以提升边缘设备上小目标检测精度的实践。针对传统FPN在特征融合时的信息丢失问题,采用带可学习权重的BiFPN结构进行改造,实现了不同层级特征的动态融合。重点阐述了WeightedFeatureFusion模块的实现细节、neck结构改造方法及训练部署注意事项。实验表明,该改进使小目标AP提升3.1%,参数量仅增加5%,在精度和效率间取得良好平衡。文章还分享了权重初始化、归一化处理等实用技巧,并强调需根据数据特性评估改进效果,重新计算anchor等关键点。

as1225120794的博客 349

本地 AI 自由!OpenClaw+Ollama 双系统部署教程(Windows/Linux),零成本离线跑大模型

本文详细介绍了如何在Windows和Linux双系统中部署OpenClaw AI助手,并通过Ollama对接本地大模型实现完全离线使用。教程包含环境准备、OpenClaw安装配置、Ollama本地模型部署、系统对接等完整流程,特别强调隐私安全和零Token消耗的优势。针对不同操作系统提供具体命令,并给出常见问题解决方案,即使是新手也能快速搭建专属本地AI助手。最终实现的方案无需联网、无使用成本,且能保障数据隐私安全。

2501_93651177的博客 7230

Unity中URP下的菲涅尔效果实现(URP下的法线和视线向量怎么获取)

我们在这篇文章中,了解一下URP中Shader怎么实现菲涅尔效果,同时学习一下URP下怎么获取法线 和 视线向量。

楠溪泽岸的博客 3049

一种白平衡增益计算中白点权重计算简易实现方式

一种白平衡白点距离权重简易实现方式

大熊 384

【URP】Unity[法线贴图]原理与实践

法线贴图技术通过修改表面法线方向模拟凹凸细节,在保持低模的同时提升视觉效果。该技术自1998年首次应用后逐渐成为游戏渲染标准,URP管线优化了其工作流。实现流程包括高模烘焙/程序生成法线贴图、材质配置和着色器编写,核心是切线空间到世界空间的法线转换。URP提供了UnpackNormalScale等内置函数简化开发,适用于角色细节增强和环境表现,在移动端需注意性能优化。专栏探讨了从原理到实现的完整技术方案。

设计 AI 玩游戏🎮 1864

YOLO系列算法改进 | 自研篇 | C3k2融合SEFN空间增强前馈网络模块 | 去模糊和提升图像细节特征,精度涨点!| WACV 2025

YOLO系列算法改进 | 自研篇 | C3k2融合SEFN空间增强前馈网络模块 | 去模糊和提升图像细节特征,精度涨点!| WACV 2025 (以YOLO26最新目标检测模型为基础,C3k2融合SEFN空间增强前馈网络模块改进Backbone)

2502_91881744的博客 237

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【URP】Unity[内置Shader]光照着色器Lit

《Unity URP中的LitShader核心解析》概述 LitShader是Unity通用渲染管线(URP)实现物理渲染(PBR)的核心着色器,通过金属度、光滑度等参数精确模拟各类材质表现。该文系统介绍了LitShader的工作原理和发展历程:从内置管线的StandardShader演进为URP专用着色器,支持单Pass多光源处理。文章详细讲解了基础材质配置方法,包括不透明/透明表面设置、混合模式选择等核心参数,并通过金属、玻璃等具体案例展示ShaderGraph中的实现技巧。特别针对透明材质提出双Pas

设计 AI 玩游戏🎮 1688

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: Unity Shader URP:将法线可视化,便于调试
下一篇: Unity Shader URP:法线在空间变换上的特殊性
mxwin
博客等级 码龄19年 22粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值