Unity shader 官网文档全方位学习(二)Lighting model及自定义Lighting model

Unity Lighting 面板的参数设置用途详细总结 提供较高中等质量的光照,与Shadowmask类似,其设置牵扯间接光照、阴影,直接光照正常计算:在shadow distance范围之内,其作用与Baked Indirect mode一致,其间接光照预烘培至light map(static object)与light probed(dynamic object)中,针对dynamic object与static object,都采用实时阴影计算;烘焙的精度,烘多少个像素到颜色贴图上,数字越小,烘焙越快,同时对生。 阅读详情

原文地址  http://www.kankanews.com/ICkengine/archives/85875.shtml


上文咱们学了surface shader。这玩意在开始的时候啊,在定义哪个函数处理surface时用一定要指定Lighting model(即光照模型)的。自带的是Lambert和BlinnPhong.本文首先对这两个进行说明,后面讲解如何自定义光照模型及对官方实例的解析。http://docs.unity3d.com/Documentation/Components/SL-SurfaceShaderLighting.html

一、简单光反射模型

1.反射,其实就是光照到物体上,然后再由物体反射出去。这种过程就叫反射。

2.漫反射,物体表面可能是不光滑的,因此自然法线就不是均匀的,那么这种情况下,当几条平行光照向物体时,反射回来的光线就不再是平行的了,这种情况叫漫反射。

3.镜面反射:与漫反射对应,如果物体表面光滑,即法线均匀(不一定都平行,会有曲面的情况),则反射回来的也是均匀的,这种情况叫镜面反射。

4.环境光:光线照到指定物体的周围物体,这时指定物体上有光线反射到,这种光可称为环境光或泛光。

5.光照 = 反射光 + 镜面光 + 环境光 + 自发光。

对于简单光反射模型: 入射光 = 反射光 + 吸引光。而实际上来说还需要加上投射光与散射光。

二、Lambert和BlinnPhong

1.冯式反射模型:Phong reflection 是一种将漫反射与镜面反射进行关联在一些的反射方法。

2.Lambert:一种主要应用于漫反射的光照模型。

3.BlinnPhong: 一种主要应用于镜面反射的光照模型。

三、自定义光照模型

1.规则:定义一个函数,必须以 Lighting开头,可以写在shader文件里的任意位置或其他include的文件。
=>half4 LightingName (SurfaceOutput s, half3 lightDir, half atten);  这种是无viewDir,在上文中有说到viewDir就是返回给视角的方向,不用依赖此值,就类似于漫反射的效果。因为漫反射中出来的光线是由不规则的表面来决定。

=>half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten); 这个方法是相对于上面的,需要依赖于viewDir。

=>half4 LightingName_PrePass (SurfaceOutput s, half4 light); 这个方法是可选的,如果需要光照延时(deferred),就加上此方法,不写则全部采用快速光照(forward)。

2.自定义解码光照

注意,如果使用了LightingName_PrePass,则光照解码的方法在此方法之前,因此是有了光照延时。具体会针对与SingleLightMapping、DualLightMapping和StandardLightMapping三种的方法,与LightMapping的定义函数类似,具体的这里不介绍,可参考官方文档:http://docs.unity3d.com/Documentation/Components/SL-SurfaceShaderLighting.html

三、实例学习

1.自定义一个简单的漫反射光照模型:

#pragma surface surf SimpleLambert  //1

half4 LightingSimpleLambert (SurfaceOutput s, half3 lightDir, half atten) { //2
    half NdotL = dot (s.Normal, lightDir);  //3
    half4 c;   //4
    c.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten * 2);  //5
    c.a = s.Alpha; //6
    return c; //7
}

//1: 定义使用SimpleLambert做为光照模型

//2: 光照模型的定义。这里说说atten,根据atten的意思(衰减器),可以理解到,这个参数就是光照的衰减值。

//3:算一点积,光照方向与法线的点积,可理解为光照与法线的夹角。

