void DrawHmdMesh( FRHICommandList& RHICmdList, float X, float Y, float SizeX, float SizeY, float U, float V, float SizeU, float SizeV, FIntPoint TargetSize, FIntPoint TextureSize, EStereoscopicPass StereoView, FShader* VertexShader ) { FDrawRectangleParameters Parameters; Parameters.PosScaleBias = FVector4(SizeX, SizeY, X, Y); Parameters.UVScaleBias = FVector4(SizeU, SizeV, U, V); Parameters.InvTargetSizeAndTextureSize = FVector4( 1.0f / TargetSize.X, 1.0f / TargetSize.Y, 1.0f / TextureSize.X, 1.0f / TextureSize.Y); SetUniformBufferParameterImmediate(RHICmdList, VertexShader->GetVertexShader(), VertexShader->GetUniformBufferParameter<FDrawRectangleParameters>(), Parameters); GEngine->HMDDevice->DrawVisibleAreaMesh_RenderThread(RHICmdList, StereoView); }
void SetParameters( FRHICommandList& RHICmdList, const FViewInfo& View, FIntPoint TileListGroupSizeValue, FSceneRenderTargetItem& DistanceFieldNormal, const FDistanceFieldAOParameters& Parameters, FSceneRenderTargetItem& SpecularOcclusionBuffer) { FComputeShaderRHIParamRef ShaderRHI = GetComputeShader(); FGlobalShader::SetParameters(RHICmdList, ShaderRHI, View); DeferredParameters.Set(RHICmdList, ShaderRHI, View); ObjectParameters.Set(RHICmdList, ShaderRHI, GAOCulledObjectBuffers.Buffers); AOParameters.Set(RHICmdList, ShaderRHI, Parameters); ScreenGridParameters.Set(RHICmdList, ShaderRHI, View, DistanceFieldNormal); FAOSampleData2 AOSampleData; TArray<FVector, TInlineAllocator<9> > SampleDirections; GetSpacedVectors(SampleDirections); for (int32 SampleIndex = 0; SampleIndex < NumConeSampleDirections; SampleIndex++) { AOSampleData.SampleDirections[SampleIndex] = FVector4(SampleDirections[SampleIndex]); } SetUniformBufferParameterImmediate(RHICmdList, ShaderRHI, GetUniformBufferParameter<FAOSampleData2>(), AOSampleData); FTileIntersectionResources* TileIntersectionResources = View.ViewState->AOTileIntersectionResources; SetSRVParameter(RHICmdList, ShaderRHI, TileHeadDataUnpacked, TileIntersectionResources->TileHeadDataUnpacked.SRV); SetSRVParameter(RHICmdList, ShaderRHI, TileArrayData, TileIntersectionResources->TileArrayData.SRV); SetSRVParameter(RHICmdList, ShaderRHI, TileConeDepthRanges, TileIntersectionResources->TileConeDepthRanges.SRV); SetShaderValue(RHICmdList, ShaderRHI, TileListGroupSize, TileListGroupSizeValue); extern float GAOConeHalfAngle; SetShaderValue(RHICmdList, ShaderRHI, TanConeHalfAngle, FMath::Tan(GAOConeHalfAngle)); FVector UnoccludedVector(0); for (int32 SampleIndex = 0; SampleIndex < NumConeSampleDirections; SampleIndex++) { UnoccludedVector += SampleDirections[SampleIndex]; } float BentNormalNormalizeFactorValue = 1.0f / (UnoccludedVector / NumConeSampleDirections).Size(); SetShaderValue(RHICmdList, ShaderRHI, BentNormalNormalizeFactor, BentNormalNormalizeFactorValue); int32 NumOutUAVs = 0; FUnorderedAccessViewRHIParamRef OutUAVs[1]; OutUAVs[NumOutUAVs++] = SpecularOcclusionBuffer.UAV; RHICmdList.TransitionResources(EResourceTransitionAccess::ERWBarrier, EResourceTransitionPipeline::EComputeToCompute, OutUAVs, NumOutUAVs); SpecularOcclusion.SetTexture(RHICmdList, ShaderRHI, SpecularOcclusionBuffer.ShaderResourceTexture, SpecularOcclusionBuffer.UAV); }
void SetParameters(FRHICommandList& RHICmdList, const FSceneView& View, FTextureRHIParamRef SSRTexture, TArray<FReflectionCaptureSortData>& SortData, FUnorderedAccessViewRHIParamRef OutSceneColorUAV, const TRefCountPtr<IPooledRenderTarget>& DynamicBentNormalAO) { const FComputeShaderRHIParamRef ShaderRHI = GetComputeShader(); FGlobalShader::SetParameters(RHICmdList, ShaderRHI, View); DeferredParameters.Set(RHICmdList, ShaderRHI, View); FScene* Scene = (FScene*)View.Family->Scene; check(Scene->ReflectionSceneData.CubemapArray.IsValid()); check(Scene->ReflectionSceneData.CubemapArray.GetRenderTarget().IsValid()); FSceneRenderTargetItem& CubemapArray = Scene->ReflectionSceneData.CubemapArray.GetRenderTarget(); SetTextureParameter( RHICmdList, ShaderRHI, ReflectionEnvironmentColorTexture, ReflectionEnvironmentColorSampler, TStaticSamplerState<SF_Trilinear, AM_Clamp, AM_Clamp, AM_Clamp>::GetRHI(), CubemapArray.ShaderResourceTexture); SetTextureParameter(RHICmdList, ShaderRHI, ScreenSpaceReflections, SSRTexture ); SetTextureParameter(RHICmdList, ShaderRHI, InSceneColor, GSceneRenderTargets.GetSceneColor()->GetRenderTargetItem().ShaderResourceTexture ); OutSceneColor.SetTexture(RHICmdList, ShaderRHI, NULL, OutSceneColorUAV); SetShaderValue(RHICmdList, ShaderRHI, ViewDimensionsParameter, View.ViewRect); FReflectionCaptureData SamplePositionsBuffer; for (int32 CaptureIndex = 0; CaptureIndex < SortData.Num(); CaptureIndex++) { SamplePositionsBuffer.PositionAndRadius[CaptureIndex] = SortData[CaptureIndex].PositionAndRadius; SamplePositionsBuffer.CaptureProperties[CaptureIndex] = SortData[CaptureIndex].CaptureProperties; SamplePositionsBuffer.BoxTransform[CaptureIndex] = SortData[CaptureIndex].BoxTransform; SamplePositionsBuffer.BoxScales[CaptureIndex] = SortData[CaptureIndex].BoxScales; } SetUniformBufferParameterImmediate(RHICmdList, ShaderRHI, GetUniformBufferParameter<FReflectionCaptureData>(), SamplePositionsBuffer); SetShaderValue(RHICmdList, ShaderRHI, NumCaptures, SortData.Num()); SetTextureParameter(RHICmdList, ShaderRHI, PreIntegratedGF, PreIntegratedGFSampler, TStaticSamplerState<SF_Bilinear,AM_Clamp,AM_Clamp,AM_Clamp>::GetRHI(), GSystemTextures.PreintegratedGF->GetRenderTargetItem().ShaderResourceTexture); SkyLightParameters.SetParameters(RHICmdList, ShaderRHI, Scene, View.Family->EngineShowFlags.SkyLighting); const float MinOcclusion = Scene->SkyLight ? Scene->SkyLight->MinOcclusion : 0; SpecularOcclusionParameters.SetParameters(RHICmdList, ShaderRHI, DynamicBentNormalAO, CVarSkySpecularOcclusionStrength.GetValueOnRenderThread(), MinOcclusion); }
void SetParameters( FRHICommandList& RHICmdList, const FViewInfo& View, FIntPoint TileListGroupSizeValue, FSceneRenderTargetItem& DistanceFieldNormal, const FDistanceFieldAOParameters& Parameters, const FGlobalDistanceFieldInfo& GlobalDistanceFieldInfo) { FComputeShaderRHIParamRef ShaderRHI = GetComputeShader(); FGlobalShader::SetParameters(RHICmdList, ShaderRHI, View); DeferredParameters.Set(RHICmdList, ShaderRHI, View); ObjectParameters.Set(RHICmdList, ShaderRHI, GAOCulledObjectBuffers.Buffers); AOParameters.Set(RHICmdList, ShaderRHI, Parameters); ScreenGridParameters.Set(RHICmdList, ShaderRHI, View, DistanceFieldNormal); if (bUseGlobalDistanceField) { GlobalDistanceFieldParameters.Set(RHICmdList, ShaderRHI, GlobalDistanceFieldInfo.ParameterData); } FAOSampleData2 AOSampleData; TArray<FVector, TInlineAllocator<9> > SampleDirections; GetSpacedVectors(SampleDirections); for (int32 SampleIndex = 0; SampleIndex < NumConeSampleDirections; SampleIndex++) { AOSampleData.SampleDirections[SampleIndex] = FVector4(SampleDirections[SampleIndex]); } SetUniformBufferParameterImmediate(RHICmdList, ShaderRHI, GetUniformBufferParameter<FAOSampleData2>(), AOSampleData); FTileIntersectionResources* TileIntersectionResources = View.ViewState->AOTileIntersectionResources; SetSRVParameter(RHICmdList, ShaderRHI, TileHeadDataUnpacked, TileIntersectionResources->TileHeadDataUnpacked.SRV); SetSRVParameter(RHICmdList, ShaderRHI, TileArrayData, TileIntersectionResources->TileArrayData.SRV); SetSRVParameter(RHICmdList, ShaderRHI, TileConeDepthRanges, TileIntersectionResources->TileConeDepthRanges.SRV); SetShaderValue(RHICmdList, ShaderRHI, TileListGroupSize, TileListGroupSizeValue); extern float GAOConeHalfAngle; SetShaderValue(RHICmdList, ShaderRHI, TanConeHalfAngle, FMath::Tan(GAOConeHalfAngle)); FVector UnoccludedVector(0); for (int32 SampleIndex = 0; SampleIndex < NumConeSampleDirections; SampleIndex++) { UnoccludedVector += SampleDirections[SampleIndex]; } float BentNormalNormalizeFactorValue = 1.0f / (UnoccludedVector / NumConeSampleDirections).Size(); SetShaderValue(RHICmdList, ShaderRHI, BentNormalNormalizeFactor, BentNormalNormalizeFactorValue); FAOScreenGridResources* ScreenGridResources = View.ViewState->AOScreenGridResources; ScreenGridConeVisibility.SetBuffer(RHICmdList, ShaderRHI, ScreenGridResources->ScreenGridConeVisibility); if (bSupportIrradiance) { ConeDepthVisibilityFunction.SetBuffer(RHICmdList, ShaderRHI, ScreenGridResources->ConeDepthVisibilityFunction); } }
void SetParameters( FRHICommandList& RHICmdList, const FSceneView& View, int32 ViewIndex, int32 NumViews, const TArray<FSortedLightSceneInfo, SceneRenderingAllocator>& SortedLights, int32 NumLightsToRenderInSortedLights, const FSimpleLightArray& SimpleLights, int32 StartIndex, int32 NumThisPass, IPooledRenderTarget& InTextureValue, IPooledRenderTarget& OutTextureValue) { FComputeShaderRHIParamRef ShaderRHI = GetComputeShader(); FGlobalShader::SetParameters(RHICmdList, ShaderRHI, View); DeferredParameters.Set(RHICmdList, ShaderRHI, View); SetTextureParameter(RHICmdList, ShaderRHI, InTexture, InTextureValue.GetRenderTargetItem().ShaderResourceTexture); FUnorderedAccessViewRHIParamRef OutUAV = OutTextureValue.GetRenderTargetItem().UAV; RHICmdList.TransitionResources(EResourceTransitionAccess::ERWBarrier, EResourceTransitionPipeline::EGfxToCompute, &OutUAV, 1); OutTexture.SetTexture(RHICmdList, ShaderRHI, 0, OutUAV); SetShaderValue(RHICmdList, ShaderRHI, ViewDimensions, View.ViewRect); SetTextureParameter( RHICmdList, ShaderRHI, PreIntegratedBRDF, PreIntegratedBRDFSampler, TStaticSamplerState<SF_Bilinear,AM_Clamp,AM_Clamp,AM_Clamp>::GetRHI(), GEngine->PreIntegratedSkinBRDFTexture->Resource->TextureRHI ); static const auto AllowStaticLightingVar = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.AllowStaticLighting")); const bool bAllowStaticLighting = (!AllowStaticLightingVar || AllowStaticLightingVar->GetValueOnRenderThread() != 0); FTiledDeferredLightData LightData; FTiledDeferredLightData2 LightData2; for (int32 LightIndex = 0; LightIndex < NumThisPass; LightIndex++) { if (StartIndex + LightIndex < NumLightsToRenderInSortedLights) { const FSortedLightSceneInfo& SortedLightInfo = SortedLights[StartIndex + LightIndex]; const FLightSceneInfoCompact& LightSceneInfoCompact = SortedLightInfo.SceneInfo; const FLightSceneInfo* const LightSceneInfo = LightSceneInfoCompact.LightSceneInfo; FVector NormalizedLightDirection; FVector2D SpotAngles; float SourceRadius; float SourceLength; float MinRoughness; // Get the light parameters LightSceneInfo->Proxy->GetParameters( LightData.LightPositionAndInvRadius[LightIndex], LightData.LightColorAndFalloffExponent[LightIndex], NormalizedLightDirection, SpotAngles, SourceRadius, SourceLength, MinRoughness); if (LightSceneInfo->Proxy->IsInverseSquared()) { // Correction for lumen units LightData.LightColorAndFalloffExponent[LightIndex].X *= 16.0f; LightData.LightColorAndFalloffExponent[LightIndex].Y *= 16.0f; LightData.LightColorAndFalloffExponent[LightIndex].Z *= 16.0f; LightData.LightColorAndFalloffExponent[LightIndex].W = 0; } // When rendering reflection captures, the direct lighting of the light is actually the indirect specular from the main view if (View.bIsReflectionCapture) { LightData.LightColorAndFalloffExponent[LightIndex].X *= LightSceneInfo->Proxy->GetIndirectLightingScale(); LightData.LightColorAndFalloffExponent[LightIndex].Y *= LightSceneInfo->Proxy->GetIndirectLightingScale(); LightData.LightColorAndFalloffExponent[LightIndex].Z *= LightSceneInfo->Proxy->GetIndirectLightingScale(); } { // SpotlightMaskAndMinRoughness, >0:Spotlight, MinRoughness = abs(); float W = FMath::Max(0.0001f, MinRoughness) * ((LightSceneInfo->Proxy->GetLightType() == LightType_Spot) ? 1 : -1); LightData2.LightDirectionAndSpotlightMaskAndMinRoughness[LightIndex] = FVector4(NormalizedLightDirection, W); } LightData2.SpotAnglesAndSourceRadiusAndSimpleLighting[LightIndex] = FVector4(SpotAngles.X, SpotAngles.Y, SourceRadius, 0); int32 ShadowMapChannel = LightSceneInfo->Proxy->GetShadowMapChannel(); if (!bAllowStaticLighting) { ShadowMapChannel = INDEX_NONE; } LightData2.ShadowMapChannelMask[LightIndex] = FVector4( ShadowMapChannel == 0 ? 1 : 0, ShadowMapChannel == 1 ? 1 : 0, ShadowMapChannel == 2 ? 1 : 0, ShadowMapChannel == 3 ? 1 : 0); } else { int32 SimpleLightIndex = StartIndex + LightIndex - NumLightsToRenderInSortedLights; const FSimpleLightEntry& SimpleLight = SimpleLights.InstanceData[SimpleLightIndex]; const FSimpleLightPerViewEntry& SimpleLightPerViewData = SimpleLights.GetViewDependentData(SimpleLightIndex, ViewIndex, NumViews); LightData.LightPositionAndInvRadius[LightIndex] = FVector4(SimpleLightPerViewData.Position, 1.0f / FMath::Max(SimpleLight.Radius, KINDA_SMALL_NUMBER)); LightData.LightColorAndFalloffExponent[LightIndex] = FVector4(SimpleLight.Color, SimpleLight.Exponent); LightData2.LightDirectionAndSpotlightMaskAndMinRoughness[LightIndex] = FVector4(FVector(1, 0, 0), 0); LightData2.SpotAnglesAndSourceRadiusAndSimpleLighting[LightIndex] = FVector4(-2, 1, 0, 1); LightData2.ShadowMapChannelMask[LightIndex] = FVector4(0, 0, 0, 0); if( SimpleLight.Exponent == 0.0f ) { // Correction for lumen units LightData.LightColorAndFalloffExponent[LightIndex] *= 16.0f; } } } SetUniformBufferParameterImmediate(RHICmdList, ShaderRHI, GetUniformBufferParameter<FTiledDeferredLightData>(), LightData); SetUniformBufferParameterImmediate(RHICmdList, ShaderRHI, GetUniformBufferParameter<FTiledDeferredLightData2>(), LightData2); SetShaderValue(RHICmdList, ShaderRHI, NumLights, NumThisPass); }
void DrawRectangle( FRHICommandList& RHICmdList, float X, float Y, float SizeX, float SizeY, float U, float V, float SizeU, float SizeV, FIntPoint TargetSize, FIntPoint TextureSize, FShader* VertexShader, EDrawRectangleFlags Flags ) { float ClipSpaceQuadZ = 0.0f; DoDrawRectangleFlagOverride(Flags); // triangle if extending to left and top of the given rectangle, if it's not left top of the viewport it can cause artifacts if(X > 0.0f || Y > 0.0f) { // don't use triangle optimization Flags = EDRF_Default; } // Set up vertex uniform parameters for scaling and biasing the rectangle. // Note: Use DrawRectangle in the vertex shader to calculate the correct vertex position and uv. FDrawRectangleParameters Parameters; Parameters.PosScaleBias = FVector4(SizeX, SizeY, X, Y); Parameters.UVScaleBias = FVector4(SizeU, SizeV, U, V); Parameters.InvTargetSizeAndTextureSize = FVector4( 1.0f / TargetSize.X, 1.0f / TargetSize.Y, 1.0f / TextureSize.X, 1.0f / TextureSize.Y); SetUniformBufferParameterImmediate(RHICmdList, VertexShader->GetVertexShader(), VertexShader->GetUniformBufferParameter<FDrawRectangleParameters>(), Parameters); if(Flags == EDRF_UseTesselatedIndexBuffer) { // no vertex buffer needed as we compute it in VS RHICmdList.SetStreamSource(0, NULL, 0, 0); RHICmdList.DrawIndexedPrimitive( GTesselatedScreenRectangleIndexBuffer.IndexBufferRHI, PT_TriangleList, /*BaseVertexIndex=*/ 0, /*MinIndex=*/ 0, /*NumVertices=*/ GTesselatedScreenRectangleIndexBuffer.NumVertices(), /*StartIndex=*/ 0, /*NumPrimitives=*/ GTesselatedScreenRectangleIndexBuffer.NumPrimitives(), /*NumInstances=*/ 1 ); } else { RHICmdList.SetStreamSource(0, GScreenRectangleVertexBuffer.VertexBufferRHI, sizeof(FFilterVertex), 0); if (Flags == EDRF_UseTriangleOptimization) { // A single triangle spans the entire viewport this results in a quad that fill the viewport. This can increase rasterization efficiency // as we do not have a diagonal edge (through the center) for the rasterizer/span-dispatch. Although the actual benefit of this technique is dependent upon hardware. // We offset into the index buffer when using the triangle optimization to access the correct vertices. RHICmdList.DrawIndexedPrimitive( GScreenRectangleIndexBuffer.IndexBufferRHI, PT_TriangleList, /*BaseVertexIndex=*/ 0, /*MinIndex=*/ 0, /*NumVertices=*/ 3, /*StartIndex=*/ 6, /*NumPrimitives=*/ 1, /*NumInstances=*/ 1 ); } else { RHICmdList.SetStreamSource(0, GScreenRectangleVertexBuffer.VertexBufferRHI, sizeof(FFilterVertex), 0); RHICmdList.DrawIndexedPrimitive( GScreenRectangleIndexBuffer.IndexBufferRHI, PT_TriangleList, /*BaseVertexIndex=*/ 0, /*MinIndex=*/ 0, /*NumVertices=*/ 4, /*StartIndex=*/ 0, /*NumPrimitives=*/ 2, /*NumInstances=*/ 1 ); } } }