虚幻引擎 C++ 实现平面阴影

news2024/9/25 23:23:01

1、平面阴影介绍

        平面阴影是一种相对简单的渲染阴影的方式,可以理解为对一个模型渲染两次,一次是渲染模型本身,另一次是渲染模型的投影。渲染投影可以看作是将模型的顶点变换到地面的投影空间再渲染,可以理解为渲染了一个“压扁”的模型。

        相对于shadowMap,平面阴影对性能的损耗相对较小。shadowMap相当于对场景做了两次渲染(第一次在光源位置渲染记录深度纹理,第二次正常渲染);而平面阴影只对模型本身做两次渲染。且shadowMap受限于深度纹理的分辨率,渲染出的阴影会出现锯齿;平面阴影由于阴影本身也是模型,故不会出现明显的锯齿。

        但是平面阴影不会在模型上产生阴影(如手臂遮住脸,脸上会有手臂的阴影);且只能投影在平面上(如果地面有其他模型,则阴影会被挡住)。

2、虚幻引擎实现平面阴影

2.1、实现思路

图2-1

        思路是将模型通过全局位置偏移的方式,变换到投影的位置。如图2-1,在光线light作用下,模型上的一点p投射的阴影为p'。我们要计算的是px到px'、py到py'以及pz到0的偏移。pz到0好处理,偏移为-pz。要计算px到px'、py到py',首先要得到图2-1中的L,设光线方向向量为lightDir(已单位化)。则点p到点p'的向量为K=L*lightDir,则px到px'的偏移为向量K的X分量、py到py'的偏移为向量K的Y分量。

2.1、材质

2.2、C++部分:动态加载模型、材质

        创建一个AMyActorShadow(继承AActor),作为平面阴影模型,添加与玩家控制人物相同的骨骼网格体,添加上平面阴影材质。然后在tick函数里获取玩家人物骨骼网格体的TransForm以及姿态,并更新至当前的骨骼网格体。代码如下:

	AMyActorShadow()
	{
		// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
		PrimaryActorTick.bCanEverTick = true;

		//skeleMesh 为成员变量
		if (skeleMesh == nullptr) {
			// 实例化一个网格体
			skeleMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("mesh"));
			skeleMesh->SetupAttachment(RootComponent);
			static ConstructorHelpers::FObjectFinder<USkeletalMesh> locMesh(TEXT("玩家人物骨骼网格体的引用"));
			if (locMesh.Succeeded()) {
				skeleMesh->SetSkeletalMesh(locMesh.Object, false);
			}
			// 关闭阴影
			skeleMesh->SetCastShadow(false);

			static UMaterialInterface* MiniMapmatInst = LoadObject<UMaterialInterface>(NULL, TEXT("平面阴影材质的引用"));
			UMaterialInstanceDynamic* MiniMapmatInstDynamic = UMaterialInstanceDynamic::Create(MiniMapmatInst, nullptr);
			if (MiniMapmatInstDynamic != nullptr) {
				int matNum = skeleMesh->GetNumMaterials();
				for (int i = 0; i < matNum; i++) {
					skeleMesh->SetMaterial(i, MiniMapmatInstDynamic);
				}
			}
		}

	}

code2-1 构造函数

// Called every frame
void AMyActorShadow::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	USkeletalMeshComponent* source = nullptr;
	for (TActorIterator<AthridPersonCharacter> itr(GetWorld()); itr; ++itr)
	{
		AthridPersonCharacter* master = *itr;
		master->GetTransform();
		source = itr->FindComponentByClass<USkeletalMeshComponent>();
		break;
	}
	if (source)
	{
		// 同步位置和朝向
		this->SetActorTransform(source->GetComponentTransform());
		// 同步骨骼模型姿态
		skeleMesh->SetMasterPoseComponent(source);
	}
}

code2-2 tick事件

3、最终效果

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

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

相关文章

pytorch学习笔记6 tensor拼接和拆分

cat 合并 dim必须首选相同&#xff08;上例都是3&#xff09;&#xff0c;其次除了合并的dim&#xff08;上例中为dim0&#xff09;外&#xff0c;其它dim的size必须相同&#xff08;dim 1的size是32&#xff0c;dim2的size是8&#xff09;&#xff0c;否则需要手动处理到相同…