//4:定义输出的颜色四元组。

//5:光照的颜色 = 物体反射颜色 * 原光的颜色* 经过折射的衰减颜色。_LightColor0是在Lighting.cginc 里定义的,我理解成反射光的颜色。另外还有一个_SpecColor,对应是镜面反射光的颜色。此处由于资料稀缺,全部个人的学习所得,如有错误,欢迎指出!

//6:设置光的透明与反射透明一致。

//7:返回。

效果:

2.Diffuse wrap

#pragma surface surf WrapLambert

half4 LightingWrapLambert (SurfaceOutput s, half3 lightDir, half atten) {
    half NdotL = dot (s.Normal, lightDir);
    half diff = NdotL * 0.5 + 0.5;  //!
    half4 c;
    c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten * 2);
    c.a = s.Alpha;
    return c;
}

此1不同的只是//! 处,这里算得一个diff,目的是将原得出的点积单位从[-1,1]转换成[0,1]之间。

这样做的用法,在各方问人,加上自己思想,想到的是将所有的坐标转成正值,这样,在其接受到光源反射的所有地方都会有光,这样使得光照的范围扩大了不少。

3.Toon Ramp

#pragma surface surf Ramp

sampler2D _Ramp;

half4 LightingRamp (SurfaceOutput s, half3 lightDir, half atten) {
    half NdotL = dot (s.Normal, lightDir);
    half diff = NdotL * 0.5 + 0.5;
    half3 ramp = tex2D (_Ramp, float2(diff)).rgb;  //1
    half4 c;
    c.rgb = s.Albedo * _LightColor0.rgb * ramp * (atten * 2);
    c.a = s.Alpha;
    return c;
}

这里对比于2,把本来是固定的diff,再加上一个材质。

//1中,直接将diff强转成float2的坐标系,向_Ramp的材质中查找出相应的rgb。最终也以此rgb值及其他光照值得出光照的rgb值。这种效果可以考虑来做光晕。这里我用一张具体的图,以float2(diff)为uv找的效果会有点奇怪。不过现象可以反映出来。

效果:

4.Simple Specular

#pragma surface surf SimpleSpecular

half4 LightingSimpleSpecular (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) {
     half3 h = normalize (lightDir + viewDir);

     half diff = max (0, dot (s.Normal, lightDir));

     float nh = max (0, dot (s.Normal, h));
     float spec = pow (nh, 48.0);

     half4 c;
     c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * (atten * 2);
     c.a = s.Alpha;
     return c;
}

这个例子是自定义一个镜面反射的例子。c.rgb 的组成可拆成一个漫反射和一个镜面反射的组合。

c.rgb = (s.Albedo * _LightColor0.rgb * diff * (atten * 2)) + (_LightColor0.rgb * spec * (atten * 2));   

前半段就是漫反射,不讲了。后面半段区别用到了镜面反射值。而这个值来自于:

float nh = max (0, dot (s.Normal, normalize (lightDir + viewDir)));

首先,光的方向和视角方向都是决定镜面反射的重要因素,不能没lightDir,否则镜面反射则只跟视角来了,那样是不现实的。因此此处需要让两个方向的向量之和与表面法线进行点积。这个nh范围是在大于0的。由于两个单位向量点积,因此得出的值则是 0到1之间。

后面取pow是为了放小nh的值,其值越小,则镜面反射就越小。

上效果:



Unity 之 官网下载地址,方便各个版本的 Unity 安装包下载 Unity 之 官网下载地址,方便各个版本的 Unity 安装包下载 目录 Unity 之 官网下载地址,方便各个版本的 Unity 安装包下载 一、简单介绍 二、各个版本下载入口网址 一、简单介绍 在 Unity 的下载地址现在不是很好找,这里保存一下 Unity 各个版本的下载地址,方便后期使用。 二、各个版本下载入口网址 网址:https://unity.cn/releases ... 阅读详情

相关推荐

【Unity Shaders】概述及Diffuse Shading介绍

