Finally, finally, finally, finally, for the first time since I started working on this feature several years ago, finally we have real-time global illumination with a second light bounce: Below you can see the direct light hitting the floor, bounding up to the ceiling, and then being reflected back down on the floor again.
Performance is still good and I have not started fine-tuning optimization yet. I was just trying to get the effect working at all, which was quite difficult to do,
The time finally came to revamp the main menu for Cyclone. Doing menu work for me is really hard to get into but once I'm knee deep into it, it's all I want to do. I decided now is the time to work on a semi-final menu system due to the following.
I just finished Steam Input and the menu wasn't compatible.
The white text on a bright background was hard to make out.
I only had a "New Game" option. There was no way to jump to a map you wanted to play without the console enabl
Now that I have the downsampled reflection data working, I can start casting rays. The cone step tracing is not a 100% perfect representation of physical light, but it gives a very favorable balance of quality and performance. Somehow I came up with a few formulas that eliminate light leaks and other artifacts.
Quite honestly I did not think the results would be this good. Indoor / outdoor scenes with thin walls are very difficult to prevent light leaks in, but somehow it's working ve
For downsampling of GI voxel data, I found that a compute shader offers the best performance. The first step was to add support for compute shaders into Ultra Engine.
I've never used these before but I was able to get them working pretty quickly. I think the user API will look something like this:
//Load compute shader
auto module = LoadShaderModule("Shaders/Compute/test.comp.spv");
auto shader = CreateShader();
//Create work group
After testing and some discussion with other programmers, I decided to try performing voxelization on the GPU instead of the CPU. The downside is the memory usage is much higher than a sparse voxel octree, but I found that sparse voxel octrees were very slow when it came to soft reflections, although the results of the sharp raycast were impressive:
You can read the details of GPU voxelization here if you wish.
Initially I thought the process would require rendering the
It's been roughly over a year since active development started on this project. Today, I'm excited to announce that Cyclone now has a "Coming Soon" page on the Steam Store! This marks a huge milestone for the project and I'm looking forward to getting this out as soon as possible.
Cyclone is planned on being released as an Early Access title. Releasing into Early Access will grant a layer of feedback, bug reports, and ideas that can help build the remainder features, as well as additional
I've got cone step tracing working now with the sparse voxel octree implementation. I actually found that two different routines are best when the surface is rough or smooth. For sharp reflections, and precise voxel raytracing works best:
For rough surfaces, cone step tracing can be used. There are some issues to work out and I need to revisit the downsampling routine, but it's basically working:
Here's a video showing the sharp raycast in motion. Performance is quite good
I've moved on to one of the final steps for voxel cone step tracing, which is downsampling the lit voxels in a way that approximates a large area of rays being cast. You can read more about the details of this technique here.
This artifact looks like a mirror that is sunken below the surface of some kind of frame. It was appearing because the mesh surface was inside the voxel, and neighboring voxels were being intersected. The solution was to move the ray starting point out of the voxel the
I've now got basic specular reflections working with the sparse voxel octree system. This uses much less memory than a voxel grid or even a compressed volume texture. It also supports faster optimized ray tests, for higher quality reflections and higher resolution. Some of the images in this article were not possible to produce in my initial implementation that used volume textures.
This shot shows the reflection of just the diffuse color. Notice the red column is visible in three reflectio
While seeking a way to increase performance of octree ray traversal, I came across a lot of references to this paper:
Funnily enough, the first page of the paper perfectly describes my first two attempted algorithms. I started with a nearest neighbor approach and then implemented a top-down recursive design:
GLSL doesn't support recursive function calls, so I had to create a function that walks up and down the octree hierarchy with
We are already in 2022, and we continue to do things in order to learn, to understand how to design a video game.
To date, Astrocuco is the result of many intermittent years of learning where the challenge is always the same, to create prototypes of how programming works.
What I have learned, I have managed to master to an acceptable degree the subject of programming, understand concepts of classes, objects and most importantly apply them when writing code, in this case Lua Script. Thi
The VK_KHR_dynamic_rendering extension has made its way into Vulkan 1.2.203 and I have implemented this in Ultra Engine. What does it do?
Instead of creating renderpass objects ahead of time, dynamic rendering allows you to just specify the settings you need as your are performing filling in command buffers with rendering instructions. From the Khronos working group:
In my experience, post-processing effects is where this hurt the most. The engine has a user-defined stack of post-pro
Didn't post here in a long time , this will be about storing game data.
There are a lot of options on how to store your game data structures:
files (json,xml,yaml , custom etc)
databases , nosql dbs
memory (if no persistence needed)
Also if you use an engine it could provide its own way of storing data.
Choosing a good way to do persistence is important.
This depends on lots of factors like game type, complexity of data structures etc
Previously I described how I was able to save the voxel data into a sparse octree and correctly lookup the right voxel in a shader. This shot shows that each triangle is being rasterized separately, i.e. the triangle bounding box is being correctly trimmed to avoid a lot of overlapping voxels:
Calculating direct lighting using the sparse octree was very difficult, and took me several days of debugging. I'm not 100% sure what the problem was, other than it seems GLSL code is not quite
My initial implementation of mesh voxelization for ray tracing used this code. It was good for testing, but has some problems:
It's slow, using an unnecessary and expensive x * y * z loop
No support for per-voxel color based on a texture lookup
There are mathematical mistakes that cause inaccuracy, and the math has to be perfect
My solution addresses these problems and only uses an x * y loop to generate the voxels. It does this by identifying the major (largest magn
After several days of development from the moment of release, we are ready to submit to you the first update of our game. Please support us, add to wishlist and share with your friends about SALVATIONLAND: https://store.steampowered.com/app/1807590/SALVATIONLAND/
Added a hint for picking up a hammer (basement of an abandoned school),
The mechanics of blocking due fights have been revised: now enemy hits are blocking more effectively,
Fixed a critical bug with opening inv
Previously I noted that since Voxel global illumination involves calculation of direct lighting, it would actually be possible to do away with shadow maps altogether, and use voxels for direct and global illumination. This can eliminate the problems of image-based shadows like shadow acne and adjusting the shadow map size. I also believe this method will turn out a lot faster than shadow map rendering, and you know how I like fast performance.
The sparse voxel octree node structure consume
Debuting 2022 with a very first try of a level design for my offroad game project I try to construct with Leadwerks 4.6
The map needs a lot more improvements.
There are a few bugs (like swimming) and some collisions problems, but this how it could look like, with the challenge for the player to find his way through the world - like a puzzle driving game - without getting stucked (like me in this showcase) or have your car destroyed. So I will add an
This is an update on my progress of our voxel raytracing system. VXRT is designed to provide all the reflection information that PBR materials use. If a picture is worth a thousand words, then this counts as a 5000 word article.
Final combined image:
ERK Games presents the first open-world game powered by the Leadwerks Game Engine - "SALVATIONLAND". This is a story shooter with additional non-linear quests, stealth-action and survival elements, developed by members of former "Between the Realities" team. Our game will be released in Steam's Early Access on December 28, 2021.
Please add to wishlist!
Cyclone was shaping up visually, but I was getting feedback about the sound implementation not being so good. I previously created a script system that defined all my sounds under profiles. This was a step in the right direction and made it easier to tweak sounds without recompiling code. However, no matter how much I played with variables, I never was able to satisfy the complaints.
After I showcased my first gameplay trailer, I decided to finally sit down and really understand FMOD. I wa
The Ultra Engine editor is designed to be expandable and modifiable. Lua script is integrated into the editor and can be used to write editor extensions and even modify the scene or the editor itself in real-time.
We can create a scene object entirely in code and make it appear in the scene browser tree:
box = CreateBox(editor.world)
box.name = "box01"
o = CreateSceneObject(box) --make editor recognize the entity and add it to the scene browser
We can even