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

Unity3D PBR光照计算公式推导详解

前言

在Unity3D中,PBR(Physically Based Rendering,基于物理的渲染)光照模型是一种高级光照模型,它模拟了真实世界中光的传播和反射过程,从而提供了更加逼真的渲染效果。PBR光照模型的计算公式涉及多个物理参数和函数,包括反射率(Albedo)、法线分布函数(D)、菲涅尔项(F)、几何衰减项(G)等。以下是对这些参数的详细推导以及代码实现。

对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀!

技术详解

  1. 反射率(Albedo)
  • 反射率表示物体表面的基本颜色,通常通过反射率贴图获取。
  • 在Unity3D中,反射率贴图通常是一个RGB贴图,表示物体表面的颜色。

  1. 法线分布函数(D)
  • 法线分布函数描述了组成表面一点的所有微表面的法线分布概率。
  • 常用的GGX函数公式为:

DGGX​(h,n,α)=π((nh)2(α2−1)+1)2α2​

复制代码
其中,$h$是半角向量,$n$是表面法线,$\alpha$是粗糙度参数,取值范围为0到1。

3. 菲涅尔项(F)

  • 菲涅尔项描述了反射率随入射角度的变化。
  • 使用Schlick近似公式计算:

F(θ,F0​)=F0​+(1−F0​)(1−cosθ)5

复制代码
其中,$F_0$是基础反射率,$\theta$是入射角。

4. 几何衰减项(G)

  • 几何衰减项描述了由于微表面自遮挡造成的光线衰减。
  • 常用的Smith函数公式为:

G(l,v,n,k)=(1+(ln)(1−k))2(1+(vn)(1−k))21​

复制代码
其中,$l$是光照方向,$v$是观察方向,$n$是表面法线,$k$是与粗糙度相关的参数。

公式推导

PBR光照模型的最终颜色由漫反射和镜面反射组成。

  1. 漫反射
  • 漫反射的强度与光照方向和表面法线的点积成正比。
  • 漫反射颜色 = 反射率 * (1 - 菲涅尔项)。

  1. 镜面反射
  • 镜面反射的强度由法线分布函数、菲涅尔项和几何衰减项共同决定。
  • 镜面反射颜色 = 菲涅尔项 * 法线分布函数 * 几何衰减项。

代码实现

以下是Unity3D中PBR光照模型的代码实现,使用HLSL(High-Level Shader Language)编写:

// 反射率贴图
float3 albedo = texture2D(albedoMap, uv).rgb;
// 法线贴图
float3 normal = UnpackNormal(texture2D(normalMap, uv));
// 观察方向
float3 viewDir = normalize(viewPosition - surfacePosition);
// 光照方向
float3 lightDir = normalize(lightPosition - surfacePosition);
// 半角向量
float3 halfDir = normalize(lightDir + viewDir);
// 镜面反射率
float3 F0 = mix(F0NonMetal, F0Metal, metallic); // F0NonMetal和F0Metal为金属和非金属的基础反射率
float3 F = FresnelSchlick(dot(halfDir, viewDir), F0);
// 漫反射
float3 diffuse = albedo * (1 - F);
// 粗糙度贴图
float roughness = texture2D(roughnessMap, uv).r;
// 镜面反射
float3 specular = F * D_GGX(normal, halfDir, roughness) * G_Smith(normal, viewDir, lightDir, roughness)
/ (4 * dot(normal, viewDir) * dot(normal, lightDir));
// 最终颜色
float3 finalColor = (diffuse + specular) * lightColor;

在上述代码中:

  • albedoMapnormalMaproughnessMap分别为反射率、法线和粗糙度贴图。
  • F0NonMetalF0Metal分别为非金属和金属的基础反射率。
  • FresnelSchlick函数用于计算菲涅尔项。
  • D_GGX函数用于计算GGX法线分布函数。
  • G_Smith函数用于计算Smith几何衰减项。
  • lightColor为光源颜色。

总结

PBR光照模型通过模拟真实世界中光的传播和反射过程,提供了更加逼真的渲染效果。在Unity3D中,通过Standard Shader可以方便地实现PBR光照模型,而理解其背后的物理原理和公式推导对于优化渲染效果至关重要。希望本文的详细推导和代码实现能够对读者有所帮助。

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125

相关文章:

Unity3D PBR光照计算公式推导详解

前言 在Unity3D中,PBR(Physically Based Rendering,基于物理的渲染)光照模型是一种高级光照模型,它模拟了真实世界中光的传播和反射过程,从而提供了更加逼真的渲染效果。PBR光照模型的计算公式涉及多个物理…...

行为树详解(6)——黑板模式

【动作节点数据共享】 行为树中需要的参数可以来自游戏中的各个模块,如果仅需从多个模块获取少量参数,那么可以直接在代码中调用其他模块的单例继而层层调用获取数据。 如果获取的参数量很大,从架构上看,我们需要通过加一个中间…...

Vue.js与其他框架有哪些兼容性?

Vue.js的兼容性主要体现在几个方面,包括浏览器支持、运行环境适应性、与其他库和框架的集成能力等。以下是更详细的解释: 浏览器兼容性 现代浏览器:Vue.js广泛支持所有主流的现代浏览器,如Google Chrome, Firefox, Safari, Edge…...

Java 8 Stream 介绍

Java 8 Stream 介绍 1. 什么是Stream? Stream(流)是Java 8引入的全新概念,它是一个支持串行和并行聚合操作的元素序列。Stream API提供了一种声明式的方式来处理数据集合,可以让我们以一种类似SQL查询的方式处理数据…...

Java NIO、AIO分析

