当前位置: 首页 > article >正文

Unity Shader 实战:从零掌握 PBR 基于物理的渲染

一、什么是 PBRPBRPhysically Based Rendering基于物理的渲染是现代游戏、影视行业的主流渲染方案。与传统的 Blinn-Phong 光照相比PBR 的核心区别在于对比项传统光照Blinn-PhongPBR材质参数高光颜色、高光强度艺术调整金属度、粗糙度物理可测量能量守恒❌ 无保证✅ 严格遵守跨光照一致性❌ 不同环境需重调✅ 任何光照下表现正确效果上限中等照片级真实感PBR 广泛应用于《赛博朋克2077》《艾尔登法环》《战神》等 AAA 大作以及 Unity、Unreal、Blender 等主流引擎的默认材质系统。一句话理解PBR 是用物理规律约束美术行为——只要参数符合现实材质在任何光照环境下都自然正确。二、PBR 的三大核心条件一个渲染系统要称得上 PBR必须同时满足以下三条① 微表面理论Microfacet Theory宏观上看起来光滑的表面微观上由无数朝向各异的**微小镜面微平面**组成。粗糙表面高 Roughness 光滑表面低 Roughness ↗↘↗↙↗↘↗↙ → → → → → → 微平面朝向分散 微平面近乎平行 → 高光模糊、分散 → 高光锐利、集中**粗糙度Roughness**参数控制微平面的分散程度Roughness 0完美镜面高光极小极亮Roughness 1完全漫反射无明显高光② 能量守恒Energy Conservation反射出去的光能 ≤ 接收到的光能不能无中生有。入射光 漫反射 镜面反射 吸收 1.0 kD kS 损耗实现方式hlsl复制float3 F FresnelSchlick(HdotV, F0); // 镜面反射比例 float3 kS F; float3 kD (1.0 - kS) * (1.0 - metallic); // 漫反射 1 - 镜面 // 金属材质无漫反射metallic1 → kD0③ 基于物理的 BRDF使用符合物理规律的双向反射分布函数描述光照交互详见下一章。三、核心数学Cook-Torrance BRDFBRDFBidirectional Reflectance Distribution Function双向反射分布函数定义了入射光在某观察方向上被反射的比例。PBR 中最常用的是Cook-Torrance BRDFD(h) · F(v,h) · G(l,v,h) fr(l, v) kD·------ ───────────────────── π 4·(n·l)·(n·v) 漫反射项Lambert 镜面反射项Cook-Torrance其中D、F、G三项各司其职3.1 D —— 法线分布函数GGX描述有多少微平面的法线朝向了半角向量 h决定高光形状。GGXTrowbridge-Reitz是当前工业标准hlsl复制float DistributionGGX(float NdotH, float roughness) { float a roughness * roughness; float a2 a * a; float NdotH2 NdotH * NdotH; float denom (NdotH2 * (a2 - 1.0) 1.0); return a2 / (PI * denom * denom); }为什么用 roughness²直接用 roughness 线性值时高光变化不自然平方后符合人眼感知的线性变化。GGX 相比老牌的 Beckmann 分布优势在于**长尾效应**高光边缘有更自然的渐隐非常接近真实金属质感。3.2 F —— 菲涅耳方程Fresnel描述不同入射角下镜面反射率的变化——观察角越斜反射越强。生活中随处可见菲涅耳效应正视水面看到水底侧视水面看到倒影。垂直观察grazing 0 掠射观察grazing 90° 反射率 ≈ F0基础值 反射率 → 1.0几乎全反射使用Schlick 近似高效计算hlsl复制float3 FresnelSchlick(float cosTheta, float3 F0) { return F0 (1.0 - F0) * pow(saturate(1.0 - cosTheta), 5.0); }F0基础反射率由材质决定非金属塑料、皮肤、木头F0 ≈float3(0.04, 0.04, 0.04)约 4%金属F0 Albedo 颜色金的 F0 是金黄色铁的 F0 是灰色hlsl复制// 金属工作流中 F0 的计算 float3 F0 lerp(float3(0.04, 0.04, 0.04), albedo, metallic);3.3 G —— 几何遮蔽函数Smith描述微平面之间的自遮挡和自阴影粗糙表面的微平面会互相遮挡导致能量损失。↓ 光线被相邻微平面遮挡 ↗↘↗↘↗↘↗↘ ←→←→←→←→ ← 部分出射光被阻挡几何遮蔽使用Smith Schlick-GGX组合hlsl复制float GeometrySchlickGGX(float NdotX, float roughness) { float r roughness 1.0; float k (r * r) / 8.0; // 直接光照用此 k 值 return NdotX / (NdotX * (1.0 - k) k); } float GeometrySmith(float NdotV, float NdotL, float roughness) { // 分别计算视线方向和光线方向的遮蔽相乘 return GeometrySchlickGGX(NdotV, roughness) * GeometrySchlickGGX(NdotL, roughness); }四、金属度/粗糙度工作流现代 PBR 流程统一使用Metallic-Roughness工作流一套贴图打天下贴图通道含义AlbedoBaseColorRGB固有色金属存储 F0非金属存储漫反射色MetallicR灰度金属度0 非金属1 金属RoughnessR灰度粗糙度0 完全光滑1 完全粗糙NormalRGB法线贴图增加表面细节AOR灰度环境遮蔽凹陷处变暗典型材质参数参考材质MetallicRoughnessF0黄金1.00.1(1.0, 0.77, 0.34)铁1.00.6(0.56, 0.57, 0.58)塑料光滑0.00.1(0.04, 0.04, 0.04)皮肤0.00.7(0.03, 0.03, 0.03)木头0.00.8(0.04, 0.04, 0.04)五、完整 Shader 实现URP5.1 Shader 属性声明hlsl复制Shader Custom/PBR { Properties { _AlbedoMap (Albedo, 2D) white {} _AlbedoColor (Albedo Color, Color) (1,1,1,1) _NormalMap (Normal Map, 2D) bump {} _MetallicMap (Metallic, 2D) black {} _Metallic (Metallic, Range(0,1)) 0 _RoughnessMap (Roughness, 2D) white {} _Roughness (Roughness, Range(0,1)) 0.5 _AOMap (AO Map, 2D) white {} } SubShader { Tags { RenderTypeOpaque RenderPipelineUniversalPipeline } Pass { Name ForwardLit Tags { LightModeUniversalForward } HLSLPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE #include Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl #include Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl #define PI 3.141592653589795.2 D、F、G 三大函数hlsl复制// ── DGGX 法线分布函数 ────────────────────────── float D_GGX(float NdotH, float roughness) { float a roughness * roughness; float a2 a * a; float d (NdotH * NdotH * (a2 - 1.0) 1.0); return a2 / (PI * d * d); } // ── F菲涅耳Schlick 近似──────────────────── float3 F_Schlick(float cosTheta, float3 F0) { return F0 (1.0 - F0) * pow(saturate(1.0 - cosTheta), 5.0); } // ── G几何遮蔽Smith Schlick-GGX─────────── float G_SchlickGGX(float NdotX, float roughness) { float r roughness 1.0; float k (r * r) / 8.0; return NdotX / (NdotX * (1.0 - k) k); } float G_Smith(float NdotV, float NdotL, float roughness) { return G_SchlickGGX(NdotV, roughness) * G_SchlickGGX(NdotL, roughness); }5.3 顶点着色器hlsl复制struct Attributes { float4 positionOS : POSITION; float3 normalOS : NORMAL; float4 tangentOS : TANGENT; float2 uv : TEXCOORD0; }; struct Varyings { float4 positionCS : SV_POSITION; float3 positionWS : TEXCOORD0; float3 normalWS : TEXCOORD1; float3 tangentWS : TEXCOORD2; float3 bitangentWS: TEXCOORD3; float2 uv : TEXCOORD4; }; Varyings vert(Attributes IN) { Varyings OUT; VertexPositionInputs posInputs GetVertexPositionInputs(IN.positionOS.xyz); VertexNormalInputs normInputs GetVertexNormalInputs(IN.normalOS, IN.tangentOS); OUT.positionCS posInputs.positionCS; OUT.positionWS posInputs.positionWS; OUT.normalWS normInputs.normalWS; OUT.tangentWS normInputs.tangentWS; OUT.bitangentWS normInputs.bitangentWS; OUT.uv TRANSFORM_TEX(IN.uv, _AlbedoMap); return OUT; }5.4 完整片元着色器hlsl复制六、法线贴图详解法线贴图是 PBR 材质中非常重要的一环它在不增加面数的情况下为模型表面添加细节。无法线贴图 有法线贴图 平滑光照无细节 凹凸感、划痕、纹理细节 ┌─────────────┐ ┌~~~~~─────~~~~~┐ │ │ │ 表面有起伏感 │ └─────────────┘ └~~~~~─────~~~~~┘法线贴图的 RGB 通道存储的是切线空间中的法线方向R → X左右偏移G → Y上下偏移注意 OpenGL/DX 方向差异B → Z深度通常偏蓝hlsl复制// URP 中解码法线贴图并变换到世界空间 float3 normalTS UnpackNormal(SAMPLE_TEXTURE2D(_NormalMap, sampler_NormalMap, uv)); float3x3 TBN float3x3(tangentWS, bitangentWS, normalWS); float3 N normalize(mul(normalTS, TBN));七、色调映射与 Gamma 校正PBR 计算在线性空间中进行但显示器是 Gamma 空间必须做两步处理步骤一色调映射Tone MappingHDR高动态范围光照值映射到 LDR0~1显示范围hlsl复制// Reinhard 色调映射简单实用 color color / (color 1.0); // ACES 色调映射更接近电影调色对比更强 float3 ACESToneMapping(float3 x) { float a 2.51, b 0.03, c 2.43, d 0.59, e 0.14; return saturate((x*(a*xb))/(x*(c*xd)e)); }步骤二Gamma 校正hlsl复制// 线性空间 → Gamma 2.2 空间用于显示器输出 color pow(max(color, 0), 1.0 / 2.2);注意如果你使用的是 URP 并开启了 HDR Post Processing色调映射和 Gamma 校正通常由后处理管线自动完成Shader 中无需手动处理。八、效果对比不同参数表现Roughness 变化效果Roughness: 0.0 0.2 0.5 0.8 1.0 ● ● ● ● ● (镜面) (抛光) (半哑) (磨砂) (粉笔) 小亮斑 略大亮斑 中等高光 模糊高光 几乎无高光Metallic 变化效果Metallic: 0.0 1.0 ● → ● (塑料) (金属) 高光白色 高光带颜色随 Albedo 有漫反射 无漫反射全镜面九、与 NPR 的组合半写实风格PBR 和 NPR 并非对立现代游戏常常混合使用游戏策略《原神》PBR 材质工作流 NPR 卡通光照 SDF 面部阴影《崩坏星穹铁道》PBR 底层 卡通描边 Ramp 阴影《蔚蓝档案》强 NPR 卡通 少量 PBR 金属质感混合方案核心思路用 PBR 工作流制作贴图保证材质物理正确替换光照计算部分为 NPR 卡通化处理保留 F0/菲涅耳让金属感真实十、推荐学习资源资源链接说明LearnOpenGL PBRlearnopengl.com最权威的 PBR 入门教程Unity 中文课堂learn.u3d.cn三节课掌握 PBR中文毛星云 PBR 白皮书知乎专栏深度 PBR 理论完全解析Substance 材质规范AdobeHelp工业级 PBR 材质制作指南小结本文系统讲解了 PBR 的完整知识体系✅三大核心条件微表面理论、能量守恒、物理 BRDF✅DFG 三项GGX 法线分布、Schlick 菲涅耳、Smith 几何遮蔽✅金属/粗糙度工作流F0 插值、贴图规范✅完整 URP Shader从顶点到片元的完整实现✅法线贴图TBN 矩阵变换✅色调映射 Gamma 校正Reinhard / ACESPBR 是现代渲染的基础理解它不仅能写出更好的 Shader也能与美术同学更高效地沟通材质制作规范。