概述 几个月以前我就一直在找关于Unity Shader相关的资料,大三的时候有一门叫《计算机图形学》,让我觉得如果游戏程序员要从beginner成长为advancer,就必须了解底层渲染的一些知识。 Unity3D无疑是一个非常出色的游戏引擎,它让很多独立开发者真正能够独立开发一款让自己满意的游戏,而不需要考虑那些烦人的细节,正如Unity宣称的那样,让他们来做那些令人抓狂的事情吧!

candycat 2万+

Unity官方中文网站

中国地区下载unity的版本地址: https://unity.cn/releases/lts unity中文文档:https://docs.unity.cn/cn/current/Manual/index.html unity中国官方学习网址:https://learn.unity.com/search

刘培玉-大王 9967

Unity开源项目实战:从零构建《暗黑地牢》复刻版全流程指南

Unity作为主流的跨平台游戏开发引擎,其核心价值在于提供了一套完整的工具链和组件化架构,使开发者能够高效构建2D/3D游戏。其工作原理基于场景管理、物理引擎、渲染管线与脚本驱动的逻辑系统,通过C#脚本控制游戏对象行为,实现复杂的交互逻辑。在游戏开发领域,Unity的技术价值体现在快速原型验证、资源管理优化以及多平台发布能力,尤其适合独立开发者和小型团队。应用场景广泛覆盖了从休闲手游到硬核PC游戏的全类型开发。本文聚焦于一个具体的Unity开源项目——基于Unity引擎复刻的《暗黑地牢》游戏,深入剖析其项目

weixin_34126557的博客 562

Unity官网地址变更为https://unity.cn/

注意:Unity官网地址变更为 https://unity.cn/

linxinfa的专栏 6万+

Unity GPU流体模拟:PBD算法与计算着色器实战指南

流体模拟是计算机图形学与游戏开发中的关键技术,用于模拟水、烟雾等自然现象的运动。其核心原理基于物理定律,通过粒子系统或网格方法求解流体动力学方程。在实时应用领域,传统的CPU模拟难以处理大规模粒子计算,因此GPU加速技术成为关键,它利用显卡的并行计算能力大幅提升性能。基于位置的动力学(PBD)方法因其稳定性与体积保持特性,特别适合实时流体模拟。在Unity引擎中,开发者可借助计算着色器(Compute Shader)实现高效的GPU流体模拟,这为游戏特效、VR体验和实时可视化项目带来了新的可能。本文围绕PB

weixin_30603633的博客 340

Unity项目接入MCP与trae:AI辅助开发实战指南

在AI辅助编程领域,Model Context Protocol(MCP)作为一种标准化的上下文协议,为AI模型与外部工具、数据源之间建立了通用通信桥梁。其核心原理是通过定义统一的接口规范,使AI能够结构化地访问和操作项目资源,从而突破传统AI工具仅能处理片段化信息的局限。这一技术的核心价值在于实现了AI对项目上下文的深度感知,显著提升了代码生成、问题调试和资产理解的精准度。在游戏开发与软件工程实践中,MCP协议常与新兴的AI编程工具(如trae)结合,为Unity等开发环境提供智能辅助。本文聚焦于Unit

weixin_33910385的博客 346

Unity shader 官网文档全方位学习(二)————Lighting model及自定义Lighting model

http://www.kankanews.com/ICkengine/archives/85868.shtml

u011198619的专栏 496

Unity虚拟角色开发:UniVRM环境配置、核心功能与性能优化全指南

在3D虚拟角色开发领域,模型格式的标准化与互操作性是实现资产高效流通的关键。glTF作为开放的3D传输格式标准,为跨平台应用奠定了基础。VRM格式基于glTF扩展,专门针对虚拟角色定义了骨骼、表情、材质及物理模拟等规范,解决了角色资产在不同软件和平台间的兼容性问题。其技术价值在于为Unity等引擎提供了一套完整的角色创建、编辑与运行时操作工具链,极大提升了开发效率。UniVRM作为VRM在Unity中的官方实现,通过处理材质转换、人形骨骼映射及SpringBone物理系统等复杂环节,使开发者能专注于角色行为

