Unity3D Shader 法线与基础光照
Unity3D Shader 法线与基础光照前言前面的文章里我们已经反复提到“法线”这个词。比如顶点法线外扩做描边光照方向和法线方向做点乘法线贴图会改变表面受光表现那法线到底是什么为什么一旦涉及光照几乎就一定要用到法线这一篇我们从最基础的角度出发讲清楚法线是什么光照为什么和法线有关dot点乘在光照里代表什么如何写一个最基础的 Lambert 漫反射 Shader什么是法线Normal法线可以简单理解为一个表面“朝向哪里”的方向。它通常是一个单位向量。例如一个朝上的平面它的法线可能是(0,1,0)也就是说这个面朝向 Y 轴正方向。为什么法线和光照有关因为光照最基本的问题就是光线打到这个表面时它到底是正面迎光还是斜着迎光还是背光而判断这件事最直接的方法就是看表面的法线方向看光照方向这两个方向越一致说明表面越正对光源通常就越亮。越偏离通常就越暗。dot 点乘为什么这么重要在 Shader 光照中最常见的一行代码就是dot(normal,lightDir)点乘可以理解成两个方向有多接近。它的结果范围大致是1完全同方向0互相垂直-1完全相反在光照里通常会写成saturate(dot(normal,lightDir))意思是小于 0 的部分直接压成 0大于 1 的部分压成 1这样就得到一个 0~1 的受光强度。最基础的漫反射思想最经典的基础光照模型之一就是Lambert 漫反射。它的核心就是diffusemax(0,dot(N,L))其中N法线方向NormalL光照方向Light Direction当表面正对光源时dot接近 1物体更亮当表面转到侧面时dot接近 0物体更暗这就是最基础的“明暗变化”。在 Shader 中如何拿到法线Mesh 顶点输入里通常这样声明float3 normal:NORMAL;例如structappdata{float4 vertex:POSITION;float3 normal:NORMAL;};这表示从模型数据中读取法线。但要注意这里的法线通常是对象空间法线。而做光照时我们通常更常用世界空间法线。因此往往要转换一下float3 worldNormalUnityObjectToWorldNormal(v.normal);为什么光照计算常用世界空间因为灯光方向通常在世界空间下更容易理解摄像机位置是世界空间物体在场景中的朝向变化也更方便统一计算只要参与同一次运算的数据都在同一个空间结果才是可靠的。一个最基础的 Lambert 光照 Shader下面写一个最基础的版本支持主方向光包含环境光 漫反射使用法线和光照方向做点乘ShaderCustom/SimpleLambert{Properties{_Color(Main Color,Color)(1,1,1,1)}SubShader{Pass{Tags{LightModeForwardBase}CGPROGRAM#pragmavertex vert#pragmafragment frag#pragmamulti_compile_fwdbase#includeUnityCG.cginc#includeLighting.cgincstructappdata{float4 vertex:POSITION;float3 normal:NORMAL;};structv2f{float4 pos:SV_POSITION;float3 worldNormal:TEXCOORD0;};fixed4 _Color;v2fvert(appdata v){v2f o;o.posUnityObjectToClipPos(v.vertex);o.worldNormalUnityObjectToWorldNormal(v.normal);returno;}fixed4frag(v2f i):SV_Target{fixed3 Nnormalize(i.worldNormal);fixed3 Lnormalize(_WorldSpaceLightPos0.xyz);fixed3 ambientUNITY_LIGHTMODEL_AMBIENT.xyz*_Color.rgb;fixed ndotlsaturate(dot(N,L));fixed3 diffuse_LightColor0.rgb*_Color.rgb*ndotl;returnfixed4(ambientdiffuse,_Color.a);}ENDCG}}}代码拆解1 从模型里读取法线float3 normal:NORMAL;2 把法线转到世界空间o.worldNormalUnityObjectToWorldNormal(v.normal);3 获取主光方向fixed3 Lnormalize(_WorldSpaceLightPos0.xyz);这里我们主要讨论方向光Directional Light的基础情况。4 计算漫反射强度fixed ndotlsaturate(dot(N,L));这一步就是核心法线越朝向光源 → 值越大法线越背离光源 → 值越小5 乘上灯光颜色和材质颜色fixed3 diffuse_LightColor0.rgb*_Color.rgb*ndotl;6 加上一点环境光fixed3 ambientUNITY_LIGHTMODEL_AMBIENT.xyz*_Color.rgb;如果没有环境光背光面会黑得太死。效果会是什么样这个 Shader 的效果特点是朝向光源的一面更亮背向光源的一面更暗比纯色 Unlit 更有体积感这就是最基础的“受光”感觉。Half-Lambert让阴影面别那么黑标准 Lambert 在某些卡通或风格化场景里会显得阴影过硬。一个常见改法是floathalfLambertdot(N,L)*0.50.5;再做一次限制halfLambertsaturate(halfLambert);这样背光面不会一下掉到纯黑会显得更“柔和”。很多早期卡通渲染教程都会用这种方法。法线方向不对会发生什么如果法线错误最直接的表现就是明暗反了某些面不该亮却很亮旋转模型后受光异常所以当你发现光照不对时除了看代码也要怀疑模型法线是否正确空间是否统一有没有忘记normalize为什么几乎总要normalize因为法线和光照方向参与点乘时我们通常希望比较的是“方向”而不是长度。所以会习惯这样写fixed3 Nnormalize(i.worldNormal);fixed3 Lnormalize(_WorldSpaceLightPos0.xyz);不归一化虽然有时“看起来也能跑”但结果可能会失真。常见坑1 法线和光照方向不在同一个空间例如法线在对象空间光照方向在世界空间直接点乘就是错的。2 忘了归一化点乘结果会不稳定。3 以为法线就是顶点位置方向法线是“表面朝向”不是顶点坐标。4 背光面全黑以为 Shader 写错了很多时候只是因为你只写了 Lambert没加环境光。总结这一篇最重要的核心只有一句基础光照本质上就是“表面朝向”和“光照方向”的关系。在 Shader 中最关键的公式就是saturate(dot(N,L))你可以先记住下面这几个点NORMAL用来接收模型法线光照计算常用世界空间法线dot(N, L)表示受光强度Lambert是最基础的漫反射模型环境光可以避免背光面死黑后面你继续学Blinn-Phong 高光Fresnel法线贴图PBR其实都是在这个基础上不断往上加东西。

相关新闻

MyBatis-Plus核心功能与生产实践详解

MyBatis-Plus核心功能与生产实践详解

1. MyBatis-Plus核心功能全景解析作为国内Java开发者最常用的ORM框架之一,MyBatis-Plus在传统MyBatis基础上进行了全方位增强。我在实际项目中使用该框架已有五年时间,今天系统梳理其最核心的六大功能模块,结合生产环境中的真实案例&#xff…

2026/8/1 3:27:17阅读更多 →
《孢子》圆球体角色通关:游戏机制突破与模组开发实战

《孢子》圆球体角色通关:游戏机制突破与模组开发实战

在游戏开发与设计领域,创意玩法探索一直是开发者与玩家共同热衷的话题。《孢子》(Spore)作为一款经典的生命模拟游戏,其开放式的进化机制为无数玩家提供了独特的体验空间。近期,社区中涌现出关于“圆球体”角色通关的讨…

2026/8/1 3:27:17阅读更多 →
Nacos微服务实战:从服务发现到配置管理的完整指南

Nacos微服务实战:从服务发现到配置管理的完整指南

1. 先搞清楚 Nacos 到底解决微服务架构中的哪些实际问题如果你正在接触微服务项目,或者准备把单体应用拆成微服务,Nacos 这个名字大概率会反复出现。它不是什么高深莫测的理论概念,而是一个实实在在能帮你解决服务发现、配置管理、服务健康监…

2026/8/1 3:27:17阅读更多 →
数字孪生与边缘计算的结合是当前工业智能化(尤其是上位机、智慧工厂、具身智能)落地的关键技术路径

数字孪生与边缘计算的结合是当前工业智能化(尤其是上位机、智慧工厂、具身智能)落地的关键技术路径

数字孪生与边缘计算的结合是当前工业智能化(尤其是上位机、智慧工厂、具身智能)落地的关键技术路径。它通过边缘侧实时计算 + 云端全局优化,解决传统数字孪生“延时高、带宽占用大、实时性不足”的问题,实现真正意义上的低延时、高可靠、闭环可控的虚实映射。 1. 为什么需…

2026/8/1 4:45:46阅读更多 →
ITIL4变革:从流程驱动到价值共创的运维转型

ITIL4变革:从流程驱动到价值共创的运维转型

1. ITIL4的变革本质:从流程驱动到价值共创2007年发布的ITIL v3曾定义了全球IT服务管理的黄金标准,其流程导向的方法论影响了整整一代运维工程师的工作方式。但当我们翻开ITIL4的官方文档,会发现开篇就明确指出现有框架的三大局限:…

2026/8/1 4:45:46阅读更多 →
Python 如何处理 AI API 的长文本:文件读取、分段与上下文整理

Python 如何处理 AI API 的长文本:文件读取、分段与上下文整理

当文档、日志或代码文件较长时,直接一次性发送给 AI API 容易超过上下文限制,也会增加处理时间。本文介绍一种适合个人项目的长文本处理流程。为什么长文本不能直接全部发送? 一段较长的内容直接放进请求里,可能遇到: …

2026/8/1 4:45:46阅读更多 →
计算机图形学实践:从基础绘制到着色器编程

计算机图形学实践:从基础绘制到着色器编程

1. 项目概述"Games102 作业下"这个标题看似简单,实际上包含了计算机图形学课程中一系列富有挑战性的实践内容。作为计算机图形学基础课程的核心作业,它通常涉及三维建模、渲染管线、着色器编程等关键技术的实践应用。在图形学领域,…

2026/8/1 4:45:46阅读更多 →
UE5蓝图样条线移动:从原理到实战的完整实现指南

UE5蓝图样条线移动:从原理到实战的完整实现指南

1. 项目概述:为什么需要蓝图驱动的样条线移动?在虚幻引擎5(UE5)的项目开发中,无论是制作一个简单的过场动画,还是实现复杂的巡逻AI路径,让物体沿着预设的路径平滑移动都是一个高频需求。手动K帧…

2026/8/1 4:45:46阅读更多 →
STM32串口初始化实战:标准库配置USART1/2/3与避坑指南

STM32串口初始化实战:标准库配置USART1/2/3与避坑指南

1. 项目概述:为什么串口初始化是STM32开发的基石在嵌入式开发领域,尤其是基于STM32的项目中,串口通信(USART/UART)几乎是每个项目都绕不开的基础功能。无论是用于打印调试信息、与上位机通信,还是连接GPS、…

2026/8/1 4:43:46阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/31 20:44:05阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/31 17:41:43阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/31 20:44:05阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →