UE4纹理Texture2D绘制

该代码段展示了如何在GPU渲染线程中利用UTexture2D进行图像操作。首先,它创建一个黑色背景的清晰颜色数组,然后更新指定纹理的一个区域,通过FUpdateTextureRegion2D实现。在Tick函数中,它被调度到渲染队列以执行DrawInRenderThread。此代码实现了根据给定点(x, y)和半径绘制圆形的逻辑,填充黑色和绿色来区分圆内和圆外的像素。
摘要由CSDN通过智能技术生成
void XXX::DrawInRenderThread(
    FRHICommandListImmediate& RHICmdList,
    ERHIFeatureLevel::Type FeatureLevel
)
{
    check(IsInRenderingThread());
	// clearColors是图像清除时的底色
	TArray<FColor> clearColors;

	for (uint32 Row = 0; Row < cameraInfo->height; ++Row)
	{
		for (uint32 Col = 0; Col < cameraInfo->width; ++Col)
		{
			clearColors.Add(FColor::Black);
		}
	}

	// 用于绘制的纹理
	UTexture2D* tex = m_texture;

	FTextureReferenceRHIRef MyTextureRHI = tex->TextureReference.TextureReferenceRHI;
	FRHITexture* TexRef = MyTextureRHI->GetTextureReference()->GetReferencedTexture();

	FRHITexture2D* TexRef2D = (FRHITexture2D*)TexRef;
	uint32 LolStride = 0;

	int width = tex->PlatformData->SizeX;
	int height = tex->PlatformData->SizeY;

	int x = 30;
	int y = 50;
	int radius = 20;

	// 清空代码
	// FUpdateTextureRegion2D region = FUpdateTextureRegion2D(0, 0, 0, 0, width, height);
	// RHIUpdateTexture2D(TexRef2D, 0, region, LolStride, (uint8*)clearColors.GetData());

	// 绘制代码
	TArray<FColor> colors;

	int rowMin = FMath::Max(0, y - radius);
	int rowMax = FMath::Min(height, y + radius);
	int colMin = FMath::Max(0, x - radius);
	int colMax = FMath::Min(width, x + radius);

	int radius2 = radius * radius;

	// 根据直径画圆
	for (int row = rowMin; row <= rowMax; row++)
	{
		for (int col = colMin; col <= colMax; col++)
		{
			int rowDis = row - y;
			int colDis = col - x;
			int distance = rowDis * rowDis + colDis * colDis;

			if (distance < radius2)
			{
				colors.Add(FColor::Black);
			}
			else {
				colors.Add(FColor::Green);
			}
		}
	}

	FUpdateTextureRegion2D region = FUpdateTextureRegion2D(colMin, rowMin, 0, 0, colMax - colMin, rowMax - rowMin);
	RHIUpdateTexture2D(TexRef2D, 0, region, LolStride, (uint8*)colors.GetData());
}

// 调用
void XXX::Tick(float DeltaTime)
{
     UWorld* World = pThis->GetWorld();
     ERHIFeatureLevel::Type FeatureLevel = World->Scene->GetFeatureLevel();

     // 绘图
     ENQUEUE_RENDER_COMMAND(CaptureCommand)(
         [FeatureLevel](FRHICommandListImmediate& RHICmdList)
     {
         pThis->DrawInRenderThread
         (
             RHICmdList,
             FeatureLevel
         );
     }
     );
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值