weixin_33670713的博客 376

Unity面试核心考点与实战指南:从生命周期到DOTS架构

在游戏开发与实时3D应用领域,掌握引擎核心原理是构建稳定高效项目的基础。理解组件化架构、渲染管线与资源管理机制,能够帮助开发者从底层优化应用性能与用户体验。这些技术通过数据导向设计、多线程计算与模块化解耦,为处理大规模场景、复杂逻辑与跨平台部署提供了工程实践价值。尤其在Unity开发中,对生命周期管理、内存优化及AssetBundle等热词的高效运用,直接关系到项目的流畅度与可维护性。本文聚焦于Unity求职中的高频考点,系统梳理从基础概念到高级特性的知识体系,为应对笔试面试提供清晰的实战路径。

weixin_33904756的博客 427

Unity打包PICO4 APK全攻略:环境配置、Gradle报错与性能优化

在移动应用与游戏开发中,环境配置与构建流程是确保项目顺利打包部署的基础环节。其核心原理在于协调开发工具链(如Unity引擎、Android SDK、NDK、JDK)与硬件平台SDK之间的版本依赖与接口兼容性。这一过程的技术价值在于为开发者提供稳定、高效的构建环境,避免因环境不一致导致的编译失败、运行时错误等问题,从而提升开发效率与项目可靠性。在VR/AR应用开发、移动游戏等场景中,环境配置的准确性直接关系到应用能否在目标设备(如PICO4等VR一体机)上正常运行。本文将聚焦于Unity引擎与PICO4设备间

weixin_30681121的博客 492

Unity开发效率革命:深度配置Kiro AI助手实现规格驱动开发

在软件工程领域,AI辅助编程正从简单的代码补全向理解项目整体架构的智能协作演进。其核心原理是通过自然语言处理与代码分析技术,让AI模型深度理解项目规格、技术栈与设计模式,从而生成更符合上下文的代码。这一技术价值在于将开发者从重复性编码中解放,转向更高层的架构设计与逻辑规划。在游戏开发特别是Unity生态中,面对复杂的场景管理、预制体系统和组件化架构,传统AI工具常因缺乏项目上下文而显得力不从心。通过引入规格驱动开发理念,开发者可以预先定义项目结构、编码规范和功能模块,使AI助手能像资深架构师一样思考。本文聚

weixin_33912638的博客 929

基于MCP协议实现AI智能体与Unity编辑器的深度集成

MCP(Model Context Protocol)是一套标准化的AI模型与外部工具通信协议,它定义了AI如何安全、结构化地与专业软件交互。其核心原理是通过JSON-RPC实现双向通信,将AI的“大脑”与软件的“手眼”连接起来,使AI能理解上下文并执行具体操作。这一技术为AI Agent(智能体)开发提供了通用框架,极大提升了自动化潜力。在游戏开发领域,Unity作为主流引擎,其开发流程中存在大量重复性操作。通过构建MCP Server作为桥梁,并利用Unity Editor HTTP API,可以实现A

weixin_30784501的博客 638

Unity游戏开发入门:从零搭建交互场景与核心概念解析

