Skip to content

Orillusion engine is a lightweight rendering engine that fully supports the WebGPU standard. Based on the latest Web graphics API standard, we have made a lot of exploration and attempts to implement many techniques and functions that were previously difficult or impossible to achieve on the web. We have summarized the architecture and feature characteristics of the engine from the following aspects.

WebGPU Support

The engine's underlying design completely follows the latest WebGPU standard without considering compatibility with the existing WebGL standard. With the continuous development of the WebGPU API and WGSL , we will also rapidly update and iterate the computing and rendering capabilities of the engine's underlying WebGPU , enhancing the engine's performance advantages.

ECS Component-Based System

As the engine framework has developed, the industry has generally begun to adopt the development design principle of composition over inheritance. Therefore, we have abandoned an inheritance-based architecture and chosen the latest ECS component-based architecture as the design philosophy for the engine's body. By eliminating the complexity of inheritance chains and interwoven functionality in the inheritance model and redesigning through decoupling, encapsulation, and modularization, developers can flexibly combine and extend functionality.

Data-Oriented Design

The strict ECS architecture requires that Entity, Component , and System be completely independently separated. This design paradigm can result in greater improvements in data optimization and performance. However, it also brings significant negative issues, namely, high development costs and difficulties. Therefore, considering the difficulty of developers' use and the development habits of web developers, we have adopted the core Data Oritented (DO) concept in ECS and implemented an on-demand DO structure. The current usage is to create continuous memory in the GPU and implement efficient data transfer between the CPU and GPU through memory mapping, reducing the waiting time and frequency of data exchange between the CPU and GPU. This approach can improve cache hit rates, improve performance, and ensure the overall ease of development and use of the engine.

Clustered Light Culling

This is the light culling scheme in Clustered Forward Rendering. The spatial division is performed in two dimensions (Tile) and three dimensions (Cluster), and only the light sources that contribute to the block space are calculated to remove ineffective light sources and improve computational efficiency. Due to the limitations of WebGL's Uniform Buffer, the number of supported light sources is relatively small, usually within 10. With the introduction of Storage Buffer in WebGPU, it basically directly targets the limit of GPU memory. As long as self-memory management and optimization are done well, the power of the GPU can be fully utilized to achieve multi-light source rendering.

Physics Simulation System

We first implemented ammo.js as the basic physics simulation on the CPU side. At the same time, we are building a GPU-based physics simulation engine based on Compute Shader, including particles, fluids, soft bodies, rigid bodies, clothing, etc. During the WebGL era, only the data structure of vertices and textures could be used for the corresponding calculation process, which was complex and inefficient. With the Compute Shader in WebGPU, memory and data structures are more flexible, giving us a lot of room for imagination. Currently, many excellent physics simulation cases have been implemented, and more powerful physics simulation functions are being rapidly iterated.

Physics-Based Material Rendering

We have implemented the most basic Blinn-phong model material rendering. In order to achieve better realism rendering effects, we rely on HDR Light and have also implemented material rendering based on PBR (Physically-based rendering). This is currently a standard feature in mainstream engines and is a common basic engine requirement.

Dynamic Diffuse Global Illumination (DDGI)

The DDGI (Dynamic Diffuse Global Illumination) algorithm is a global illumination algorithm based on Probe. A large number of Probe need to be placed in space and grouped together to form a DDGI Volume. A Compute Shader is used to calculate the irradiance (light information) and G-buffer (geometry information) of each Probe, which are stored by mapping from a sphere to an octahedron and then to a square. When shading, only the light and geometry information stored in the surrounding probe need to be accessed to calculate the shading information of the shading point. Binding the Volume to the camera and moving with it will apply indirect lighting to objects within the Volume. Currently, we set a maximum of 32 indirect light sources, based on overall rendering performance.

Rich Post-Processing Effects

Post-processing effects are an important way to enhance the atmosphere of rendered content. Based on the compute shader of WebGPU, we have currently implemented commonly used post-processing effects such as HDR Bloom, Screen Space Reflections, and Ambient Occlusion. By relying on the general computing capabilities of WebGPU, we can more efficiently utilize the computational advantages of the GPU and achieve very good results.

For example, Screen Space Reflections (SSR) is a reflection effect implemented based on the size of the screen space. Compared to planar reflections, it can achieve reflections on any surface in the scene without additional DrawCall, and is a very popular real-time reflection technique. First, each pixel of the screen space object needs to calculate its reflection vector. Then, it is necessary to determine whether the depth of the screen space Ray Marching coordinate and the depth of the object stored in the depth buffer intersect. Finally, adjust the roughness appropriately, and use the intersection point color as the reflection color to complete the shading. We implement all the calculations in this process using the Compute Shader of WebGPU, avoiding the consumption of CPU. In the end, we can present very good reflection effects in the browser.

For more extended post-processing effects, please refer to PostEffects