this is MyCode:
void UDynamicAccessGBufferRenderTarget::CaputerGBuffer_RenderThread(FCommitRenderData* pRenderData)
{
FRHICommandListImmediate& RHICmdList = GRHICommandList.GetImmediateCommandList();
//计数加一避免Render完成后直接清空了GBuffer,但会慢一帧,你猜
FSceneRenderTargets::Get(RHICmdList).AdjustGBufferRefCount(RHICmdList, 1);
FSceneRenderTargets& SceneContext = FSceneRenderTargets::Get(RHICmdList);
if (SceneContext.GBufferA && pRenderData->mTextureTarget != nullptr)
{
FTexture2DRHIRef vTextTarget;
switch (pRenderData->EShowBuff)
{
case EDZShowGbuffer::VE_GDZSHOWBUFFERA:
vTextTarget = SceneContext.GetGBufferATexture();
break;
case EDZShowGbuffer::VE_GDZSHOWBUFFERB:
vTextTarget = SceneContext.GetGBufferBTexture();
break;
case EDZShowGbuffer::VE_GDZSHOWBUFFERC:
vTextTarget = SceneContext.GetGBufferCTexture();
break;
case EDZShowGbuffer::VE_GDZSHOWBUFFERD:
vTextTarget = SceneContext.GetGBufferDTexture();
break;
case EDZShowGbuffer::VE_GDZSHOWBUFFERE:
vTextTarget = SceneContext.GetGBufferETexture();
break;
break;
default:
vTextTarget = SceneContext.GetGBufferATexture();
break;
}
pRenderData->format = vTextTarget->GetFormat();
if (pRenderData->canvasWidth != vTextTarget->GetSizeX())
{
pRenderData->isGetGBufferData = false;
return;
}
FTextureReferenceRHIRef vTexRHIRef = pRenderData->mTextureTarget->TextureReference.TextureReferenceRHI;
FRHITexture* vRTTexture = vTexRHIRef->GetTextureReference()->GetReferencedTexture();
FRHITexture2D* vtex = (FRHITexture2D*)vRTTexture;
if (vtex == nullptr)
{
return;
}
switch (pRenderData->ECOPYBuffType)
{
case EDZCOPYGbufferType::VE_GDZSHOWGBUFFER_COPYMIP:
UDynamicAccessGBufferRenderTarget::Copy_TextureRHI(RHICmdList,vtex, vTextTarget);
break;
case EDZCOPYGbufferType::VE_GDZSHOWBUFFERR_COPYMEMO:
UDynamicAccessGBufferRenderTarget::Copy_MemoryRHI(RHICmdList, vtex, vTextTarget);
break;
case EDZCOPYGbufferType::VE_GDZSHOWBUFFERC_CPUARRAY:
UDynamicAccessGBufferRenderTarget::Copy_CPUArrayRHI();
break;
default:
break;
}
RHICmdList.CopySharedMips(vtex, vTextTarget);
}
//移除
FSceneRenderTargets::Get(RHICmdList).AdjustGBufferRefCount(RHICmdList, -1);
}
Two ways with Access the data to view:
//利用SharedMip的共享方式在这里会快一些
//扩展方式
void UDynamicAccessGBufferRenderTarget::Copy_TextureRHI(FRHICommandListImmediate& RHICmdList,FRHITexture2D* pDesc,FRHITexture2D* pSrc)
{
RHICmdList.CopySharedMips(pDesc, pSrc);
}
//内存CPY,但需要锁住,这样就会让另外的渲染不能访问,会造成掉帧率。
void UDynamicAccessGBufferRenderTarget::Copy_MemoryRHI(FRHICommandListImmediate& RHICmdList, FRHITexture2D* pDesc, FRHITexture2D* pSrc)
{
uint32 Lolstrid = 0;
void * UAVRenderTargetData = RHILockTexture2D(pDesc, 0, RLM_WriteOnly, Lolstrid, true);
void * UAVCSData = RHILockTexture2D(pSrc, 0, RLM_ReadOnly, Lolstrid, true);
FMemory::Memcpy(UAVRenderTargetData, UAVCSData, GPixelFormats[pSrc->GetFormat()].BlockBytes * pSrc->GetSizeX() * pSrc->GetSizeY());
RHICmdList.UnlockTexture2D(pDesc, 0, false);
RHICmdList.UnlockTexture2D(pSrc, 0, false);
}