Unity3D 光照计算方向与法线贴图详解

前言

在Unity3D中,光照计算方向与法线贴图是实现高质量光照效果的重要技术之一。本文将详细介绍光照计算方向与法线贴图的原理和实现方法,并给出相应的代码示例。

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

一、光照计算方向

在Unity3D中,光照计算方向是指根据光源的位置和光照强度,计算出每个像素点的光照方向。通过光照计算方向,可以实现不同光源对物体的照明效果,让物体在不同光照条件下呈现出不同的明暗效果。

光照计算方向的原理是根据光源的位置和物体表面的法线向量,计算出光线与法线的夹角,进而确定光照方向。在Unity3D中,可以使用Shader来实现光照计算方向,下面是一个简单的Shader示例:

Shader "Custom/LightDirection"
{Properties{_MainTex ("Base (RGB)", 2D) = "white" {}_LightPos ("Light Position", Vector) = (0, 1, 0, 0)}SubShader{Tags { "RenderType" = "Opaque" }CGPROGRAM#pragma surface surf Lambertstruct Input{float2 uv_MainTex;float3 worldPos;float3 worldNormal;};sampler2D _MainTex;float4 _LightPos;void surf (Input IN, inout SurfaceOutput o){float3 lightDir = normalize(_LightPos - IN.worldPos);float diff = max(0, dot(IN.worldNormal, lightDir));o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * diff;}ENDCG}FallBack "Diffuse"
}

在上面的Shader中,我们定义了一个光源的位置属性_LightPos,并在surf函数中计算出光照方向lightDir,并根据光照方向和法线向量计算出光照强度diff,最终将光照强度乘以纹理颜色作为物体的颜色输出。

二、法线贴图

法线贴图是一种用来模拟物体表面细节的技术,通过在物体表面上贴上法线贴图,可以让物体在渲染时呈现出更加真实的细节效果。在Unity3D中,法线贴图通常用来模拟表面的凹凸不平,比如褶皱、纹理等。

法线贴图的原理是在物体表面上存储法线向量信息,通过在像素着色器中根据法线贴图的信息计算出新的法线向量,从而影响光照效果。下面是一个简单的法线贴图Shader示例:

Shader "Custom/NormalMap"
{Properties{_MainTex ("Base (RGB)", 2D) = "white" {}_BumpMap ("Normalmap", 2D) = "bump" {}_BumpScale ("Bump Scale", Range(0.01, 0.2)) = 0.1}SubShader{Tags { "RenderType" = "Opaque" }CGPROGRAM#pragma surface surf Lambertstruct Input{float2 uv_MainTex;float2 uv_BumpMap;float3 worldPos;float3 worldNormal;};sampler2D _MainTex;sampler2D _BumpMap;float _BumpScale;void surf (Input IN, inout SurfaceOutput o){float3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));normal = normalize(normal * 2 - 1);o.Normal = normal;o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;}ENDCG}FallBack "Diffuse"
}

在上面的Shader中,我们定义了一个法线贴图属性_BumpMap,并在surf函数中根据法线贴图的信息计算出新的法线向量normal,并将其赋值给SurfaceOutput结构体的Normal属性,从而影响光照效果。同时,我们还将法线贴图的颜色作为物体的颜色输出。

三、光照计算方向与法线贴图的结合

光照计算方向与法线贴图可以结合使用,实现更加逼真的光照效果。在Unity3D中,可以通过在Shader中同时实现光照计算方向和法线贴图,来使物体在不同光照条件下呈现出更加真实的细节效果。下面是一个结合光照计算方向和法线贴图的Shader示例:

Shader "Custom/LightAndNormalMap"
{Properties{_MainTex ("Base (RGB)", 2D) = "white" {}_BumpMap ("Normalmap", 2D) = "bump" {}_LightPos ("Light Position", Vector) = (0, 1, 0, 0)}SubShader{Tags { "RenderType" = "Opaque" }CGPROGRAM#pragma surface surf Lambertstruct Input{float2 uv_MainTex;float2 uv_BumpMap;float3 worldPos;float3 worldNormal;};sampler2D _MainTex;sampler2D _BumpMap;float4 _LightPos;void surf (Input IN, inout SurfaceOutput o){float3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));normal = normalize(normal * 2 - 1);float3 lightDir = normalize(_LightPos - IN.worldPos);float diff = max(0, dot(normal, lightDir));o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * diff;}ENDCG}FallBack "Diffuse"
}

在上面的Shader中,我们同时定义了光源的位置属性_LightPos和法线贴图属性_BumpMap,并在surf函数中同时计算出光照方向和新的法线向量,从而实现了光照计算方向和法线贴图的结合效果。

总结

光照计算方向与法线贴图是Unity3D中实现高质量光照效果的重要技术之一。通过合理地使用光照计算方向和法线贴图,可以让物体在不同光照条件下呈现出更加真实的细节效果,提升游戏的视觉质量。开发者可以根据项目需求,灵活地使用光照计算方向和法线贴图,来实现更加逼真的光照效果。

更多视频教学

Unity3D教程​www.bycwedu.com/promotion_channels/2146264125

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/707554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

密码学系列(四)——对称密码2

一、RC4 RC4(Rivest Cipher 4)是一种对称流密码算法,由Ron Rivest于1987年设计。它以其简单性和高速性而闻名,并广泛应用于网络通信和安全协议中。下面是对RC4的详细介绍: 密钥长度: RC4的密钥长度可变&am…

Git,GitHub与GitLab分别是什么?有什么关系和区别?

Git 定义:Git 是一个分布式版本控制系统,用于跟踪文件的变化,并协助多人协作开发软件项目。作用:Git 可以在本地存储完整的项目历史记录,并允许开发者在不同的分支上进行独立的开发,最后将它们合并到主干分…

GPT 的基础 - T(Transformer)

我们知道GPT的含义是: Generative - 生成下一个词 Pre-trained - 文本预训练 Transformer - 基于Transformer架构 我们看到Transformer模型是GPT的基础,这篇博客梳理了一下Transformer的知识点。 BERT: 用于语言理解。(Transformer的Encoder…

九州金榜|父亲在教育中的作用及重要性

随着社会进步,对比以前教育,现在父亲在教育中的作用越来越明显,孩子的教育离不开父亲,父亲在孩子教育中有什么作用?重要性又是什么呢?下面九州金榜家庭教育就带大家一起分析一下作为父亲,在孩子…

VUE3搭载到服务器

1.搭建服务器 使用 Windows 自带的 IIS 作为服务器。 步骤如下:https://blog.csdn.net/qq_62464995/article/details/130140673 同时,上面的步骤中,还使用了 cpolar 将 IIS 本地网址映射到公共网址。 注: cpolar客户端&#xf…

python模块百科_为高效而生_itertools【三】

python模块百科_为高效而生_itertools【三】 一、itertools --- 为高效而生二、无穷迭代器三、根据最短输入序列长度停止的迭代器3.6 groupby()3.7 islice()3.8 starmap()3.9 takewhile()3.10 tee() 一、itertools — 为高效而生 itertools — 为高效而生。itertools模块实现一…

Ant for Blazor做单个表的增删查改

Ant for Blazor做单个表的增删查改 2024年02月27日花了一天时间弄出来了,基本弄好了,vs2022blazor servernet8,引用的AntDesign版本是0.17.4 代码里的model和repository是用自己牛腩代码生成器生成的东西,sqlsugar的,记得在prog…

括号生成(力扣题目22)

题目描述: 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:["((()))","(()())","(())()&q…

Modern C++ std::any的实现原理

1. 前言 std::any 是 C17 中引入的一个新特性,它是一个类型安全的容器,可以在其中存储任何类型(但此类型必须可拷贝构造)的值,包括基本类型、自定义类型、指针等。相比于void* 指针,std::any 更为类型安全,可以避免由…

NC65 rest接口 开发 NC65接口开发

一、在对应模块META-INF下编写 xxx.rest 文件,也要放在Home里对应的目录下。 二、开发接口,继承extends AbstractUAPRestResource,(有的项目会继承别的方法如:AbstractNCCRestResource,MTFRestResource;有…

网络安全面试题

1. Http 状态码,Http2 是什么 答案: 200 欢迎回来,主人 (正常;请求已完成。) 301 人家搬家了 (已移动 — 请求的数据具有新的位置且更改是永久的。) 307 不是这里,换个…

使用 kubeadm 部署k8s集群

一、所有节点系统初始化 1、常规初始化 2、内核版本升级以及内核限制文件参数修改 还可以考虑将旧版本的内核卸载 二、准备nginx负载均衡器和keepalived nginx四层代理: keepalived配置: nginx检测脚本: 三、所有节点部署docker&#xff0c…

SQL函数学习记录

聚合函数 函数是编程语言的基础之一,在对数字的运算中,我们用的最多的就是聚合函数,本篇接下来就详细阐述下SQL中聚合函数的运用。 什么是聚合函数(aggregate function)? 聚合函数指的是对一组值执行计算…

2023秋季飞书未来无限大会--随笔

这个时代的飞书 数字时代 工作协同平台 AI时代 帮助企业和个人用好AI 企业如何引用大模型能力? 智慧体— 接近人,有进步空间智能伙伴 用时代的科技打造爱不释手的好产品 移动互联网 – 改变信息分发方式 大模型 –自然的人机交互方式 业务协同 …

如何使用便签快速分类工作待办事项

在日常工作和生活中,我们经常需要处理各种各样的待办事项。而有效地分类这些任务,可以帮助我们更好地管理时间和提高工作效率。使用便签是一种简单而实用的方法,下面将介绍如何利用好用便签来快速分类工作待办事项。 首先,你可以…

【数据结构和算法初阶(C语言)】链表-单链表(手撕详讲单链表增删查改)

目录 1.前言:顺序表回顾: 1.1顺序表的优缺点 2.主角----链表 2.1链表的概念 2.2定义一个单链表的具体实现代码方式 3.单链表对数据的管理----增删查改 3.1单链表的创建 3.2单链表的遍历实现 3.2.1利用遍历实现一个打印我们链表内容的函数的函数…

【前端素材】推荐优质后台管理系统Salreo平台模板(附源码)

一、需求分析 当我们从多个层次来详细分析后台管理系统时,可以将其功能和定义进一步细分,以便更好地理解其在不同方面的作用和实际运作。 1. 结构层次 在结构层次上,后台管理系统可以分为以下几个部分: a. 辅助功能模块&#…

Mycat核心教程--ZooKeeper集群搭建【三】

Mycat核心教程--ZooKeeper集群搭建 八、 ZooKeeper集群搭建8.1.ZooKeeper简介8.2.数据复制的好处8.3.Zookeeper设计目的8.4.zookeeper集群包括3种角色8.4.1.Leader角色8.4.2.Follower 角色8.4.3.Observer 角色 8.5.zookeeper集群工作流程8.6.zookeeper集群节点数量为奇数&#…

JS进阶——深入对象

版权声明 本文章来源于B站上的某马课程,由本人整理,仅供学习交流使用。如涉及侵权问题,请立即与本人联系,本人将积极配合删除相关内容。感谢理解和支持,本人致力于维护原创作品的权益,共同营造一个尊重知识…

FPS游戏之漫谈延迟补偿技术

在FPS游戏中,延迟补偿是一种常用的技术,用于解决由于网络延迟导致的玩家体验不一致的问题。对于投掷手雷这样的动作,延迟补偿的具体策略可能包括以下几个方面: 时间回溯(Lag Compensation):服务…