Virtual Texture and Procedural Mesh

Test_UE5_006_20230317.zip (883.0 KB)
I tried doing the same with the mesh generated by the geometry script in the ue5 runtime, but it had no effect when running or packaging the runtime

	virtual void  FPlottingDynamicMeshSceneProxy::DrawStaticElements(FStaticPrimitiveDrawInterface* PDI) override
{
	if (RuntimeVirtualTextures.Num())
	{
		TArray<FMeshRenderBufferSet*> Buffers;
		GetActiveRenderBufferSets(Buffers);
		for (const FMeshRenderBufferSet* Buffer : Buffers)
		{
			UMaterialInterface* BufferMat = Buffer->Material;
			check(BufferMat);

			FMeshBatch MeshBatch;
			MeshBatch.LODIndex = 0;
			MeshBatch.SegmentIndex = 0;

			MeshBatch.VertexFactory = &Buffer->VertexFactory;
			MeshBatch.Type = PT_TriangleList;

			MeshBatch.LODIndex = 0;
			MeshBatch.SegmentIndex = 0;

			MeshBatch.bDitheredLODTransition = !IsMovable() && Buffer->Material->GetRenderProxy()->GetMaterialInterface()->IsDitheredLODTransition();
			MeshBatch.bWireframe = false;
			MeshBatch.CastShadow = false;
			MeshBatch.bUseForDepthPass = false;
			MeshBatch.bUseAsOccluder = false;
			MeshBatch.bUseForMaterial = false;
			MeshBatch.bRenderToVirtualTexture = true;
			MeshBatch.MaterialRenderProxy = Buffer->Material->GetRenderProxy();
			MeshBatch.RuntimeVirtualTextureMaterialType = (int32)ERuntimeVirtualTextureMaterialType::BaseColor_Normal_Specular;
			MeshBatch.ReverseCulling = IsLocalToWorldDeterminantNegative();

			MeshBatch.DepthPriorityGroup = SDPG_World;
			MeshBatch.bCanApplyViewModeOverrides = false;

			MeshBatch.Elements.Empty(1);
			FMeshBatchElement BatchElement;
			BatchElement.IndexBuffer = &Buffer->IndexBuffer;
			BatchElement.FirstIndex = 0;
			BatchElement.NumPrimitives = Buffer->IndexBuffer.Indices.Num() / 3;
			BatchElement.MinVertexIndex = 0;
			BatchElement.MaxVertexIndex = Buffer->StaticMeshVertexBuffer.GetNumVertices() - 1;
			MeshBatch.Elements.Add(BatchElement);

			PDI->DrawMesh(MeshBatch, FLT_MAX);
		}
	}
}
1 Like