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:04 阅读更多 →
《孢子》圆球体角色通关:游戏机制突破与模组开发实战

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

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

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

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

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

2026/8/1 3:27:04 阅读更多 →

最新新闻

Unity与Cocos2d-x双引擎实现Flappy Bird:源码对比与实战解析

Unity与Cocos2d-x双引擎实现Flappy Bird:源码对比与实战解析

1. 项目概述与核心价值最近在整理过往项目时,翻出了几年前做的一个经典小游戏——Flappy Bird的Android平台实现。这个项目之所以特别,是因为我当初为了对比学习,分别用Unity和Cocos2d-x两个主流引擎各实现了一遍。今天,我就把这两…

2026/8/1 4:09:20 阅读更多 →
为什么你的文心一言搜索增强总不生效?深度解析Embedding对齐偏差与领域适配断层(含BERT-Whitening校准方案)

为什么你的文心一言搜索增强总不生效?深度解析Embedding对齐偏差与领域适配断层(含BERT-Whitening校准方案)

更多请点击: https://intelliparadigm.com 第一章:文心一言搜索增强失效的典型现象与归因定位 当文心一言启用搜索增强(Search Augmentation)功能后,部分用户反馈模型仍返回笼统、过时或完全脱离实时信息的回答&#…

2026/8/1 4:09:20 阅读更多 →
高保真与低延迟的博弈:多相机实时3DGS(3D高斯溅射)的优化路径研发课题方案

高保真与低延迟的博弈:多相机实时3DGS(3D高斯溅射)的优化路径研发课题方案

高保真与低延迟的博弈:多相机实时3DGS(3D高斯溅射)的优化路径研发课题方案研发单位:镜像视界(浙江)科技有限公司核心研发负责人:耿文海(创始人、首席技术官)学术支撑单位…

2026/8/1 4:09:20 阅读更多 →
虚拟背景AI模型轻量化实战:将ResNet-50替换为TinyViT后,低端笔记本CPU占用率直降63%(附TensorRT部署脚本)

虚拟背景AI模型轻量化实战:将ResNet-50替换为TinyViT后,低端笔记本CPU占用率直降63%(附TensorRT部署脚本)

更多请点击: https://codechina.net 第一章:AI视频虚拟背景技术演进与轻量化必要性 AI视频虚拟背景技术已从早期依赖绿幕与高算力GPU的离线处理,逐步演进为端侧实时推理的轻量级解决方案。早期系统如Adobe After Effects插件或OBS Studio搭配…

2026/8/1 4:09:20 阅读更多 →
#RK3576Linux如何在uboot阶段关闭屏幕背光

#RK3576Linux如何在uboot阶段关闭屏幕背光

问题:目前RK3576在配置uboot阶段关机充电遇到了背光没有被关闭 解决办法是在显示图片后拉低背光的使能gpio u-boot/drivers/power$ git diff . diff --git a/drivers/power/charge_animation.c b/drivers/power/charge_animation.c index 89c5db231f..1ac5e9e300 …

2026/8/1 4:09:20 阅读更多 →
网口与串口深度解析:从硬件原理到实战调试的嵌入式通信指南

网口与串口深度解析:从硬件原理到实战调试的嵌入式通信指南

1. 项目概述:从物理接口到通信灵魂的深度解析“网口与串口”,这个标题听起来像是硬件工程师的入门课,或者是网络管理员的基础知识。但如果你真这么想,可能就错过了它背后庞大的技术生态和无数开发者、工程师日复一日踩过的“坑”。…

2026/8/1 4:08:20 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

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

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

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