void FSimpleHMD::DrawDistortionMesh_RenderThread(struct FRenderingCompositePassContext& Context, const FSceneView& View, const FIntPoint& TextureSize) { float ClipSpaceQuadZ = 0.0f; FMatrix QuadTexTransform = FMatrix::Identity; FMatrix QuadPosTransform = FMatrix::Identity; const FIntRect SrcRect = View.ViewRect; FRHICommandListImmediate& RHICmdList = Context.RHICmdList; const FSceneViewFamily& ViewFamily = *(View.Family); FIntPoint ViewportSize = ViewFamily.RenderTarget->GetSizeXY(); RHICmdList.SetViewport(0, 0, 0.0f, ViewportSize.X, ViewportSize.Y, 1.0f); static const uint32 NumVerts = 8; static const uint32 NumTris = 4; static const FDistortionVertex Verts[8] = { // left eye { FVector2D(-0.9f, -0.9f), FVector2D(0.0f, 1.0f), FVector2D(0.0f, 1.0f), FVector2D(0.0f, 1.0f), 1.0f, 0.0f }, { FVector2D(-0.1f, -0.9f), FVector2D(0.5f, 1.0f), FVector2D(0.5f, 1.0f), FVector2D(0.5f, 1.0f), 1.0f, 0.0f }, { FVector2D(-0.1f, 0.9f), FVector2D(0.5f, 0.0f), FVector2D(0.5f, 0.0f), FVector2D(0.5f, 0.0f), 1.0f, 0.0f }, { FVector2D(-0.9f, 0.9f), FVector2D(0.0f, 0.0f), FVector2D(0.0f, 0.0f), FVector2D(0.0f, 0.0f), 1.0f, 0.0f }, // right eye { FVector2D(0.1f, -0.9f), FVector2D(0.5f, 1.0f), FVector2D(0.5f, 1.0f), FVector2D(0.5f, 1.0f), 1.0f, 0.0f }, { FVector2D(0.9f, -0.9f), FVector2D(1.0f, 1.0f), FVector2D(1.0f, 1.0f), FVector2D(1.0f, 1.0f), 1.0f, 0.0f }, { FVector2D(0.9f, 0.9f), FVector2D(1.0f, 0.0f), FVector2D(1.0f, 0.0f), FVector2D(1.0f, 0.0f), 1.0f, 0.0f }, { FVector2D(0.1f, 0.9f), FVector2D(0.5f, 0.0f), FVector2D(0.5f, 0.0f), FVector2D(0.5f, 0.0f), 1.0f, 0.0f }, }; static const uint16 Indices[12] = { /*Left*/ 0, 1, 2, 0, 2, 3, /*Right*/ 4, 5, 6, 4, 6, 7 }; DrawIndexedPrimitiveUP(Context.RHICmdList, PT_TriangleList, 0, NumVerts, NumTris, &Indices, sizeof(Indices[0]), &Verts, sizeof(Verts[0])); }
void FSteamVRHMD::DrawDistortionMesh_RenderThread(struct FRenderingCompositePassContext& Context, const FSceneView& View, const FIntPoint& TextureSize) { float ClipSpaceQuadZ = 0.0f; FMatrix QuadTexTransform = FMatrix::Identity; FMatrix QuadPosTransform = FMatrix::Identity; const FIntRect SrcRect = View.ViewRect; FRHICommandListImmediate& RHICmdList = Context.RHICmdList; const FSceneViewFamily& ViewFamily = *(View.Family); FIntPoint ViewportSize = ViewFamily.RenderTarget->GetSizeXY(); RHICmdList.SetViewport(0, 0, 0.0f, ViewportSize.X, ViewportSize.Y, 1.0f); FSteamVRDistortionMesh& CurMesh = DistortionMesh[(View.StereoPass == eSSP_LEFT_EYE) ? 0 : 1]; DrawIndexedPrimitiveUP(Context.RHICmdList, PT_TriangleList, 0, CurMesh.NumVerts, CurMesh.NumTriangles, CurMesh.Indices, sizeof(CurMesh.Indices[0]), CurMesh.Verts, sizeof(CurMesh.Verts[0])); }
void DrawTransformedRectangle( FRHICommandListImmediate& RHICmdList, float X, float Y, float SizeX, float SizeY, const FMatrix& PosTransform, float U, float V, float SizeU, float SizeV, const FMatrix& TexTransform, FIntPoint TargetSize, FIntPoint TextureSize ) { float ClipSpaceQuadZ = 0.0f; // we don't do the triangle optimization as this case is rare for the DrawTransformedRectangle case FFilterVertex Vertices[4]; Vertices[0].Position = PosTransform.TransformFVector4(FVector4(X, Y, ClipSpaceQuadZ, 1)); Vertices[1].Position = PosTransform.TransformFVector4(FVector4(X + SizeX, Y, ClipSpaceQuadZ, 1)); Vertices[2].Position = PosTransform.TransformFVector4(FVector4(X, Y + SizeY, ClipSpaceQuadZ, 1)); Vertices[3].Position = PosTransform.TransformFVector4(FVector4(X + SizeX, Y + SizeY, ClipSpaceQuadZ, 1)); Vertices[0].UV = FVector2D(TexTransform.TransformFVector4(FVector(U, V, 0))); Vertices[1].UV = FVector2D(TexTransform.TransformFVector4(FVector(U + SizeU, V, 0))); Vertices[2].UV = FVector2D(TexTransform.TransformFVector4(FVector(U, V + SizeV, 0))); Vertices[3].UV = FVector2D(TexTransform.TransformFVector4(FVector(U + SizeU, V + SizeV, 0))); for (int32 VertexIndex = 0; VertexIndex < 4; VertexIndex++) { Vertices[VertexIndex].Position.X = -1.0f + 2.0f * (Vertices[VertexIndex].Position.X) / (float)TargetSize.X; Vertices[VertexIndex].Position.Y = (+1.0f - 2.0f * (Vertices[VertexIndex].Position.Y) / (float)TargetSize.Y) * GProjectionSignY; Vertices[VertexIndex].UV.X = Vertices[VertexIndex].UV.X / (float)TextureSize.X; Vertices[VertexIndex].UV.Y = Vertices[VertexIndex].UV.Y / (float)TextureSize.Y; } static const uint16 Indices[] = { 0, 1, 3, 0, 3, 2 }; DrawIndexedPrimitiveUP(RHICmdList, PT_TriangleList, 0, 4, 2, Indices, sizeof(Indices[0]), Vertices, sizeof(Vertices[0])); }
static void DrawOcclusionMesh(FRHICommandList& RHICmdList, EStereoscopicPass StereoPass, const FHMDViewMesh MeshAssets[]) { check(IsInRenderingThread()); check(StereoPass != eSSP_FULL); const uint32 MeshIndex = (StereoPass == eSSP_LEFT_EYE) ? 0 : 1; const FHMDViewMesh& Mesh = MeshAssets[MeshIndex]; check(Mesh.IsValid()); DrawIndexedPrimitiveUP( RHICmdList, PT_TriangleList, 0, Mesh.NumVertices, Mesh.NumTriangles, Mesh.pIndices, sizeof(Mesh.pIndices[0]), Mesh.pVertices, sizeof(Mesh.pVertices[0]) ); }
void FGoogleVRHMD::DrawDistortionMesh_RenderThread(struct FRenderingCompositePassContext& Context, const FIntPoint& TextureSize) { const FSceneView& View = Context.View; FRHICommandListImmediate& RHICmdList = Context.RHICmdList; const FSceneViewFamily& ViewFamily = *(View.Family); FIntPoint ViewportSize = ViewFamily.RenderTarget->GetSizeXY(); #if GOOGLEVRHMD_SUPPORTED_PLATFORMS if(View.StereoPass == eSSP_LEFT_EYE) { RHICmdList.SetViewport(0, 0, 0.0f, ViewportSize.X / 2, ViewportSize.Y, 1.0f); DrawIndexedPrimitiveUP(Context.RHICmdList, PT_TriangleList, 0, NumVerts, NumTris, DistortionMeshIndices, sizeof(DistortionMeshIndices[0]), DistortionMeshVerticesLeftEye, sizeof(DistortionMeshVerticesLeftEye[0])); } else { RHICmdList.SetViewport(ViewportSize.X / 2, 0, 0.0f, ViewportSize.X, ViewportSize.Y, 1.0f); DrawIndexedPrimitiveUP(Context.RHICmdList, PT_TriangleList, 0, NumVerts, NumTris, DistortionMeshIndices, sizeof(DistortionMeshIndices[0]), DistortionMeshVerticesRightEye, sizeof(DistortionMeshVerticesRightEye[0])); } #else if(GetPreviewViewerType() == EVP_None) { RHICmdList.SetViewport(0, 0, 0.0f, ViewportSize.X, ViewportSize.Y, 1.0f); static const uint32 LocalNumVerts = 8; static const uint32 LocalNumTris = 4; static const FDistortionVertex Verts[8] = { // left eye { FVector2D(-0.9f, -0.9f), FVector2D(0.0f, 1.0f), FVector2D(0.0f, 1.0f), FVector2D(0.0f, 1.0f), 1.0f, 0.0f }, { FVector2D(-0.1f, -0.9f), FVector2D(0.5f, 1.0f), FVector2D(0.5f, 1.0f), FVector2D(0.5f, 1.0f), 1.0f, 0.0f }, { FVector2D(-0.1f, 0.9f), FVector2D(0.5f, 0.0f), FVector2D(0.5f, 0.0f), FVector2D(0.5f, 0.0f), 1.0f, 0.0f }, { FVector2D(-0.9f, 0.9f), FVector2D(0.0f, 0.0f), FVector2D(0.0f, 0.0f), FVector2D(0.0f, 0.0f), 1.0f, 0.0f }, // right eye { FVector2D(0.1f, -0.9f), FVector2D(0.5f, 1.0f), FVector2D(0.5f, 1.0f), FVector2D(0.5f, 1.0f), 1.0f, 0.0f }, { FVector2D(0.9f, -0.9f), FVector2D(1.0f, 1.0f), FVector2D(1.0f, 1.0f), FVector2D(1.0f, 1.0f), 1.0f, 0.0f }, { FVector2D(0.9f, 0.9f), FVector2D(1.0f, 0.0f), FVector2D(1.0f, 0.0f), FVector2D(1.0f, 0.0f), 1.0f, 0.0f }, { FVector2D(0.1f, 0.9f), FVector2D(0.5f, 0.0f), FVector2D(0.5f, 0.0f), FVector2D(0.5f, 0.0f), 1.0f, 0.0f }, }; static const uint16 Indices[12] = { /*Left*/ 0, 1, 2, 0, 2, 3, /*Right*/ 4, 5, 6, 4, 6, 7 }; DrawIndexedPrimitiveUP(Context.RHICmdList, PT_TriangleList, 0, LocalNumVerts, LocalNumTris, &Indices, sizeof(Indices[0]), &Verts, sizeof(Verts[0])); } else { // Indices are generated, mesh is stored in GoogleVRHMDViewerPreviews.h/cpp if(View.StereoPass == eSSP_LEFT_EYE) { RHICmdList.SetViewport(0, 0, 0.0f, ViewportSize.X / 2, ViewportSize.Y, 1.0f); DrawIndexedPrimitiveUP(Context.RHICmdList, PT_TriangleList, 0, GetPreviewViewerNumVertices(eSSP_LEFT_EYE), NumTris, DistortionMeshIndices, sizeof(DistortionMeshIndices[0]), GetPreviewViewerVertices(eSSP_LEFT_EYE), sizeof(GetPreviewViewerVertices(eSSP_LEFT_EYE)[0])); } else { RHICmdList.SetViewport(ViewportSize.X / 2, 0, 0.0f, ViewportSize.X, ViewportSize.Y, 1.0f); DrawIndexedPrimitiveUP(Context.RHICmdList, PT_TriangleList, 0, GetPreviewViewerNumVertices(eSSP_RIGHT_EYE), NumTris, DistortionMeshIndices, sizeof(DistortionMeshIndices[0]), GetPreviewViewerVertices(eSSP_RIGHT_EYE), sizeof(GetPreviewViewerVertices(eSSP_RIGHT_EYE)[0])); } } #endif }
bool FDeferredShadingSceneRenderer::RenderFog(FRHICommandListImmediate& RHICmdList, FLightShaftsOutput LightShaftsOutput) { if (Scene->ExponentialFogs.Num() > 0) { SCOPED_DRAW_EVENT(RHICmdList, Fog); static const FVector2D Vertices[4] = { FVector2D(-1,-1), FVector2D(-1,+1), FVector2D(+1,+1), FVector2D(+1,-1), }; static const uint16 Indices[6] = { 0, 1, 2, 0, 2, 3 }; GSceneRenderTargets.BeginRenderingSceneColor(RHICmdList, ESimpleRenderTargetMode::EExistingColorAndDepth, FExclusiveDepthStencil::DepthRead_StencilWrite); for(int32 ViewIndex = 0;ViewIndex < Views.Num();ViewIndex++) { const FViewInfo& View = Views[ViewIndex]; if (View.IsPerspectiveProjection() == false) { continue; // Do not render exponential fog in orthographic views. } // Set the device viewport for the view. RHICmdList.SetViewport(View.ViewRect.Min.X, View.ViewRect.Min.Y, 0.0f, View.ViewRect.Max.X, View.ViewRect.Max.Y, 1.0f); RHICmdList.SetRasterizerState(TStaticRasterizerState<FM_Solid, CM_None>::GetRHI()); // disable alpha writes in order to preserve scene depth values on PC RHICmdList.SetBlendState(TStaticBlendState<CW_RGB, BO_Add, BF_One, BF_SourceAlpha>::GetRHI()); RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_Always>::GetRHI()); SetFogShaders(RHICmdList, Scene,View,LightShaftsOutput); // Draw a quad covering the view. DrawIndexedPrimitiveUP( RHICmdList, PT_TriangleList, 0, ARRAY_COUNT(Vertices), 2, Indices, sizeof(Indices[0]), Vertices, sizeof(Vertices[0]) ); } //no need to resolve since we used alpha blending GSceneRenderTargets.FinishRenderingSceneColor(RHICmdList, false); return true; } return false; }