• Stars
    star
    133
  • Rank 272,600 (Top 6 %)
  • Language
    C++
  • License
    BSD 2-Clause "Sim...
  • Created about 5 years ago
  • Updated almost 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Progressive Real-Time Rendering of Large Point Clouds without Hierarchical Acceleration Structures

Skye

This is the source code to the paper: Progressive Real-Time Rendering of One Billion Points Without Hierarchical Acceleration Structures (Markus Schütz, Gottfried Mandlburger, Johannes Otepka, Michael Wimmer).

Skye is a live coding framework and point cloud viewer using a progressive rendering method that allows viewing any point cloud that fits in GPU memory in real time without the need to create hierarchical acceleration structures in advance. Instead of rendering all the points every frame, we distribute the rendering over multiple frames. The previous frame is reprojected to the current in order to preserve already rendered detail, and holes are filled by rendering a certain number of random points. The amount of random points can be adjusted to ensure real-time frame rates and over the course of a few frames, the image will converge to the full model.

  • The rendering engine is implemented in Javascript (using V8) and code can be modified at runtime. Saving a *.js file via ctrl+s will immediately execute it and subsequently replace old code with the new one.
  • The javascript engine is backed by a C++ and OpenGL core. JS bindings exist for most OpenGL functions. Some performance sensitive parts may be written entirely in C++.
  • It's relatively easy to implement your own functionality in C++ and write a JS binding to it. Check V8Helper.cpp for some examples. There are also examples like readFileAsync for bindings that return promises, and therefore allow you to execute C++ code in parallel threads and invoke a callback / resolve the promise in JS once the thread finishes.

It's being developed at the Research Division of Computer Graphics, TU Wien

Videos (YouTube):

Getting Started

Install

Open Skye.sln and compile the project in Release mode.

Then, open the workspace in Visual Studio Code by right clicking an empty region, then selecting "Open with Code". Start the application from vscode by pressing ctrl+shift+b.

Things to do

In order to view one of your own point clouds, open "modules/progressive/progressive_pointcloud.js" and change the load command to let las = loadLASProgressive("C:/my_pointcloud.las");. Once you save the file with ctrl+s, the file will be loaded. The current demo works with point clouds that have color data and point clouds that have extra attributes. There are bugs to fix for standard attributes other than RGB. We recommend to try ot_35121F2416A_1.laz hosted at Open Topography with 54 million points, convert it to LAS (las2las ot_35121F2416A_1.laz -o ot_35121F2416A_1.las), and then specify that file in the loadLASProgressive call. You can also try a las file without color. In that case, uncomment vColor = vec3(1, 1, 1); in reproject.vs. This will render your point cloud in white.

Performance

Point clouds can be loaded at rates up to 100 million points per second from M.2 NVMe SSDs. For this to work, you will need to convert your las file to a custom format (that matches the vertex buffer format) with tools/las2bin.js. You will also need to change the load command to loadBINProgressive.

Rendering performance depends on how many points you use to progressively fill holes. You can change this amount in render_progressive.js. Look for let remainingBudget = and set this to something between 1 to 30 million, depending on your GPU performance. Just press ctrl+s, the change will be applied at runtime. There is also a dynamic/adaptive budget, but that one is bugged since one of the recent commits.

Rendering performance. Brute-force: Time to render all points in a single frame. Progressive: Time spent on the passes and the total time of a progressively rendered frame. Budget: Number of points rendered in the Fill pass. All timings in milliseconds. The Vienna data set on 1660 produces notable results. The progressive method converges multiple times faster if only the first 230 million points are rendered, instead of all 277. This is because if there is not enough GPU memory left, the GPU will use slow shared memory for parts of the data. The progressive rendering approach can still reach real-time performance in such cases, but the time to convergence will be multiple times larger.

Limitations

This project is an early prototype that is super unstable. It works, but you should expect crashes, bugs and frequent breaking changes as it is updated.

License

This project is licensed under the 2-Clause BSD License, see LICENSE.txt. Some parts of the engine, mainly the math classes is src_js/math, are heavily inspired and partially taken from three.js, which is available under the MIT License.