首页 > 其他分享 >Unity3D 在游戏引擎中常用的光照模型有哪些现详解

Unity3D 在游戏引擎中常用的光照模型有哪些现详解

时间:2024-01-17 09:46:03浏览次数:30  
标签:lightDir Unity3D 模型 normal 详解 向量 光照 float3

Unity3D是一款强大的游戏引擎,其在游戏开发中广泛应用于各种类型的游戏。光照模型是游戏引擎中一个重要的组成部分,它决定了游戏中的光照效果和物体的视觉效果。在Unity3D中,常用的光照模型有Lambert光照模型、Blinn-Phong光照模型和PBR(Physically Based Rendering)光照模型。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

Lambert光照模型是最简单的光照模型之一,它只考虑了光照的方向和物体表面的法向量。在Lambert光照模型中,物体表面的颜色只与光源的方向和物体表面的法向量有关,与观察者的位置无关。其计算公式如下:

Copy
float3 lightDir = normalize(lightPosition - surfacePosition); // 光照方向 float3 normal = normalize(surfaceNormal); // 法向量 float diffuse = max(dot(lightDir, normal), 0); // 计算漫反射强度 float3 finalColor = objectColor * lightColor * diffuse; // 计算最终颜色

在这段代码中,lightDir表示光照方向,normal表示物体表面的法向量,diffuse表示漫反射强度,objectColor表示物体的颜色,lightColor表示光源的颜色。

Blinn-Phong光照模型是一种更高级的光照模型,它在Lambert光照模型的基础上加入了镜面反射成分,使得物体表面能够呈现出光亮的效果。在Blinn-Phong光照模型中,除了考虑光照的方向和物体表面的法向量外,还需要考虑观察者的位置。其计算公式如下:

Copy
float3 lightDir = normalize(lightPosition - surfacePosition); // 光照方向 float3 viewDir = normalize(viewPosition - surfacePosition); // 观察方向 float3 halfDir = normalize(lightDir + viewDir); // 半向量 float3 normal = normalize(surfaceNormal); // 法向量 float diffuse = max(dot(lightDir, normal), 0); // 计算漫反射强度 float specular = pow(max(dot(normal, halfDir), 0), shininess); // 计算镜面反射强度 float3 finalColor = objectColor * lightColor * (diffuse + specular); // 计算最终颜色

在这段代码中,viewDir表示观察方向,halfDir表示光照方向和观察方向的半向量,shininess表示物体的光泽度。

PBR光照模型是一种基于物理的光照模型,它模拟了真实世界中光的传播和反射的物理过程。PBR光照模型考虑了光的能量衰减、金属度和粗糙度等因素,使得物体表面的光照效果更加真实。在Unity3D中,PBR光照模型可以通过使用Standard Shader来实现。其计算公式如下:

Copy
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); // 镜面反射率 float3 F = FresnelSchlick(dot(halfDir, viewDir), F0); // 菲涅尔项 float3 diffuse = albedo * (1 - F); // 漫反射 float3 specular = F * D * G / (4 * dot(normal, viewDir) * dot(normal, lightDir)); // 镜面反射 float3 finalColor = (diffuse + specular) * lightColor; // 计算最终颜色

在这段代码中,albedo表示反射率,normal表示法向量,viewDir表示观察方向,lightDir表示光照方向,halfDir表示光照方向和观察方向的半向量,F0表示镜面反射率,F表示菲涅尔项,diffuse表示漫反射,specular表示镜面反射。

以上是Unity3D中常用的光照模型的详解和代码实现。通过使用这些光照模型,可以使游戏中的物体表面呈现出逼真的光照效果,提升游戏的视觉质量。在实际的游戏开发中,可以根据具体的需求和场景选择适合的光照模型,并根据需要进行调整和优化,以达到最佳的视觉效果。

标签:lightDir,Unity3D,模型,normal,详解,向量,光照,float3
From: https://www.cnblogs.com/bycw/p/17969117

