【从UnityURP开始探索游戏渲染】专栏-直达

漫反射基本流程

漫反射遵循兰伯特定律(Lambert's Cosine Law),其核心流程如下:

  • 法线准备‌:获取表面法线向量(通常来自顶点法线或法线贴图)
  • 光源方向计算‌:确定光源到表面点的单位方向向量
  • 点积运算‌:计算法线向量与光源方向的点积(N·L)
  • 能量约束‌:使用saturate函数将结果限制在[0,1]范围
  • 颜色混合‌:将结果与光源颜色和表面反照率(albedo)相乘

数学表达式:

$漫反射 = 光源颜色 × 表面反照率 × max(0, N·L)$

漫反射基本原理

漫反射遵循兰伯特定律(Lambert's Law),描述光线在粗糙表面均匀散射的现象。其核心特点是:

  • 光线入射角度影响反射强度
  • 表面法线方向决定反射分布
  • 与观察角度无关的各向同性反射

兰伯特定律 Lambert’s law

$Cdiffuse=(Clight*Mdiffuse)max(0,n·I)$

fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));

半兰伯特

$Cdiffuse=(Clight*Mdiffuse)(a(n·I)+b)$

绝大多数a和b都为0.5

$Cdiffuse=(Clight*Mdiffuse)(0.5(n·I)+0.5)$

Unity URP中的实现细节

核心实现位置

URP中的漫反射计算主要分布在以下文件:

  • Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl

实现原理

  • 法线处理‌:

    • 世界空间法线转换
    • 法线贴图支持
    • 双面渲染处理
  • 光源计算‌:
    • 主光源方向计算
    • 附加光源循环处理
    • 点光源/聚光灯方向计算
  • 漫反射核心‌:
    • 使用half精度优化
    • 能量守恒处理
    • 多光源叠加支持

关键代码实现

  • UnityURP_漫反射实现

    hlsl
    // 简化版Lambert漫反射实现
    half3 DiffuseLighting(Light light, half3 normalWS, half3 albedo)
    {
    half NdotL = saturate(dot(normalize(normalWS), light.direction));
    return light.color * albedo * NdotL;
    } // 完整光照计算入口
    half3 UniversalFragmentBlinnPhong(InputData inputData, SurfaceData surfaceData)
    {
    // 初始化光照结果
    half3 color = surfaceData.emission; // 主光源漫反射计算
    Light mainLight = GetMainLight();
    color += DiffuseLighting(mainLight, inputData.normalWS, surfaceData.albedo); // 附加光源计算
    uint pixelLightCount = GetAdditionalLightsCount();
    for (uint lightIndex = 0; lightIndex < pixelLightCount; ++lightIndex)
    {
    Light light = GetAdditionalLight(lightIndex, inputData.positionWS);
    color += DiffuseLighting(light, inputData.normalWS, surfaceData.albedo);
    } return color;
    }

快速调用方法

在URP着色器中调用漫反射的标准方式:

自定义着色器方式‌:

hlsl
// 片元着色器示例
half4 frag(Varyings input) : SV_Target
{
// 初始化表面数据
SurfaceData surfaceData;
InitializeStandardLitSurfaceData(input.uv, surfaceData); // 准备光照输入数据
InputData inputData;
InitializeStandardLitInputData(input, surfaceData.normalTS, inputData); // 计算漫反射光照
half4 color = UniversalFragmentBlinnPhong(inputData, surfaceData); return color;
}

Shader Graph可视化方式‌:

  • 使用"Dot Product"节点计算N·L
  • 使用"Multiply"节点混合颜色
  • 连接至"Fragment"输出的Base Color通道

URP选择此方案的原因

性能优化‌:

  • 使用half精度计算
  • 内置光照循环优化
  • 最小化分支预测

物理一致性‌:

  • 线性空间计算
  • 正确的光照衰减(通过颜色与距离和阴影衰减相乘做到)

扩展性‌:

  • 支持多光源场景
  • 与PBR工作流兼容
  • 可扩展自定义光照模型

跨平台支持‌:

  • 适配移动端TBDR架构
  • 支持SRP Batcher优化
  • 兼容各种渲染路径

在URP中,这种实现方式既保持了经典光照模型的直观性,又通过现代渲染管线的优化手段确保了高性能表现,特别适合需要跨平台部署的项目。


【从UnityURP开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)