好的,下面将对Java中的**NIO(Non-blocking IO)和AIO(Asynchronous IO)**进行更深入的分析,重点探讨它们的特点和具体的应用场景。 一、Java NIO(Non-blocking IO)深入分析 1. 主要…...

pip下载包出现SSLError

报错: ERROR: Could not install packages due to an OSError: HTTPSConnectionPool(host‘files.pythonhosted.org’, port443): Max retries exceeded with url: /packages/8a/c2/ae7227e4b089c6a8210920db9d5ac59186b0a84eb1e6d96b9218916cdaf1/taming_transform…...

零成本的互联网创业创意有哪些?

在互联网时代,创业的门槛大大降低,即使没有大量的资金投入,也有许多机会可以实现创业梦想。以下将为您介绍一些零成本的互联网创业创意,帮助您在互联网的海洋中找到属于自己的宝藏。 一、内容创作与自媒体 (一&#…...

linux ubantu重启桌面

在 Ubuntu 系统中,重启桌面环境通常有几种方法,具体取决于你所使用的桌面环境(如 GNOME、KDE 等)。下面是几种常用的重启桌面的方法: 重启 GNOME 桌面环境 如果你使用的是 GNOME 桌面环境(Ubuntu 默认桌面…...

DeepSeek重新定义“Open“AI

“面对颠覆性技术,闭源所创造的护城河是暂时的。即使是OpenAI的闭源方法也无法阻止他人赶超。” ——梁文锋,DeepSeek CEO DeepSeek V3 是一个拥有6710亿参数的开源AI模型,正在提升AI效率的新标准。它在相对有限的预算下进行训练&#xff0c…...

iOS - 自旋锁

在 Objective-C 运行时中大量使用自旋锁,主要有以下几个原因: 1. 性能考虑 上下文切换成本 // 自旋锁实现 static ALWAYS_INLINE void OSSpinLockLock(volatile OSSpinLock *lock) {do {while (lock->value ! 0) {__asm__ volatile ("pause&q…...

web应用网站如何启用http2请求

要启用 HTTP/2 协议,您需要确保您的 Web 服务器软件支持 HTTP/2,并进行相应的配置。以下是一些常见的 Web 服务器软件及其启用 HTTP/2 的方法: 1. Nginx 对于 Nginx,您需要确保使用的是 1.9.5 或更高版本,因为这些版本…...

python进阶06:MySQL

课后大总结 Day1 一、数据库命令总结 1.连接数据库 连接数据库进入mysql安装目录打开bin文件夹,输入cmd(此命令后无分号)mysql.exe -u root -ppassword命令后输入密码:root 设置密码set passwordpassword("root123"); 查看所有数据库show databases; …...

mac 使用zip2john破解zip压缩包密码

一、下载: git clone https://github.com/magnumripper/JohnTheRipper.git cd JohnTheRipper/src ./configure sudo make -s clean && sudo make -sj4 cd ../run二、使用: zip2john提取提取 ZIP 文件的哈希: ./zip2john protecte…...

若依中Feign调用的具体使用(若依微服务版自身已集成openfeign依赖,并在此基础上定义了自己的注解)

若依中Feign调用具体使用 注意:以下所有步骤实现的前提是需要在启动类上加入注解 EnableRyFeignClients 主要是为开启feign接口扫描 1.创建服务提供者(provider) 导入依赖(我在分析依赖时发现若依本身已经引入openfeign依赖,并在此基础上自定义了自己的EnableRyF…...

【算法题系列】LeetCode 5.最长回文子串|JavaScript 5种思路实现

题目描述 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2: 输入: "cbbd" 输出: &q…...

基于ROS先验地图的机器人自主定位与导航SLAM

2021年学习,当时参加科大讯飞的智能车大赛, 【语音交互启动-teb算法路径规划A*算法自动避障路径最短优化yolo5目标检测视觉结果判断分类终点指定点位自动泊车语音播报。】 【讯飞学院】http://www.iflyros.com/home/ 一、全局路径规划中的地图 栅格地图&…...

nginx 1.6.3配置虚拟主机与rewrite-location匹配规则

1、 Nginx 虚拟主机配置(配置文件末尾以分号[;]结尾) (1) 准备测试目录站点 [rootWEB conf]# cd /application/nginx/conf/ [rootWEB conf]# mkdir extra (创建虚拟主机存放目录&#xff0…...

1130-host ... is not allowed to connect to this MySql serve

局域网内另外一台电脑使用navicat连接Mysql出现上述问题:不允许连接 解决方案: 1、输入命令:进入mysql mysql -u root -p 2、输入命令:展示所有数据库 show databases; 3、输入命令进入mysql数据库: use mysql; 4、…...

力扣1502判断能否形成等差数列

class Solution:def canMakeArithmeticProgression(self, arr: List[int]) -> bool:# 对数组进行排序arr.sort()# 计算公差diff arr[1] - arr[0]# 从第二个元素开始逐个检查差值是否一致for i in range(1, len(arr) - 1):if arr[i 1] - arr[i] ! diff:return Falsereturn …...

Python版本变更历史及版本选择指南

Python版本变更历史及版本选择指南 Python版本变更历史及版本选择指南1. Python 3.13.1(2023年发布)主要特性适用场景 2. Python 3.12(2022年发布)主要特性 3. Python 3.11(2022年发布)主要特性 4. Python …...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql

安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了&#xff0c;系统很多命…...

前端打包工具简单介绍

前端打包工具简单介绍 一、Webpack 架构与插件机制 1. Webpack 架构核心组成 Entry&#xff08;入口&#xff09; 指定应用的起点文件&#xff0c;比如 src/index.js。 Module&#xff08;模块&#xff09; Webpack 把项目当作模块图&#xff0c;模块可以是 JS、CSS、图片等…...