vue3 + Spingboot + oracle 通过Base64存储图片

一 、前言 近期在做vue3 Springboot oracle 的工作&#xff0c;有个小功能通过页面导入图片保存到oracle数据库中&#xff0c;本人对前端不是很熟悉&#xff0c;借此记录一下实现方法&#xff1b; 二、前端部分代码 <template><div class"dialog-mian"&…

SQL注入实例(sqli-labs/less-7)

0、初始页面 1、确定闭合字符 确定闭合字符为单引号括号括号 )) ?id1 and 11 ?id1 and 12 ?id1 ?id1)) 2、查看securie_file_priv参数 ?id1)) and upddatexml(1,concat(0x7e,(select secure_file_priv),0x7e),1) -- 3、写入一句话木马 ?id1)) union select null,&q…

SFT、RLHF、DPO、IFT —— LLM 微调的进化之路

TL;DR • SFT、RLHF 和 DPO 都是先估计 LLMs 本身的偏好&#xff0c;再与人类的偏好进行对齐&#xff1b; • SFT 只通过 LLMs 生成的下一个单词进行估计&#xff0c;而 RLHF 和 DPO 通过 LLMs 生成的完整句子进行估计&#xff0c;显然后者的估计会更准确&#xff1b; • 虽然…

壹连科技净利润增速放缓:毛利率清一色下滑,研发费用率远弱同行

《港湾商业观察》施子夫 王璐 从2022年6月20日递表创业板以来&#xff0c;深圳壹连科技股份有限公司&#xff08;以下简称&#xff0c;壹连科技&#xff09;已经走了2年多的历程&#xff0c;如今离挂牌上市近在咫尺。 今年7月22日&#xff0c;壹连科技提交了注册申请。8月2日…

哪个电脑桌面便签好用并且无广告弹窗?

在日常生活和工作中&#xff0c;很多人喜欢在电脑桌面上使用便签软件。便签软件可以方便地记录临时任务、重要信息或者待办事项&#xff0c;帮助用户更好地管理时间和提高工作效率。想象一下&#xff0c;在繁忙的工作中&#xff0c;你能够快速在桌面便签上记下即将要做的任务&a…

基本K8s搭建Jekins+gitee项目自动部署

这里写目录标题 1.基本K8s部署安装Jekins2.设置Jenkins国内镜像源2.安装Gitee插件1.安装Gitee Plugin2.验证安装Gitee Plugin 3.新建任务1.输入任务名称2.输入你gitee上的项目链接3.测试构建 4.查看项目在k8s集群master节点的位置1.确认 Jenkins Pod 名称2.使用kubectl exec到 …

大数据技术复习--概述

概述 数据的概念&#xff1a;数据是指对客观事件进行记录并可以鉴别的符号&#xff0c;是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合&#xff0c;是可识别的、抽象的符号。 数据类型&#xff1a;文本、图片、音频、视频 从数据的结构化程…

2024华数杯全国大学生数学建模竞赛B题思路-VLSI电路单元的自动布局-MIA 感知的详细布局问题描述

本章主要对超大规模集成电路&#xff08;Very Large Scale Integration Circuit&#xff0c;VLSI&#xff09;布局 问题进行了描述&#xff0c;首先简单梳理一下超大规模集成电路设计流程、物理设计相关的知 识&#xff0c;接着对 MIA 感知的混合高度单元集成电路详细布局问题的…

vue之ref 属性

文章目录 1.ref 属性概述1.1 作用和特点 2.vue2用法2.1 获取 dom2.3 获取组件&#xff1a; 3.vue3用法 1.ref 属性概述 1.1 作用和特点 &#xff08;1&#xff09;作用&#xff1a;用来给元素或组件注册引用信息(相当于是id的替代者) &#xff08;2&#xff09;应用在HTML标签…

Kettle下载安装MySQL驱动教程

在 Windows 系统上下载适用于 MySQL 的 JDBC 驱动程序&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 访问 MySQL 官方下载页面 打开浏览器&#xff1a; 打开您喜欢的浏览器。 访问 MySQL Connector/J 下载页面&#xff1a; 访问 MySQL Connector/J 下载页面. 2. 选择…