相关文章

  • C# 介绍、应用领域、入门、语法、输出和注释详解
    什么是C#?C#(发音为“C-Sharp”)是一种由Microsoft创建的面向对象的编程语言,运行在.NETFramework上。源于C家族,与流行的语言如C++和Java相近。首个版本发布于2002年,而最新版本,C#12,于2023年11月发布C#的应用领域C#广泛用于:移动应用程序桌面应用程序Web应......
  • Day51 封装详解
    封装详解最重要的一句话:属性私有get/set该露的露,该藏的藏我们程序设计要追求“高内聚,低耦合”。//如大电视机取钱的ATM机包住内部处理数据的负责区域仅仅暴露外面部分开关等让用户操作高内聚就是类的内部......
  • C# 介绍、应用领域、入门、语法、输出和注释详解
    什么是C#?C#(发音为“C-Sharp”)是一种由Microsoft创建的面向对象的编程语言,运行在.NETFramework上。源于C家族,与流行的语言如C++和Java相近。首个版本发布于2002年,而最新版本,C#12,于2023年11月发布C#的应用领域C#广泛用于:移动应用程序桌面应用程序Web应......
  • 以 Golang 为例详解 AST 抽象语法树
    前言各位同行有没有想过一件事,一个程序文件,比如hello.go是如何被编译器理解的,平常在编写程序时,IDE又是如何提供代码提示的。在这奥妙无穷的背后,AST(AbstractSyntaxTree)抽象语法树功不可没,他站在每一行程序的身后,默默无闻的工作,为繁荣的互联网世界立下了汗马功劳。AST抽象......
  • GB,GB/T,YY,YY/T,医疗器械标准编号详解
    GB,GB/T,YY,YY/T,医疗器械标准编号详解,推荐收藏!(baidu.com)    ......
  • 神经网络优化篇:详解指数加权平均的偏差修正(Bias correction in exponentially weighte
    指数加权平均的偏差修正\({{v}_{t}}=\beta{{v}_{t-1}}+(1-\beta){{\theta}_{t}}\)在上一个博客中,这个(红色)曲线对应\(\beta\)的值为0.9,这个(绿色)曲线对应的\(\beta\)=0.98,如果执行写在这里的公式,在\(\beta\)等于0.98的时候,得到的并不是绿色曲线,而是紫色曲线,可以注意到紫色曲线......
  • C#中var关键字详解:强类型、匿名类型和LINQ查询的妙用!
     在C#中,var关键字是强类型的,因为它在编译时会根据变量的初始化表达式推断出变量的实际类型,并且一旦确定了类型,就不能再更改。这种类型推断是在编译时进行的,因此代码中的变量在运行时是具有明确定义类型的。下面是一个简单的示例,说明var的强类型特性以及使用时的一些注意事项:......
  • Python列表差异值统计:集合操作、列表推导式、对称差集详解
     在Python中,统计两个列表的差异值有多种方法,其中包括使用集合操作、列表推导式等。下面我将通过实例详细讲解几种常见的方法,并提供相应的实例源代码。方法一:使用集合操作list1=[1,2,3,4,5]list2=[3,4,5,6,7]#找到在list1中而不在list2中的元素difference1......
  • 构造器详解
    publicstaticvoidmain(String[]args){  Personperson=newPerson("zhangsan",23);    System.out.println(person.name);    System.out.println(person.age);}publicclassPerson{  //一个类即使什么都不写,也会存在一个构造器  //显示定......
  • Spring 中的设计模式详解
    1、控制反转(IoC)和依赖注入(DI)IoC是一个原则,而不是一个模式,以下模式(但不限于)实现了IoC原则。 控制反转怎么理解呢? 举个例子:"对象a依赖了对象b,当对象a需要使用对象b的时候必须自己去创建。但是当系统引入了IOC容器后,对象a和对象b之前就失去了直接的......