游戏引擎是现代游戏开发的核心工具,它通过封装底层图形渲染、物理模拟、音频处理等复杂系统,为开发者提供高效的创作框架。其工作原理基于模块化设计,允许通过组件组合快速构建游戏对象,并通过脚本语言(如C#)实现自定义逻辑。这种架构显著降低了开发门槛,提升了跨平台部署的效率,广泛应用于独立游戏、移动应用、虚拟现实及仿真训练等领域。本文以Unity引擎为例,结合**游戏对象**与**组件**这两个核心热词,详解如何通过可视化编辑器与C#脚本,快速搭建一个包含物理交互与触发检测的完整迷你游戏场景,帮助初学者理解引擎的核

weixin_33721427的博客 453

Unity VR开发入门:从环境搭建到核心交互实现

虚拟现实(VR)技术通过计算机模拟三维环境,为用户提供沉浸式体验,其核心在于实时渲染与自然交互。在工程实践中,Unity引擎凭借其完善的工具链和活跃的社区,成为VR应用开发的主流选择。通过其模块化的XR支持,特别是XR Interaction Toolkit,开发者能够高效处理抓取、传送等核心交互,快速构建原型。本文聚焦于Unity VR开发,详细拆解了从项目初始化、环境配置,到利用XR Interaction Toolkit实现抓取、传送及UI交互的完整流程,并分享了性能优化与部署上线的实用技巧,为开发者

dianning8393的博客 544

Unity 2021 URP项目闪退:从驱动到管线的系统性诊断与修复

在游戏开发与实时渲染领域,图形渲染管线是决定项目视觉表现与运行稳定的核心技术架构。其原理在于通过一系列可编程或可配置的阶段,将3D场景数据转换为最终的2D像素图像。对于使用Unity引擎的开发者而言,从内置渲染管线(Built-in)迁移至通用渲染管线(URP)是提升图形效果与跨平台兼容性的常见技术升级。然而,这一过程常伴随编辑器崩溃(Crash)或进程异常等棘手问题,严重阻碍开发流程。这类问题的技术价值在于,其排查过程深度融合了图形API调用、驱动兼容性、资源序列化与项目环境配置等多方面知识,是检验开发者

weixin_30527323的博客 337

Rider 2025.1深度集成Unity与.NET开发全指南

IDE(集成开发环境)是现代软件工程的核心生产力载体,其本质是编译器、调试器、语言服务器与项目系统的协同中枢。在.NET生态中,C#语言的语义理解能力直接决定开发效率上限;而Unity作为主流游戏引擎,其运行时特性(如MonoBehaviour生命周期、序列化机制)要求IDE具备深度引擎感知能力。Rider 2025.1通过解耦式三进程架构(UI主进程+后台.NET语言服务+Unity/Unreal桥接层),首次实现对.NET 8、Unity 2023+、Unreal Engine 5.3等多运行时的原生语

weixin_33739646的博客 338

腾讯混元3D世界模型2.0实战:从AI生成到Unity/UE引擎集成全指南

生成式AI正在重塑3D内容创作流程,其核心原理是通过大语言模型理解自然语言描述,并驱动多阶段生成流水线自动创建3D资产与场景。这项技术为游戏开发、虚拟仿真和数字孪生领域带来了革命性的效率提升,能够将传统需要数周的美术协作流程压缩至几分钟。在实际应用中,开发者需要掌握本地环境部署、模型推理优化以及生成资产与主流游戏引擎的集成工作流。本文以腾讯开源的混元3D世界模型为例,详细解析如何将AI生成的场景通过插件高效导入Unity和Unreal Engine,并针对光照烘焙、材质调整、性能优化等工程实践问题提供解决方

cnracht8153的博客 1392

基于MCP协议与Cursor的Unity AI副驾驶:从代码补全到自动化开发

在软件开发领域,AI代码补全工具已成为提升效率的标配,但其能力往往局限于生成代码片段,开发者仍需手动执行创建、挂载、测试等操作。Model Context Protocol(MCP)作为一种新兴的标准化通信协议,旨在解决AI模型与各类工具间的深度集成问题。它通过定义统一的请求响应格式,充当AI与执行环境间的“翻译官”与“调度中心”,实现了从“文本建议”到“自动化操作”的范式跃迁。在游戏开发场景中,结合Cursor编辑器与Unity-MCP插件,MCP协议能将自然语言指令直接转化为Unity编辑器内的实际AP

weixin_30591551的博客 354
上一篇: Unity shader 官网文档全方位学习(一)
下一篇: unity animator的一种使用方式
啊哈2020
博客等级 码龄18年 124粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值