使用C++编写一个可以在UE蓝图中调用的节点功能是传入一个纹理图片根据输入的X和Y坐标在纹理图片上找到相应的像素并输出此像素的颜色信息。请提供完整的c++代码包括cpp和头文件代码
头文件代码:
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"
/**
*
*/
UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "My Functions")
static FLinearColor GetPixelColorFromTexture(UTexture2D* Texture, int32 X, int32 Y);
};
cpp代码:
#include "MyBlueprintFunctionLibrary.h"
#include "Engine/Texture2D.h"
#include "Engine/TextureRenderTarget2D.h"
#include "Engine/Texture2DDynamic.h"
FLinearColor UMyBlueprintFunctionLibrary::GetPixelColorFromTexture(UTexture2D* Texture, int32 X, int32 Y)
{
// Check if texture is valid
if (!Texture)
{
UE_LOG(LogTemp, Error, TEXT("GetPixelColorFromTexture: Invalid texture"));
return FLinearColor::Black;
}
// Get texture size
FIntPoint TextureSize = Texture->GetImportedSize();
// Check if coordinates are within texture bounds
if (X < 0 || X >= TextureSize.X || Y < 0 || Y >= TextureSize.Y)
{
UE_LOG(LogTemp, Error, TEXT("GetPixelColorFromTexture: Coordinates out of bounds"));
return FLinearColor::Black;
}
// Get texture data
FTexture2DMipMap& Mip = Texture->PlatformData->Mips[0];
void* Data = Mip.BulkData.Lock(LOCK_READ_ONLY);
int32 BytesPerPixel = Mip.SizeX * Mip.SizeY * sizeof(FColor);
uint8* Pixels = new uint8[BytesPerPixel];
FMemory::Memcpy(Pixels, Data, BytesPerPixel);
Mip.BulkData.Unlock();
// Get pixel color
int32 PixelIndex = (Y * TextureSize.X) + X;
FColor PixelColor = ((FColor*)Pixels)[PixelIndex];
// Free memory
delete[] Pixels;
return PixelColor.Linear();
}
使用方法:
在蓝图中添加一个节点,选择Category为“My Functions”,函数名为“Get Pixel Color From Texture”,输入参数为Texture(需要连接一个有图像的Texture2D)、X坐标和Y坐标,输出类型为LinearColor,即像素的颜色信息。
原文地址: http://www.cveoy.top/t/topic/bLxb 著作权归作者所有。请勿转载和采集!