相关文章:

Unity Shader 实战:从零掌握 PBR 基于物理的渲染

一、什么是 PBR? PBR(Physically Based Rendering,基于物理的渲染)是现代游戏、影视行业的主流渲染方案。 与传统的 Blinn-Phong 光照相比,PBR 的核心区别在于: 对比项传统光照(Blinn-Phong&…...

全志H618

全志H618是一款很常见的芯片,主要用在电视盒子、开发板和智能家居小主机上。它主打低功耗和高性价比,在够用的性能下实现了非常好的能效比。 下面为你整理了它的核心参数和实际表现:参数类别具体规格CPU四核 ARM Cortex-A53,最高主…...

Linux 基础IO (五)深入理解文件系统

目录 一、文件系统 引入“块”概念 引入“分区”概念 引入“inode”概念 引入文件系统 分区(Partition) ext2文件系统 块组(Block Groups) Data Blocks(数据块) Block Bitmap(块位图) Inode Table(inode 表) Inode Bitmap(inode 位图) GDT(…...

收单 vs 代付 vs 收付:支付三业务快速区分

想分清收单和代付?一个例子就能看明白:收单:消费者用微信、支付宝等第三方平台付款时,资金先进入第三方支付账户,再转给商户。核心是第三方平台参与资金中转,是商户侧的收款服务。代付:消费者用…...

基于PLC的加热炉控制设计:西门子S7-200PLC组态王画面、IO表、电路图、说明书及可仿真

基于PLC的加热炉控制的设计,西门子S7-200PLC组态王画面,IO表,电路图,说明书,可仿真搞工业自动化的人都知道,PLC控制加热炉是个经典项目。这次拿西门子S7-200开刀,咱们先看现场硬件配置——炉体温…...

2. OpenClaw小龙虾(macOS)+飞书本地部署:小白10分钟搞定,保姆级教程

OpenClaw是一个开源的AI智能体,让你可以在本地部署AI助手,操作本地文件。支持通过飞书、企业微信、QQ、钉钉和Telegram等国内外通讯平台随时指挥。支持 Claude、GPT、Gemini、DeepSeek、MiniMax、通义千问和Kimi等多种模型。 集文件管理、知识管理、日程…...

装傻生存指南:软件测试从业者的AI对抗方法论

第一章 智能监控时代的测试者困境 1.1 算法评估的隐形战场 用户价值评分模型解析(LTV预测算法) 行为威胁评估矩阵:点击热图/操作路径/会话时长的量化监控 案例:某电商测试员因高频触发边界条件被风控系统标记 1.2 无害废物的…...

【材料学】基于matlab DIAGNOSE热塑性复合材料的三维拓扑映射【含Matlab源码 15183期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…...

C语言的反汇编

1.C语言的反汇编这个函数在K5里面随便写在一个地方让Keil生成反汇编:为例方便复制,制作反汇编的指令如下:fromelf --text -a -c --outputxxx.dis xxx.axfxxx.dis,是输出一个什么名字的反汇编,所以xxx填testxxx.axf&…...

C++版序列二次规划SQP求解非线性优化问题,支持多种约束条件,全源码开源,含demo与Vis...

C版序列二次规划SQP cpp程序 求解非线性优化问题的序列二次规划法cpp程序,支持目标函数和约束条件均为非线性函数,支持等式约束,不等式约束,混合约束。 源码全开源,代码及头文件共7个文件(包含描述示例demo…...

程序员生存图鉴2026:技术深耕、职业破局与可持续发展

在技术迭代加速、职场竞争白热化的2026年,程序员的生存逻辑已从“单纯会编码”升级为“技术硬实力职业软实力可持续发展”的综合比拼。本文基于CSDN百万程序员调研数据,围绕技术能力、职业发展、社区生态、生存现状、工具资源五大核心维度,拆…...

【认识-掌握】Elasticsearch的用法

Elasticsearch认识与安装倒排索引传统遍历,数据量越大遍历时间越长。性能会变差IK分词器基础概念Mapping映射属性索引库操作字段只能添加不能修改文档CRUDJavaRestClient索引库操作DSL查询叶子查询复合查询排序和分页高亮显示基于java客户端的操作基本查询排序和分页…...

COMSOL太赫兹超表面BIC与能带折叠

comsol太赫兹超表面BIC与能带折叠。超表面结构里藏着不少反直觉的物理现象,特别是当能带折叠遇上BIC(连续谱中的束缚态),总能在仿真结果里搞出些让人挠头的惊喜。最近用COMSOL折腾太赫兹频段的超表面时,发现这两个机制…...

医疗HIS系统Java如何通过控件优化病历图片文件夹的浏览器端分片加密断传?

《Java老鸟的奇幻漂流:20G文件上传与100元预算的史诗级对决》 1. 甲方需求 vs 现实预算(魔幻现实主义版) 甲方:“要支持20G文件夹上传哦,保留层级结构那种~” 我:“没问题老板,您预算是…&…...

中断很难?看完这篇就懂了

1.内核,总线,外设这三个概念是理解中断的必要前提,一个芯片具有内核、总线、外设这三个结构内核:芯片里的内核有很多架构,如ARM架构内核,它包含了许多核心部件,是整个芯片的大脑总线&#xff1a…...

MWC2026观察:通用算力开始进入“超节点时代”

导读:AI重塑CPU产业角色ChatGPT问世之后,全球算力产业的叙事几乎被GPU主导。但这恰恰遮蔽了另一个更重要的变化:AI时代以CPU为基础的通用算力并没有被削弱,反而重塑了产业地位。今天的大模型系统,从数据预处理、检索增…...

Claude 终极新手指南(2026年3月爆款版)

从 0 到熟练:这篇就够了。 顺便说一句:上周 Anthropic 那波更新,有点“把门直接踹开”的感觉。 这篇指南的目标很简单:把你从“摸索学习曲线”直接带到“立刻产出结果”。 即使你已经用 Claude 很久了,也很可能还能从中…...

强化学习算法ppo

最容易上手、最适合入门的强化学习算法是 PPO(Proximal Policy Optimization) —— 没有之一。相比于 Q-Learning、DDPG、DQN 等算法,PPO 的 “易上手” 体现在:代码实现简单、训练极少崩溃、调参门槛低、适配场景广,完…...

基于springboot企业车辆管理系统

一、系统核心定位 基于 SpringBoot 的企业车辆管理系统,是专为企业(尤其是拥有多辆公务车、货运车的中大型企业)打造的 “车辆调度 - 使用 - 维护 - 成本” 全流程数字化平台。该系统解决传统车辆管理中 “调度混乱、用车申请繁琐、维护不及时…...

springboot基于微信小程序的学院搞笑大学生竞赛管理系统设计与实现

目录系统架构设计功能模块划分数据库设计关键技术实现评审系统设计测试与部署项目里程碑项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统架构设计 采用SpringBoot作为后端框架,微信小程…...

影响力--题解

题干中给的是,切比雪夫距离的公式 如果使用暴力算法, 需要遍历每个格子A;对每个格子A,都要遍历所有格子B;计算代价。 发现复杂度太高,O((nm)2),n的二次方乘m的二次方 所以这个方法不可行。这时我…...

基于FPGA的数据同步采集处理框架:包含ADC7606芯片数据采集模块、多通道数据处理模块、D...

基于fpga的数据同步采集处理,包含adc7606芯片的数据采集模块,多通道数据处理模块,ddr3缓存模块,使用SRIO通信模块,以及各个模块的仿真文件,提供学习整个框架。 包含单独的ddr3仿真,srio通信协议仿真&#x…...

基于springboot湄潭县乡村茶产品管理系统

一、系统定位与核心目标 湄潭县作为中国著名茶产区,其乡村茶产品管理需解决传统模式中的信息分散、产业链协同低效等问题。基于SpringBoot框架开发的茶产品管理系统,旨在通过数字化手段实现以下目标: 全产业链整合:覆盖茶园种植、…...

AI智能开发代码

import openai# 设置API密钥 openai.api_key = "your_api_key_here"def generate_text(prompt, max_tokens=50):"""使用AI模型生成文本参数:prompt (str): 输入提示文本max_tokens (int): 生成文本的最大长度返回:str: 生成的文本"""t…...

JAVA 国际版多商户团购扫码核销系统源码:支持多语言 + 多商户,可直接商用运营

随着本地生活、跨境团购、连锁门店、海外文旅场景快速发展,传统单商户团购系统已无法满足多商户入驻、多语言切换、扫码秒核销、跨境支付等真实运营需求。为此,一套稳定、成熟、可直接上线的 JAVA 国际版多商户团购扫码核销系统 成为开发者、创业者、企业…...

springboot基于微信小程序的二手书交易系统

基于 SpringBoot 和微信小程序的二手书交易系统是一款专为学生、书友等群体打造的二手书交易平台,借助 SpringBoot 的高效后端处理能力和微信小程序的轻量化特性,实现二手书的发布、浏览、交易、评价等全流程数字化管理,旨在促进闲置书籍的循…...

基差贸易全流程详解:高效点价与自动化下单的最佳实践

引言:破解基差贸易的高效难题——从人工瓶颈到自动化革新 基差贸易,作为现代大宗商品交易中的核心定价模式,彻底改变了企业锁定采购/销售价格的方式。无论是农产品、金属、能源还是化工,基差贸易都成为贸易公司与生产企业应对价格…...

虚拟同步发电机自适应控制(VSG)转动惯量与阻尼系数自适应调整并网仿真研究:角频率变化率对J和...

虚拟同步发电机自适应控制(VSG)转动惯量和阻尼系数自适应控制(并网)仿真 下图附带:参考文献的自适应算法以及仿真结果 仿真结果:J和D能够很好的根据角频率变化率和角频率变化率进行自适应2018a版本以上都可…...

快期指令系统优势全解析:高效合规的期现交易新范式

引言:破解期现指令管理难题,迈向高效合规新时代 在期现交易业务的迅猛发展背景下,指令管理的复杂性与合规要求持续提升。无论是客户直连交易,还是业务经理代操,企业都面临着权限分配繁琐、审批流程冗长、指令执行不透…...

FX5U PLC数据类型详解

本文详细整理了三菱FX5U系列PLC的各类数据类型定义、取值范围、存储方式及位操作方法。---1. Bool(位)类型| 属性 | 说明 ||------|------|| **数据位** | Bool只可能是 **0 / 1** || **数据大小** | 1位 || **X、Y点** | 8进制 |输入/输出区定义- **输入…...