9、osg的texture转换为虚幻引擎的UTexture2D

news/2024/10/19 3:34:04/

从osg::Texture中读取纹理图片,并动态转换为虚幻引擎的UTexture2D,不过这段代码只能转换图片格式为R8G8B8A8的纹理图片,其他格式请根据实际情况进行修改

UTexture2D* ConvertOsgTexture2UeTexture2D(osg::Texture* texture) {if (texture){const unsigned int numImages = texture->getNumImages();if (numImages != 0) {for (unsigned int j = 0; j < numImages; j++) {osg::ref_ptr<osg::Image> img = texture->getImage(j);//osgb的纹理坐标的y轴和虚幻引擎的纹理坐标的y轴是相反的img->flipVertical();const int imgWidth = img->s();const int imgHeight = img->t();UTexture2D* ueTexture2D = NewObject<UTexture2D>();ueTexture2D->AddToRoot();FTexturePlatformData* platformData = new FTexturePlatformData();ueTexture2D->SetPlatformData(platformData);ueTexture2D->PlatformData->SizeX = imgWidth;ueTexture2D->PlatformData->SizeY = imgHeight;ueTexture2D->PlatformData->SetNumSlices(1);ueTexture2D->PlatformData->PixelFormat = EPixelFormat::PF_R8G8B8A8;//填充texture,创建一个像素数组,然后为每个数组定义颜色。数组大小为width*height*每个像素的字节const int32 numBlocksX = imgWidth / GPixelFormats[EPixelFormat::PF_R8G8B8A8].BlockSizeX;const int32 numBlocksY = imgHeight / GPixelFormats[EPixelFormat::PF_R8G8B8A8].BlockSizeY;const int32 size = numBlocksX * numBlocksY * GPixelFormats[EPixelFormat::PF_R8G8B8A8].BlockBytes;//接下来,把颜色数组输入到纹理中去FTexture2DMipMap* mip = new FTexture2DMipMap();mip->SizeX = imgWidth;mip->SizeY = imgHeight;mip->BulkData.Lock(LOCK_READ_WRITE);uint8* pTextureData = static_cast<uint8*>(mip->BulkData.Realloc(size));memset(pTextureData, 255, size);for (int k = 0; k < imgWidth * imgHeight; k++){FMemory::Memcpy(&pTextureData[k * 4], &img->data()[k * 3], 3 * sizeof(uint8));}mip->BulkData.Unlock();ueTexture2D->PlatformData->Mips.Add(mip);//保存textureueTexture2D->UpdateResource();return ueTexture2D;}}}return nullptr;
}

http://www.ppmy.cn/news/1427599.html

相关文章

交换排序:冒泡排序和快速排序

冒泡排序 思路 通过多次遍历数组&#xff0c;比较相邻的元素&#xff0c;并交换它们&#xff0c;使得每次遍历结束后&#xff0c;最大&#xff08;或最小&#xff09;的元素都“冒泡”到数组的末尾 实现 public class Main {public static void main(String[] args) {int[] …

【AIGC】文本与音频生成引领行业革新

AIGC技术崛起 一、AIGC技术概述二、文本生成&#xff1a;结构化与创作型并进三、实例与代码解析四、音频生成&#xff1a;语音合成技术大放异彩五、结语 在科技的浪潮中&#xff0c;人工智能与大数据的结合不断推动着时代的进步。其中&#xff0c;AIGC&#xff08;Artificial I…

大厂面试精华面试刷题

1.自定义unshift实现相同效果 2.数组去重 用vs2019来写这种练习题可以更直观的查看代码执行的效果&#xff0c;最后的代码是控制控制台执行完毕后不自动关闭 use strict;let arr [1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10] //1.//查重最简单的方法for循环结合splice从数组中…

51单片机工程模板的建立(基于STC15系列库)

一、开启前准备 1.STC15官方库文件 1.1 stc15-software-lib-v1.0.rar&#xff1b;下载地址&#xff1a;STC15系列库&#xff08;带使用手册&#xff09;资源-CSDN文库 2.Keil4_C51软件&#xff0c;或其它版本&#xff1b; 二、创建工程模板 1.建立文件分类 listing&#xf…

Android 原生功能与 Vue 交互实现

前端用 Android webview 嵌入 vue 地址&#xff0c;如何在vue 页面中显示 Android 版本号 一.要在vue页面中显示Android版本号 从Android中将该信息传递给Vue应用程序。可以通过使用WebView的Java Bridge来实现此目的。这里是一些可能有用的步骤&#xff1a; 在你的Android代…

使用Python进行自动化测试

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 如何使用Python进行自动化测试&#xff1a;测试框架的选择与应用 自动化测试是软件开发过程…

TCP网络程序

上一章我们基于UDP实现了几个网络程序&#xff0c;这一章我们开始使用TCP。 先简单复习一下TCP和UDP的特点&#xff1a; TCP特点 传输层协议有连接可靠传输面向字节流 UDP特点 传输层协议无连接不可靠传输面向数据报 可以看到TCP是有链接的&#xff0c;而UDP是无连接的&#…

MyBatis 框架学习(II)

MyBatis 框架学习(II) 文章目录 MyBatis 框架学习(II)1. 介绍2. 准备&测试2.1 配置数据库连接字符串和MyBatis2.2 编写持久层代码 3. MyBatis XML基础操作3.1 Insert 操作3.2 Delete 操作3.3 Update 操作3.4 Select 操作 4. #{} 与 ${}的使用5. 动态SQL操作5.1 < if >…