FAlphaBlend——Unreal中的插值助手

news2025/7/11 9:36:28

游戏开发中经常要进行插值处理,这个东西处理虽然不复杂,但如果自己重新做,还是要写额外的代码,好消息是,Unreal已经为我们提供了插值助手——FAlphaBlend

我们以一个非常简单的应用场景来说明FAlphaBlend的用处:屏幕的淡出处理,即游戏画面逐渐变暗直至完全变黑。更详细的描述可能是:要求2秒内屏幕逐渐变黑。

我们先来看一下FAlphaBlend的主要成员

struct FAlphaBlend
{
    /** Blend Time */
    //这个就是插值整个过程的处理时间,比如我们这里是2秒
	UPROPERTY(EditAnywhere, Category = "Blend")
	float	BlendTime;

	/** Internal Lerped value for Alpha */
    //这个是当前的插值进度百分比,比如时间来到1秒后,它的值就是0.5(相当于2秒来说)
	float	AlphaLerp;

	/** Resulting Alpha value, between 0.f and 1.f */
	float	AlphaBlend;

	/** Time left to reach target */
    //还剩下的插值时间,比如时间过了0.5秒后,它的值就是1.5
	float	BlendTimeRemaining;

	/** The current blended value derived from the begin and desired values. 
	  * This value should not change unless Update. 
	  */
    //当前时间得到的插值结果,假如我们是线性插值,那么在1秒的时候,它的值是0.5
	float BlendedValue;

	/** The Start value. It is 'from' range */
    //插值区间起始值,我们这里开始的透明度是0,所以它的值就是0
	float BeginValue;

	/**  The Target value. It is 'to' range */
    //插值区间目标值,我们这里结束的透明度是1,所以它的值就是1
	float DesiredValue;
}

以上代码用注释/**/标注的是Unreal自己的注释,//是我额外添加的注释,针对我们的应用场景进行说明。

细心的同学可能会发现,里面还有一个成员AlphaBlend,我没有对它进行中文注释,其实它也是一个插值。那它也是插值,AlphaLerp也是插值,怎么有两个插值?它俩有什么区别?

AlphaLerp是直接的插值,它是BlendTime的线性结果,比如2秒来说,当0.5秒的时候的,AlphaLerp=0.5/2=0.25,当1秒的时候,AlphaLerp=1/2=0.5。

而AlphaBlend是结果的插值,根据不同的插值算法,它的值是不一样的。我们想平均地调整透明度,那就用线性算法,它的值和AlphaLerp一致。如果我们想透明度开始黑得满一点,后面黑得快一点,则可能采用y= x^2算法,则当Alphalerp=0.5的时候,AlphaBlend=0.5*0.5=0.25。这就是它的注释/** Resulting Alpha value, between 0.f and 1.f */的意思所在,它才是结果插值。我们用0.25在透明度0~1之间进行取值,这里我们的例子是0~1,也可能是其他参数,比如高度0~100,则0.25对应的就是25。所以AlphaBlend的值取决于AlphaLerp和我们采用的算法。

FAlphaBlend里面有个重要的静态成员函数,处理的就是AlphaLerp到AlphaBlend的转换

	/** Converts InAlpha from a linear 0...1 value into the output alpha described by InBlendOption 
	 *  @param InAlpha In linear 0...1 alpha
	 *  @param InBlendOption The type of blend to use
	 *  @param InCustomCurve The curve to use when blend option is set to custom
	 */
	static float AlphaToBlendOption(float InAlpha, EAlphaBlendOption InBlendOption, UCurveFloat* InCustomCurve = nullptr);

InAlpha传入的就是AlphaLerp

InBlendOption是个枚举,表示采用的转换算法

InCustomCurve是个CurveFloat,这个用来处理更加定制化的需求。

所以FAlphaBlend的使用过程是:设置好BlendTime(即插值区间要进行的时间),然后每帧调用Update函数,这个函数内部会计算出当前时间对应的AlphaLerp,并根据BlendOption算出真正的AlphaBlend,然后用这个AlphaBlend在[BeginValue,DesiredValue]进行线性取值得到BlendValue。

之后我们想用结果值的时候,直接使用BlendValue即可。

对于一些常用的转换算法,我们可以通过设置BlendOption来达到目的,但更加复制的,BlendOption就无能为力了,这个时候我们就可以使用CurveFloat。我们可以把CurveFloat理解为一个转换函数,给定X,返回Y,非常棒的是Unreal里面有专门的曲线编辑器来编辑CurveFloat,假如我们在变黑的过程中是这样的表现:快速变黑,然后恢复透明,再逐渐地变黑。我们就可以定制曲线,来处理AlphaLerp(即X)到AlphaBlend(即X)的转换,可能如下图

 

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

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

相关文章

matplotlib详细教学

Matplotlib初相识 认识matplotlib Matplotlib是一个Python 2D绘图库,能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,用来绘制各种静态,动态,交互式的图表 一个最简单的绘图例子 matplotlib的图像都是画在对应…

Spring事务与事务传播机制

目录 1.事务的基本概念 2.Spring事务的实现 3.事务隔离级别 4.事务传播机制 1.事务的基本概念 关于事务的一些基础概念我已经在MYSQL中讲解过了,有不了解的可以移步至此篇文章:MySQL基础——数据库索引与事务_invictusQAQ的博客-CSDN博客 2.Spring…

