UE5数据传递-纹理贴图

期待结果:

流程

1. 通过C++写入数据到纹理贴图
2. 在材质中通过采样能正确读取写入的数值

踩坑:

1. UE5之后,需要设置采样类型,才能达到上图效果,默认采样类型做了插值计算

FColor中写入 PF_B8G8R8A8

UTexture2D* ConvertFloatArr2Texture(TArray<FVector> inFArr) {if (inFArr.IsEmpty()) return nullptr;//FlushRenderingCommands();uint32 len = inFArr.Num();float templen = FMath::Sqrt(len);uint32 text_len = FMath::CeilToInt(templen);text_len = FMath::CeilToInt(log2(text_len));text_len = FMath::Pow(2, text_len);uint32 Totallen = FMath::Pow(text_len, 2);FColor* datas = new FColor[Totallen];for (uint32 i = 0; i < Totallen;++i) {if (i < len) {FColor Tempcolor;Tempcolor.B = inFArr[i].X;Tempcolor.G = inFArr[i].Y;Tempcolor.R = inFArr[i].Z;Tempcolor.A = 255;datas[i] = Tempcolor;}else {FColor Tempcolor(0,0,0,1);datas[i] = Tempcolor;}}UTexture2D* temp = UTexture2D::CreateTransient(text_len, text_len, PF_B8G8R8A8);temp->Filter = TF_Nearest;void* TextureData = temp->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE);FPlatformMemory::Memcpy(TextureData, datas, Totallen * sizeof(uint8)*4);temp->GetPlatformData()->Mips[0].BulkData.Unlock();temp->UpdateResource();return temp;
}

FFloat16数据写入PF_FloatRGBA

void ConvertFloatArr2Texture(TArray<float> inFArr, int width, int height) {if (inFArr.IsEmpty()) return;FFloat16* datas = new FFloat16[height * width * 4];for (auto it = 0; it < 256; ++it) {FFloat16 ff(inFArr[it]);datas[it] = ff;}UTexture2D* temp = UTexture2D::CreateTransient(width, height, PF_FloatRGBA);temp->Filter = TF_Nearest;//temp->MipGenSettings = TextureMipGenSettings::TMGS_NoMipmaps;//temp->CompressionSettings = TextureCompressionSettings::TC_VectorDisplacementmap;void* TextureData = temp->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE);FMemory::Memmove(TextureData, datas, height * width * 4 * sizeof(FFloat16));temp->GetPlatformData()->Mips[0].BulkData.Unlock();// 更新纹理数据temp->UpdateResource();}

将FFloat32写入PF_R32G32B32F类型贴图

UTexture2D* ConvertFloatArr2Texture(TArray<FVector> inFArr) {if (inFArr.IsEmpty()) return nullptr;//FlushRenderingCommands();uint32 len = inFArr.Num();float templen = FMath::Sqrt(len);uint32 text_len = FMath::CeilToInt(templen);text_len = FMath::CeilToInt(log2(text_len));text_len = FMath::Pow(2, text_len);uint32 Totallen = FMath::Pow(text_len, 2);FFloat32* datas = new FFloat32[Totallen*4];for (uint32 i = 0; i < Totallen;++i) {if (i < len) {datas[i * 3 + 0] = inFArr[i].X;datas[i * 3 + 1] = inFArr[i].Y;datas[i * 3 + 2] = inFArr[i].Z;}else {datas[i * 4 + 0] = 0.0f;datas[i * 4 + 1] = 0.0f;datas[i * 4 + 2] =0.0f;}}UTexture2D* temp = UTexture2D::CreateTransient(text_len, text_len, PF_R32G32B32F);temp->Filter = TF_Nearest;void* TextureData = temp->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE);FPlatformMemory::Memcpy(TextureData, datas, Totallen * sizeof(FFloat32)*3);temp->GetPlatformData()->Mips[0].BulkData.Unlock();temp->UpdateResource();return temp;
}

写入FLinearColor到PF_A32B32G32R32F格式的贴图

UTexture2D* ConvertFloatArr2Texture(TArray<FVector> inFArr) {if (inFArr.IsEmpty()) return nullptr;//FlushRenderingCommands();uint32 len = inFArr.Num();float templen = FMath::Sqrt(len);uint32 text_len = FMath::CeilToInt(templen);text_len = FMath::CeilToInt(log2(text_len));text_len = FMath::Pow(2, text_len);uint32 Totallen = FMath::Pow(text_len, 2);FLinearColor* datas = new FLinearColor[Totallen];for (uint32 i = 0; i < Totallen;++i) {if (i < len) {datas[i].R= inFArr[i].X;datas[i].G = inFArr[i].Y;datas[i].B = inFArr[i].Z;datas[i].A = 1.0;}else {datas[i].R = 0.0;datas[i].G = 0.0;datas[i].B = 0.0;datas[i].A = 1.0;}}UTexture2D* temp = UTexture2D::CreateTransient(text_len, text_len, PF_A32B32G32R32F);temp->Filter = TF_Nearest;void* TextureData = temp->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE);FPlatformMemory::Memcpy(TextureData, datas, Totallen * sizeof(FLinearColor));temp->GetPlatformData()->Mips[0].BulkData.Unlock();temp->UpdateResource();return temp;
}

FFloat16数据写入灰度图PF_R16F

UTexture2D* ConvertFloatArr2Gray(TArray<FFloat16> inFArr, int32 width, int32 height) {if (inFArr.IsEmpty()) return nullptr;UTexture2D* temp = UTexture2D::CreateTransient(width, height, PF_R16F);temp->MipGenSettings = TextureMipGenSettings::TMGS_NoMipmaps;void* TextureData = temp->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE);FMemory::Memzero(TextureData, width* height * sizeof(FFloat16));//temp->SRGB = false;//temp->CompressionSettings = TC_Displacementmap;FMemory::Memmove(TextureData, inFArr.GetData(), inFArr.Num() * sizeof(FFloat16));temp->GetPlatformData()->Mips[0].BulkData.Unlock();// 更新纹理数据temp->UpdateResource();UpdateKrigingTexture(temp);return temp;
}

