当前位置: 首页 > article >正文

UE5中使用UTexture2D进行纹理绘制

在UE中有时需要在CPU阶段操作像素,生成纹理贴图等,此时可以通过UTexture2D来进行处理,例子如下:
在这里插入图片描述

1.CPP部分

首先创建一个蓝图函数库,将UTexture2D的绘制逻辑封装成单个函数:
.h:

#include "CoreMinimal.h"
#include "Engine/Texture2D.h"
#include "Engine/Texture.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"

UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
	
	UFUNCTION(BlueprintCallable, Category = "Texture")
	static UTexture2D* GenTexture(int32 Width, int32 Height);
};

.cpp:

#include "MyBlueprintFunctionLibrary.h"

UTexture2D* UMyBlueprintFunctionLibrary::GenTexture(int32 Width, int32 Height)
{
    // 创建临时纹理
    UTexture2D* NewTexture = UTexture2D::CreateTransient(Width, Height);

    // 配置纹理
    NewTexture->MipGenSettings = TMGS_NoMipmaps;
    NewTexture->CompressionSettings = TC_VectorDisplacementmap;
    NewTexture->SRGB = false;

    // 锁定纹理数据进行写入
    FTexture2DMipMap& Mip = NewTexture->PlatformData->Mips[0];
    void* TextureData = Mip.BulkData.Lock(LOCK_READ_WRITE);

    // 设置三角形的大小
    int32 TriangleSize = Width / 10;  // 每个三角形的宽度和高度

    // 设置默认颜色
    FColor* FormattedImageData = static_cast<FColor*>(TextureData);
    for (int32 y = 0; y < Height; ++y)
    {
        for (int32 x = 0; x < Width; ++x)
        {
            int32 LocalX = x % TriangleSize;
            int32 LocalY = y % TriangleSize;

            // 判断像素是否在当前三角形内
            if (LocalX >= LocalY)  // 这里绘制一个局部的三角形
            {
                FormattedImageData[x + y * Width] = FColor::Red; // 三角形内部像素
            }
            else
            {
                FormattedImageData[x + y * Width] = FColor::Black; // 背景色
            }
        }
    }

    // 解锁纹理数据
    Mip.BulkData.Unlock();
    NewTexture->UpdateResource();

    return NewTexture;
}

需要修改build.cs添加模块引用:

PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "RenderCore", "RHI", "ProceduralMeshComponent" });

2.蓝图部分

新建材质球暴露材质参数img1:
在这里插入图片描述
创建Actor类型蓝图,添加一个Mesh类组件,这里添加一个Cube:
在这里插入图片描述
使用刚刚的GenTexture节点创建材质纹理,运行后即可查看效果。


https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/Engine/UTexture2D


http://www.kler.cn/a/309024.html

相关文章:

  • Python数据预处理
  • OLED 显示画面的变换操作——上下、左右翻转
  • Sql server 备份还原方法
  • FPGA实现以太网(二)、初始化和配置PHY芯片
  • ESP32-S3模组上跑通esp32-camera(12)
  • HTML5和CSS3的进阶_HTML5和CSS3的新增特性
  • 【OpenAPI】Spring3 集成 OpenAPI 生成接口文档
  • (web自动化测试+python)1
  • 金蝶云星空和金蝶云星空接口打通对接实战
  • Vite:快速构建现代Web应用的工具
  • 硬件工程师笔试面试——无线通讯模块
  • 服务器管理:从零开始的服务器安装与配置指南
  • elasticsearch 开启API密钥进行认证
  • Python骨架长度检测
  • leetcode-4. 寻找两个正序数组的中位数
  • 使用QT编写有图形界面的TCP局域网聊天室(app)
  • QT使用事件事件和绘制事件实现简易时钟
  • java自定义注解
  • 数据结构——二叉搜索树
  • linux-网络管理-防火墙配置
  • 面试真题-TCP的三次握手
  • STM32外设-0.96寸OLED显示屏
  • [数据集][目标检测]男女性别检测数据集VOC+YOLO格式9769张2类别
  • AI重塑视觉体验:将图像与视频转化为逼真可编辑的3D虚拟场景
  • 使用jackson将xml和对象、List相互转换
  • 碰撞检测 | 图解线段几何与线段相交检测原理(附ROS C++可视化)