首页 > 其他分享 >Unity海面效果——4、法线贴图和高光

Unity海面效果——4、法线贴图和高光

时间:2024-07-05 16:29:32浏览次数:16  
标签:贴图 法线 漫反射 效果 UV Unity 高光

<iframe allowfullscreen="true" data-mediaembed="youku" frameborder="0" id="UnGZdqNw-1719025030272" src="https://player.youku.com/embed/XNjQwMDExMzkzMg=="></iframe>

Unity引擎制作海面效果


  大家好,我是阿赵。
  继续做海面效果,上次做完了漫反射颜色和水波动画,这次来做法线和高光效果。

一、 高光的计算

  之前介绍过高光的光照模型做法,比较常用的是Blinn-Phong
在这里插入图片描述

  所以我这里也稍微连线实现了一下
  为了能看得更清楚高光的效果,我把漫反射颜色去掉,单独看高光的部分:
在这里插入图片描述

  需要说明的是,现在这个效果,是配合着天空盒里面的太阳位置,还有我在场景里面的直射灯的角度,得到的一个好像太阳光在水面的光线反射效果,实际上只是对位置造成的效果,并不是真的写个Shader就有这么理想的效果的。
  高光的光照模型很简单,有几个参数是控制高光颜色、高光的强度和范围的。
  如果把漫反射颜色加上去,就会变成这样:
在这里插入图片描述

  从性能上来说,如果做到现在这里就停手,其实效果也不错,而且并没有太多消耗性能的地方。可以作为一个简化版的水面效果吧。
  接下来要开始添加法线的计算,后面还会添加各种深度效果。其实这些效果都是比较消耗性能的,我全部列举出来其实只是为了说明技术点,所以可以根据自己的需要,一点一点的添加。

二、 法线贴图采样

在这里插入图片描述

  我这里的这些图,都是在Unity的AssetStore里面下载的免费水的资源。效果其实并不是特别的好,不过用来学习也足够了。
  这里用到了法线贴图。其实没什么特别的难点,由于之前做漫反射水波纹的时候,已经计算好了2个会动的UV坐标来采样水波贴图,所以现在同样利用这两个UV,来采样法线贴图:
在这里插入图片描述

  需要注意的是,由于是法线贴图,所以要勾选Unpack Normal Map。
在这里插入图片描述

  勾选了之后,就可以设置参数调节法线贴图的缩放,也就是凹凸程度了。
在这里插入图片描述

  接下来,把法线贴图采样得到的法线,输入到之前计算高光模型的世界法线:
在这里插入图片描述

  把漫反射颜色去掉,单纯看高光,现在的高光会变成这样:
在这里插入图片描述

  由于UV是和波纹动画一样的,所以这个高光也会动起来。

  加上了漫反射颜色之后,水波纹和法线是同样的UV采样,所以完全是对得上的
在这里插入图片描述

标签:贴图,法线,漫反射,效果,UV,Unity,高光
From: https://blog.csdn.net/liweizhao/article/details/139989578

相关文章

  • 实现了对图像的亮度、对比度、饱和度的调整以及添加高光效果
    读取原始图像:使用cv2.imread()函数从指定路径读取一张图片,并将其存储在变量image中。创建光照掩模:生成一个与原图大小相同但完全黑色的图像(使用np.zeros_like()),这将作为后续光照效果的基础。定义光照中心点:确定光照效果的中心位置,默认为图像的几何中心。创建圆形光照区......
  • 微信SDK与Unity的Addressables发生引用冲突的解决办法
    当我使用Unity的Addressables和微信的minigame-SDK时,会发生一个CS0433的报错,如下图所示: 关于CS0433错误,微软的官方文档中是这么描述的: 因此,根据报错信息,我揣测是Unity的Compat与mscorlib发生了重复,所以将mscorlib.dll文件全部删除了,但是问题没有得到解决,后面在一个大佬的帮......
  • unity canvas显示相机照射画面的方法
    1. 使用 Image 组件显示处理后的图像如果你的图像数据已经是一个 Texture2D 或 Sprite,你可以将它直接显示在Canvas上的 Image 组件中:创建 Sprite:将你的 Texture2D 数据转换为 Sprite,以便可以在 Image 组件中使用。publicSpriteCreateSpriteFromTexture(......
  • Unity的Package库在IDE里不显示API注释的解决方法
    当你在代码里使用Package库的API的时候,比如Addressable和Unity.Entities等等,以VisualStudio为例,鼠标放到API上,会发现不显示注释:然而按F12访问源代码,会发现代码里面是有注释的,而且对于Unity的包,注释会非常的详细:本质原因是Unity在编译这些Package的时候,没有生成XML注释文档,导......
  • unity 从list中获取最近的坐标 / 获取最接近的角度(数值)
    ///<summary>///从列表points中获取距离targetPoint最近的坐标///</summary>///<paramname="points"></param>///<paramname="targetPoint"></param>///<returns><......
  • 【Unity】HoloLens2 开发日记
    2022/1/12第一天!START!配置环境微软官方教程:练习-导入和配置资源-Learn|MicrosoftDocsWindows10SDK地址:WindowsSDK-Windows应用开发(microsoft.com)MRTK(混合现实工具包):DownloadMixedRealityFeatureToolfromOfficialMicrosoftDownloadCenter......
  • 【Unity】EventTrigger各事件触发时机解释
    OnSelect():当鼠标按下了一个当前未在选中状态的UI时触发。如果一个UI已经被选中(成为焦点UI),那么再点击这个UI时,则不会再一次触发OnSelect。OnDeselect():在OnSelect()已经执行过之后,又选中了另外一个物体时,原有的物体就会触发OnDeselect(),取消选择。OnUpdateSelect():在......
  • Unity写个多用对象池
    1.介绍游戏开发中我们会频繁使用到预制体来优化内存,优化性能,增强游戏表现。当要使用的预制体次数很多,创建销毁很频繁时,为了方便管理、提升性能,我们需要一个对象池。一般使用单例+一个预制体+一个存储类型就能做出一个简单的对象池。但当我们需要对很多种物体进行对象池管理时......
  • Unity 导航路线生成,小地图同步映射, 经过以后地图与小地图删除点位(点击小地图控制导航
    效果:(如下图所示)操作方法:搭建小地图UI截取图片创建地面挂载如下代码:usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;[RequireComponent(typeof(MeshFilter),typeof(MeshCollider),typeof(MeshRenderer))]publicclassMap:Mo......
  • 【Unity&&C#】委托与事件笔记
    委托委托的定义委托是个类,分为Delegate自定义委托类型,Func有返回值的委托类型,Action无返回值的委托类型Func和Action的底层原理便是用Delegate声明一个委托类型(有返回值和无返回值),并且通过泛型参数(最多十六个)来实现自定义参数类型和参数委托的两种使用情况:模板方法(一般是......