探索亚马逊Amazon S3:无缝存储管理与极速数据传输的奥秘

亚马逊云科技中Amazon S3&#xff0c;因其设计简单与高度可靠&#xff0c;允许用户通过互联网存储和检索任意数量的数据&#xff0c;并能够自动扩展以满足各种规模的需求&#xff0c;使得Amazon S3成为了许多云计算应用和网站的核心存储基础设施之一&#xff0c;Amazon S3提供的…

WSL2安装多个Ubuntu实例,大佬带你玩转Linux!!!

安装wsl子系统并安装一个Ubuntuwsl ubuntu 安装的正确方式-CSDN博客文章浏览阅读546次,点赞10次,收藏4次。wsl ubuntu 安装的正确方式:将wsl2设置为默认版本:1、打开powershell2、设置wsl的版本为2​编辑3、更新wsl程序4、强制关闭子系统5、查看wsl支持的列表6、安装指定版…

【Dynamo】AnyCAD使用Dynamo绘制三维模型(二)——生成序列和范围的几种方式

说明&#xff1a; Dynamo为开源项目&#xff0c;开源地址&#xff1a;https://github.com/DynamoDS/Dynamo.git本文章使用版本&#xff1a;v3.0.3 范围 使用Range节点 start和end分别表示范围的边界&#xff0c;step表示步长。如下为[1,10]范围内步长为2结果 ​ 使用Code…

[000-01-025].第07节:WorkBench

我的后端学习大纲 我的Drools学习大纲 8. WorkBench 8.1 WorkBench简介: 1.WorkBench是KIE组件中的元素&#xff0c;也称为KIE-WB&#xff0c;是Drools-WB与JBPM-WB的结合体。它是一个可视化的规则编辑器。WorkBench其实就是一个war包&#xff0c;安装到tomcat中就可以运行。…

UE Sequence学习

UE4中的动画编辑器 —— Sequencer in UE4 - 知乎 (zhihu.com) UE4 LevelSequence源码解析 - 知乎 (zhihu.com) C模块 对ue4 sequence的学习和理解 - 知乎 (zhihu.com) 必须要先在你项目工程的.build.cs里加入 MoviePlayer, LevelSequence, MovieScene. 引入头文件 #inclu…

我所理解的sprd-camera摄像头框架流程分析

摄像头的图像格式:RGB24,RGB565,RGB444,YUV4:2:2 RGB24 表示R、G、B ,3种基色都用8个二进制位表示,那么红色、绿色、蓝色各有256种,那么由这三种基色构成的颜色就是256X256X256=16,777,216种,约等于1677万。UV 和我们熟知的 RGB 类似,是一种颜色编码格式。 YUV 包含三…

sonatype私服配置与下载

文章目录 私服下载地址setting.xml配置java中pom.xml配置上传 私服 下载地址 地址&#xff1a;https://help.sonatype.com/en/download.html 百度网盘地址链接: https://pan.baidu.com/s/1_sjjHbXs27ya49SEcN9XNw 提取码: g56i 1.下载后解压得到两个文件 2.进入到nexus-3.…

揭秘脑囊肿:了解那些不容忽视的症状

脑囊肿&#xff0c;作为颅内的一种良性占位性病变&#xff0c;虽然不常见&#xff0c;但其潜在的症状却可能对患者的生活质量产生显著影响。了解脑囊肿的症状&#xff0c;对于及时诊断和治疗至关重要。 头痛&#xff1a;脑囊肿最常见的症状之一是头痛&#xff0c;这通常是由于囊…

【海贼王航海日志:前端技术探索】CSS你了解多少?(一)

目录 1 -> CSS是什么 2 -> 基本语法规范 3 -> 引入方式 3.1 -> 内部样式表 3.2 -> 行内样式表 3.3 -> 外部样式 4 -> 代码风格 4.1 -> 样式格式 5 -> 选择器 5.1 -> 选择器的功能 5.2 -> 选择器的种类 5.3 -> 基础选择器 5.3…