【光照】[漫反射diffuse]以UnityURP为例的更多相关文章

  1. CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection)

    CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection) 2016-08-13 由于CSh ...

  2. Unity Shader入门教程(二)最基本的Diffuse和Normal样例

    本教程参考了<猫都能学会的Unity3dShaderLab教程.CHM>, 1.请上网搜索并下载此文件. 2.随后再下载里面提到的素材: http://vdisk.weibo.com/s/ ...

  3. 【Unity Shader】三、漫反射Diffuse Shader例子

    学习目标: 漫反射Diffuse Shader,逐顶点计算和逐像素计算. 半兰伯特(HalfLambert)光照模型. 结合材质自身的色彩(Material Color)及环境光(Ambient). ...

  4. Unity3D 开发之shader教程(浅谈光照之漫反射diffuse)

    在游戏开发过程中,光照应该是必不可少部分,当然,这是指大多数的稍微大型一些的3D游戏会需要,给模型或者山山水水加上光照,会看上去更加的真实,获得更好的体验.一个本身不发光物体显示什么颜色,在于本身反射 ...

  5. Unity 5 中的全局光照技术详解

    貌似是某位好人翻译的 https://unity3d.com/cn/learn/tutorials/topics/graphics/unity-5-lighting-and-rendering#rd? ...

  6. Unity 5 中的全局光照技术详解(建议收藏)

    本文整理自Unity全球官方网站,原文:UNITY 5 - LIGHTING AND RENDERING (文章较长,请耐心阅读)简介全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法, ...

  7. Phong光照以及其他

        在说光照之前,有必要先弄清法线的变换,假设Mworld 将物体的定点一一变换到世界空间,如果我们对法线实施同样的变化,,以为能将法线变换到世界空间,但世界上变换之后的法线不再与表面垂直,就像下 ...

  8. Unity 5--全局光照技术

    本文整理自Unity全球官方网站,原文:UNITY 5 - LIGHTING AND RENDERING 简介全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法,要精确的仿真全局光照非常 ...

  9. 04、Unity 5--全局光照技术

    本文整理自Unity全球官方网站,原文:UNITY 5 - LIGHTING AND RENDERING 简介全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法,要精确的仿真全局光照非常 ...

  10. 《The Cg Tutorial》阅读笔记——光照 Lighting

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4796306.html 光照 Lighting 一.常见的几种光照模型 二.基本的光照 ...

随机推荐

  1. .net request——server——response学习

    request 1.Request.UrlReferrer 请求来的URL context.Response.ContentType = "image/png"; //动态创建图片 ...

  2. 实现一个双向绑定和v-model

    发布订阅模式 我把发布订阅的实现类单独提出来,这样代码看起来简洁 /* * 发布订阅 **/ class Pubsub { static instance = null; // 单例 static g ...

  3. 前端开发系列065-JQuery篇之框架简单介绍

    一.jQuery简介 jQuery是一款优秀的javaScript库(框架),该框架凭借简洁的语法和跨平台的兼容性,极大的简化了开发人员对HTML文档,DOM,事件以及Ajax的操作. 主旨口号:写的 ...

  4. killall bluetoothd 一直不成功

    最后调查发现是bluetman 惹得祸 贴上他的守护程序,以后也可以写一个 #! /usr/bin/python3 from __future__ import print_function from ...

  5. javase 总结 (狂神说)

    简介 rt,以作记录 参考链接 https://blog.csdn.net/czc514/article/details/106057366

  6. opengl 学习 之 11 lesson

    opengl 学习 之 11 lesson 简介 2D纹理.简单来说就是用一个四边形的小框框,UV映射图片. 这里用了多个shader,一个是关于模型的,一个是关于图片的. link http://w ...

  7. Arm Pro脱壳简单教程

    背景 之前写了一个超星学习通接口逆向的文章,应网友要求分享下使用Arm Pro脱壳,虽然挺简单的,但还是写下吧. 脱壳步骤 打开Arm Pro,点击右下角按钮选择APP 选第二个,一键云脱壳Pro 顺 ...

  8. POLIR-Lawsuits: 法院审核通过后迟迟不立案可以提起上诉 + 当法院迟迟不立案怎么办

    法院审核通过后迟迟不立案可以提起上诉. 法院一般需要在当事人起诉后七日内决定是否立案,如果拖着不立案可以问明原因, 要求法院在规定期限内立案,如果裁定不予受理,原告对裁定不服的,可以提起上诉. 立案: ...

  9. Feature Engineering: 超好用的特征工程Python库: feature_engine

    https://leanpub.com/feature-selection-machine-learning-feature-engine https://github.com/feature-eng ...

  10. Linux VIRT-RES-SHR内存概念理解

    在 Linux CentOS 系统中,VIRT(虚拟内存).RES(常驻内存)和 SHR(共享内存)是 top 命令中三个关键的内存指标,理解它们的概念和联系对系统监控.性能调优和内存泄漏排查至关重要 ...