Point Cloud Rendering

This is less of a ‘how do i pointcloud’ thread, and more a question to those of a graphical persuation.

Essentially, I’m trying to find the best method for rendering a high density point cloud (somewhere in the region of 100m individual points) in real time. On top of that, reading in a sequence and constructing a new pointcloud several times a second. The way I see it, compute shaders executing on the GPU sounds like the best way of doing things, at least in terms of processing the point cloud. But would Unreal be modifiable enough to do such a thing?

  1. Take point cloud information from file (effectively a list of points and associated shading values)
  2. Process values into points in 3D space
  3. Render this through the standard Unreal renderer with self-illuminating particles (no shadow information or transparency required)

Would this be better suited to a standalone OGL/D3D application, or can UE4 lend itself to such a problem?

Hello,

I am after the same thing. Did you ever get any answer to this question?

Curious about this as well. What did you end up doing?

The hard issue to solve with this would be a way to load the binary point data and feed it to a particle material.
Then using

would be pretty intuitive to render the point data into the GPU. No idea how you’d load the data and transfer it to the material though.

Loading data itself is fairly trivial isn’t it? VaRest plugin can get it via a web request. What I find challenging is figuring out how to spawn gpu particles at specific locations.

wait, you want to load 100mil point in realtime from disk ? Depends how many attributes you have on those points, lets say just Position, wouldnt it take ages(seconds)?

When I work in Houdini with points, 100mil with just P takes 1.1GB on disk per frame.

In my case particles are in range of few million. Load time is acceptable and will run on high end hardware. Each particle is little more than an xyz with few float parameters. I don’t see it as an issue. Ideally data would come in chunks based on requests made from the client (UE4).

Create a particle emitter in your project as a template. Delete the initial velocity attribute for the emitter in Cascade. Change the data type to GPU Sprites. Create and assign a material to the emitter. This is done by clicking in the black area of the Emitters window and scrolling down to the bottom of the Details window.

Actor Code
SET UP:

UParticleSystemComponent* particleSystemComponent = CreateDefaultSubobject<UParticleSystemComponent>(TEXT(“ParticleComponent”));
particleSystemComponent->SetupAttachment(RootComponent);
particleSystemComponent->bAutoActivate = false;

static ConstructorHelpers::FObjectFinder<UParticleSystem> pointCloud(TEXT("/Game/EmitterName"));

if (pointCloud.Succeeded())
{
UE_LOG(LogTemp, Warning, TEXT(“Particle system template loaded”));
particleSystemComponent->SetTemplate(pointCloud.Object);
}

PARTICLE CREATION:

TArray<FVector> points = TArray<FVector>();

// generate points

for (auto point : points)
{
UGameplayStatics::SpawnEmitterAttached(_particleSystemTemplate, RootComponent, TEXT(“p”), point + GetActorLocation(), FRotator(0.0f, 0.0f, 0.0f), EAttachLocation::KeepRelativeOffset, false);
}

Place the C++ actor anywhere in your scene and it should work.