纹理采样

方案一

for(int inw=0;inw<point_width;++inw)
{float2 Kriging_UV=float2(0,0);Kriging_UV[0]=float1(inw/point_width);for(int inh=0;inh<point_height;++inh){Kriging_UV[1]=float1(inh/point_height);//计算UV偏移float2 offset=float2(point_width,point_height);offset=1/offset;Kriging_UV=float2(offset*offsetCoord+Kriging_UV);//float4 point_T=Texture2DSample(in_Tex,Material.Texture2D_0Sampler, Kriging_UV);float3 point_T=in_Tex.Load(int3(Kriging_UV,0));}
}

方案二

float4 h=Texture2DSample(tex,texSampler,uv)
return h;
//另外采样方式
//float3 point_T=in_Tex.Load(int3(Kriging_UV,0));

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

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

相关文章

AI 绘画 | Stable Diffusion 艺术二维码制作

前言 这篇文章教会你如果用Stable Diffusion WEB UI制作艺术二维码,什么是艺术二维码呢?就是普通二维码和艺术图片融合后的二维码图片,如下图所示。主要原理还是使用controlNet的control_v1p_sd15_qrcode_monster模型和光影模型control_v1p_sd15_brightness。 教程 准备…

【论文阅读笔记】NeRF+Mip-NeRF+Instant-NGP

目录 前言NeRF神经辐射场体渲染连续体渲染体渲染离散化 方法位置编码分层采样体渲染推导公式&#xff08;1&#xff09;到公式&#xff08;2&#xff09;部分代码解读相机变换&#xff08;重要&#xff01;&#xff09; Mip-NerfTo do Instant-NGPTo do 前言 NeRF是NeRF系列的…

DIP——边缘提取与分割

1.使用canny算法进行边缘提取 本实验比较简单&#xff0c;基本思路是对原图像进行一个高斯模糊处理&#xff0c;用于去噪&#xff0c;之后转换为灰度图&#xff0c;直接调用cv库中的canny记性边缘提取。若想直接得到彩色边缘&#xff0c;则通过按位与操作&#xff0c;将原始彩色…

ingress介绍和ingress通过LoadBalancer暴露服务配置

目录 一.ingress基本原理介绍 1.将原有用于暴露服务和负载均衡的服务的三四层负载均衡变为一个七层负载均衡 2.controller和ingress 3.通过下面这个图可能会有更直观的理解 二.为什么会出现ingress 1.NodePort存在缺点 2.LoadBalancer存在缺点 三.ingress三种暴露服务的…

基于JavaWeb+SSM+Vue微信小程序的科创微应用平台系统的设计和实现

基于JavaWebSSMVue微信小程序的科创微应用平台系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术…

Linux Component概述和高通component的使用

1 Linux为什么要引入Component框架&#xff1f; 为了让subsystem按照一定顺序初始化设备才提出来的。 subsystem中由很多设备模块&#xff0c;内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video …

【C语言程序设计】编写简单的C程序

目录 前言 一、程序设计 二、程序改错 三、程序完善 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如…

unity 2d 入门 飞翔小鸟 死亡 显示GameOver(十四)

1、添加Img create->ui->img 把图片拖进去 2、和分数一样、调整位置 3、修改角色脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : MonoBehaviour {//获取小鸟&#xff08;刚体&#xff09;private Rigidbod…

【Apipost】批量删除我的51CTO文章

文章目录 一、序二、API分析三、Apipost测试四、脚本五、Apipost中完成 一、序 去年开始再51CTO同步更新文章&#xff0c;一年多过去了&#xff0c;只涨了3个粉丝。看了下这个平台就是卖课、搞培训的&#xff0c;退出了。决定把文章也删除了&#xff08;有人私信我说专门注册了…

ToolkenGPT:用大量工具增强LLM

深度学习自然语言处理 原创作者&#xff1a;cola 用外部工具增强大型语言模型(LLM)已经成为解决复杂问题的一种方法。然而&#xff0c;用样例数据对LLM进行微调的传统方法&#xff0c;可能既昂贵又局限于一组预定义的工具。最近的上下文学习范式缓解了这一问题&#xff0c;但有…

Shell 常用命令详解-上

Shell 常用命令详解-上 1.目录查阅相关命令2.文件操作相关命令 1.目录查阅相关命令 ll 命令 命令描述&#xff1a;ll命令用于显示指定工作目录下的内容。 命令格式&#xff1a;ll [参数] [目录名]。 参数说明&#xff1a; 参数说明-a显示所有文件及目录&#xff08;包括隐藏文…

【机器学习】041_模型开发迭代过程

一、模型开发的一般步骤 1. 明确研究问题 确定问题的组成和结果&#xff0c;明晰问题是分类问题还是回归问题 2. 决定系统总体架构 ①理解数据&#xff1a;采集&#xff08;爬取&#xff09;数据&#xff0c;生成&#xff08;导入&#xff09;数据&#xff0c;进行数据清洗…

代码随想录二刷 |二叉树 |101. 对称二叉树

代码随想录二刷 &#xff5c;二叉树 &#xff5c;101. 对称二叉树 题目描述解题思路 & 代码实现递归法迭代法使用队列使用栈 题目描述 101.对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,…

zcms企业官网建站系统源码搭建-支持页面自定义

1.支持mysql&#xff0c;sqlite&#xff0c;access三种数据库。 2.模板和标签与asp版的zzzcms通用。 3.asp版的zzzcms的access数据库可直接使用。 4.支持手机站。 &#xff08;增删改查不做描述&#xff09;&#xff1a; 网站信息 名称&#xff0c;logo&#xff0c;微信&…

基于OpenCV的流水线包装箱检测计数应用(附源码)

导 读 本文主要介绍基于OpenCV的流水线包装箱检测计数应用,并给出源码。 资源下载 完整代码和视频下载地址: https://github.com/freedomwebtech/rpi4-conveyor-belt-boxces-counter 核心代码如下(cboxtest.py): import cv2import numpy as npfrom tracker import*cap=c…

【MYSQL】单表查询

查询语法&#xff1a; select 字段&#xff08;*表示全字段&#xff09; from 数据表 【where 条件表达式】 【group by 分组字段【having 分组条件表达式】】 【order by 排序字段【asc | desc】】 例子&#xff1a; 教职工表Teacher(Tno, TName, age, sal, mgr, DNo)&#…

C# 图解教程 第5版 —— 第17章 转换

文章目录 17.1 什么是转换17.2 隐式转换17.3 显示转换和强制转换17.4 转换的类型17.5 数字的转换17.5.1 隐式数字转换17.5.2 溢出检测上下文17.5.3 显示数字转换 17.6 引用转换17.6.1 隐式引用转换17.6.2 显式引用转换17.6.3 有效显式引用转换 17.7 装箱转换17.7.1 装箱是创建副…

MySQL - 聚簇索引和非聚簇索引,回表查询,索引覆盖,索引下推,最左匹配原则

聚簇索引和非聚簇索引 聚簇索引和非聚簇索引是 InnoDB 里面的叫法 一张表它一定有聚簇索引&#xff0c;一张表只有一个聚簇索引在物理上也是连续存储的 它产生的过程如下&#xff1a; 表中有无有主键索引&#xff0c;如果有&#xff0c;则使用主键索引作为聚簇索引&#xff1b;…

【Scala】Scala中的一些基本数据类型的特性 列表、元组、构造器、单例对象、伴生类、伴生对象、抽象类与特质

列表 使用List(“”,“”,“”)去声明 sliding 和 groued表示迭代器 val iter List("Hadoop", "Spark", "Scala") sliding 2// sliding 和 groued 是有区别的while (iter.hasNext){println(iter.next())}for (elem <- iter){println(elem)}…

极速学习SSM之SpringMVC笔记

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…