I have implemented a stereoscopic rendering device and inherited the ISceneViewExtension
interface. I intend to process the ViewFamily
's RenderTarget
in the PostRenderViewFamily_RenderThread
interface of ISceneViewExtension
, using a compute shader to interleave the left and right views, and then reassign the output result back to the ViewFamily
. The current issue is that it runs correctly in the editor but fails to work after packaging. The relevant code is as follows:
void FBN3DStereoRenderingDevice::PostRenderViewFamily_RenderThread(FRDGBuilder& GraphBuilder, FSceneViewFamily& InViewFamily)
{
UE_LOG(LogTemp, Log, TEXT("PostRenderViewFamily_RenderThread : %d"), InViewFamily.Views.Num());
if (!bIsStereo) return;
if (!InViewFamily.RenderTarget || !InViewFamily.RenderTarget->GetRenderTargetTexture())
{
UE_LOG(LogTemp, Error, TEXT("Invalid RenderTarget in ViewFamily!"));
return;
}
FIntPoint TargetSize = InViewFamily.RenderTarget->GetSizeXY();
if (TargetSize.X <= 0 || TargetSize.Y <= 0)
{
UE_LOG(LogTemp, Error, TEXT("Invalid render target size: %dx%d"), TargetSize.X, TargetSize.Y);
return;
}
FRDGTextureRef BackBuffer = GraphBuilder.RegisterExternalTexture(
CreateRenderTarget(
InViewFamily.RenderTarget->GetRenderTargetTexture(),
TEXT("BackBuffer")
),
ERDGTextureFlags::None
);
FRDGTextureDesc IntermediateDesc = FRDGTextureDesc::Create2D(
BackBuffer->Desc.Extent,
PF_A2B10G10R10,
FClearValueBinding::None,
TexCreate_ShaderResource | TexCreate_UAV
);
FRDGTextureRef IntermediateTexture = GraphBuilder.CreateTexture(IntermediateDesc, TEXT("IntermediateTexture"));
AddCopyTexturePass(GraphBuilder, BackBuffer, IntermediateTexture);
FRDGTextureDesc OutputDesc = FRDGTextureDesc::Create2D(
InViewFamily.RenderTarget->GetSizeXY(),
PF_A2B10G10R10,
FClearValueBinding::White,
TexCreate_RenderTargetable | TexCreate_ShaderResource | TexCreate_UAV | TexCreate_External
);
FRDGTextureRef outputTexture = GraphBuilder.CreateTexture(OutputDesc, TEXT("StereoInterweave"));
if (!BackBuffer || !outputTexture) {
UE_LOG(LogTemp, Log, TEXT("BackBuffer Or OutputTexture is InValide"));
return;
}
else {
UE_LOG(LogTemp, Log, TEXT("BackBuffer And OutputTexture is Valide"));
}
FBN3DComputeShaderInterface::Interweave(GraphBuilder, ResolutionX, ResolutionY, Mode, TexLayout,
PixelPitch, PixelWidth, PlaceHeight, Offset, Slant, Zadd, MiddleEyePos, IntermediateTexture, outputTexture);
AddCopyTexturePass(GraphBuilder, outputTexture, BackBuffer, FRHICopyTextureInfo());
}
void FBN3DComputeShaderInterface::DispatchRenderThread(FRDGBuilder& GraphBuilder, FBN3DComputeShaderDispatchParams Params) {
TShaderMapRef<FBN3DComputeShader> ComputeShader(GetGlobalShaderMap(GMaxRHIFeatureLevel), PermutationVector);
bool bIsShaderValid = ComputeShader.IsValid();
if (bIsShaderValid) {
FBN3DComputeShader::FParameters* PassParameters = GraphBuilder.AllocParameters<FBN3DComputeShader::FParameters>();
if (!Params.inputTexture || !Params.outputTexture) {
UE_LOG(LogTemp, Log, TEXT("Params.inputTexture || !Params.outputTexture is InValide!!!!"));
return;
}
else {
UE_LOG(LogTemp, Log, TEXT("Params.inputTexture || Params.outputTexture is Valide!!!!"));
}
···
PassParameters->BInputTexture = Params.inputTexture;
PassParameters->Result = GraphBuilder.CreateUAV(Params.outputTexture);
}
}
BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
```
SHADER_PARAMETER_RDG_TEXTURE(Texture2D, BInputTexture)
SHADER_PARAMETER_RDG_TEXTURE_UAV(RWTexture2D<float4>, Result)
END_SHADER_PARAMETER_STRUCT()
usf file:
#include "/Engine/Public/Platform.ush"
....
Texture2D BInputTexture;
RWTexture2D<float4> Result;
the error is:
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000044
LX3DProject!ValidateShaderParameters()
LX3DProject!FComputeShaderUtils::Dispatch() [D:\Program Files\Epic Games\UE_5.4\Engine\Source\Runtime\RenderCore\Public\RenderGraphUtils.h:500]
LX3DProject!TRDGLambdaPass<FBN3DComputeShader::FParameters,FBN3DComputeShaderInterface::DispatchRenderThread'::
5’::<lambda_1> >::Execute() [D:\Program Files\Epic Games\UE_5.4\Engine\Source\Runtime\RenderCore\Public\RenderGraphPass.h:630]
LX3DProject!FRDGBuilder::ExecutePass()
LX3DProject!FRDGBuilder::Execute()
LX3DProject!FSceneRenderer::RenderThreadEnd()
LX3DProject!UE::RendererPrivateUtils::Implementation::TPersistentBuffer<UE::HLSL::FCellBlockData,UE::RendererPrivateUtils::Implementation::FStructuredBufferTraits>::ValidateGPUData<
FSceneCullingBuilder::UploadToGPU’::51'::<lambda_1> >'::
12’::<lambda_1>::()
LX3DProject!FRenderCommandPipeRegistry::StopRecording'::
2’::<lambda_1>::operator()()
LX3DProject!TGraphTask<TFunctionGraphTaskImpl<void __cdecl(void),1> >::ExecuteTask()
LX3DProject!FNamedTaskThread::ProcessTasksNamedThread()
LX3DProject!FNamedTaskThread::ProcessTasksUntilQuit()
LX3DProject!RenderingThreadMain()
LX3DProject!FRenderingThread::Run()
LX3DProject!FRunnableThreadWin::Run()
who can tell me why? i confused for two weeks!!!