基于AlexNet卷积神经网络的手写体数字倾斜校正系统研究-附Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、AlexNet 网络✳️ 三、实验验证✳️ 3.1 实验数据集✳️ 3.2 数据训练✳️ 3.3 手写体倾斜数字校正结果✳️ 四、参考文献✳️ 五、Matlab代码获取✳️ 一、引言 手写体数字识别是光学字符识别(Optical CharacterRecognition…

破圈的《张朝阳的物理课》,开启“知识突围”的搜狐视频

在互联网耕耘二十多年的搜狐,正在焕发出新的活力。 从搜狐最近公布的2022年第三季度财报来看,营收1.85亿美元,其中在线游戏业务实现收入1.49亿美元,广告收入环比增长3%达到2600万美元。同时,净亏损好于此前预期。 对…

Junit执行源码分析,junit是怎么跑起来的(二)

接上一篇【Junit执行源码分析,junit是怎么跑起来的】 https://blog.csdn.net/Aqu415/article/details/127494898 这里我们接着分析 org.junit.runner.JUnitCore#run(org.junit.runner.Runner) 这个方法 public Result run(Runner runner) {Result result new Resu…

智慧监狱解决方案-最新全套文件

智慧监狱解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧监狱全套最新解决方案合集一、建设背景 “智慧监狱”是“数字法治、智慧司法”信息系统建设的重要组成部分,其主要内容是在现有监狱信息建设的基础上,充分利用大数据…

【机器学习】拉格朗日对偶性

有任何的书写错误、排版错误、概念错误等,希望大家包含指正。 拉格朗日对偶性 在求解最优化问题中,拉格朗日乘数法(Lagrange Multiplier)和 KKT(Karush Kuhn Tucker,三个人名)条件是两种最常用…

高性能零售IT系统的建设07-通过一次重大危机感受Redis从使用到失智到理性的治理

介绍 在2020年年初我接手的一座“屎山”里含有Redis框架和机制,它使用的是sentinel模式。其实sentinel模式并不是重点,按照我的经验,每天单店10万单也一样可以使用Redis Sentinel。只有到达新浪微博啦、头条啦这种大厂才有必要去架设redis cl…

Linux进程替换

进程替换 假如操作系统正在执行某一个程序,我们可以利用程序替换函数指定一个新的程序,让操作系统去执行我们新指定的程序。也就是这样一种情形下,我们fork一个进程,如果fork成功,子进程会和父进程执行相同的代码&…

基于springboot+vue的社区健康码管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

Hive数据操纵语言-DML(Load、insert、事务表)

1. Load加载数据 1.1 概述 主要为将数据文件移动到Hive表对应的位置,即复制、移动操作 1.2 语法 1.2.1 filepath 表示待移动数据的路径文件路径支持下面三种形式,要结合LOCAL关键字一起考虑: 相对路径,例如:projec…

音乐播放

在Qt5中使用Qt Multimedia 模块来实现多媒体应用(音视频播放和控制,相机拍照。收音等)。 使用多媒体模块时需要在pro文件中添加: QT multimedia QMediaPlayer(播放音频) 不追求低延迟的话使用QMediaPlaye…

作业练习3:类的继承

作业练习3:类的继承 面向对象程序设计(C) WHUT-CS 2022 Spring 源码传送门 传送门:https://pan.baidu.com/s/11KwE6tQzC_H-31AFgEWtOg?pwd1111 I.作业目的 本次实验主要在于学习使用C类继承机制实现程序功能。C中的举继承机制能够用于表示类之间的…

Crack:wodXMPP ActiveX 即时通讯组件

wodXMPP ActiveX 组件 XMPP组件,Jabber(ICQ MSN AIM Yahoo GTalk)即时通讯组件 wodXMPP 是 XMPP/Jabber(可扩展消息传递和状态协议)协议的客户端组件。它用于创建轻量级的消息传递客户端,并且除了 wodXMPP 之外不需要其他第 3 方要…

第八章《Java高级语法》第10节:注解

注解可以被理解为一种特殊的注释。普通注释是添加到代码中的人类语言,它可以提高程序的可读性。当源程序被编译为字节码之后,普通注释都会被去除掉,因为这些注释对代码的执行没有任何影响。因此,普通注释只能对代码的阅读者起到帮助。而注释则不同,注释可以对编译器和虚拟…

数字验证学习笔记——UVM学习1

一、类库地图 在SV模块中,验证环境整体的构建,是从底层模块的验证组件搭建到通信和激励生成这些元素无论是软件对象的创建、访问、修改、配置,还是组件之间的通信等都是通过用户自定义的方式来实现的。UVM验证方法学作为之前所有方法学的融合…

ubuntu22.04安装教程

1、选择语言 (默认) 2、取消安装更新 (默认) 3、选择键盘语言 (默认) 4、配置ip,可以直接选择dhcp,也可选择配置静态ip (默认) 5、配置代理 跳过不填写 6、设置镜像源 (默认) https://mirrors.aliyun.com/ubuntu/ 7、磁盘配置,默认即可 (默…

Java_接口使用实例

目录 给对象数组排序 按年龄来比较: 按名字来比较: 尝试自己实现一个 sort 方法 给对象数组排序 class Student {public String name;public int age;public int score;public Student(String name, int age, int score) {this.name name;this…

nginx基础篇

nginx基础篇nginx最小配置解析域名解析常用解析多租户解析Nginx虚拟主机域名配置ServerName匹配规则完整匹配通配符匹配通配符结束匹配正则匹配隧道式模型、网关、代理正向代理&反向代理网关隧道式模式反向代理反向代理一台服务器反向代理多台服务器负载均衡策略动静分离UR…

【微服务】SpringCloud断路器Hystrix

目录 一、断路器Hystrix 1、引入断路器 1.1、依赖 1.2、示例 2、传播安全上下文或使用Spring范围 3、健康指标 4、 Hystrix超时和RibbonClient 一、断路器Hystrix 较低级别的服务中的服务故障可能会导致级联故障,直至服务雪崩。在metrics.rollingStats.timeI…