I’ve been following this new dawn of VR since John Carmack started working on Doom 3 VR with Oculus but I never really saw VR as a gaming platform mainly because of the control schema, several companies started creating some peripherals to create some extra degree of inmersion but I never liked this so much because you’ll have to buy a ton of stuff that are not guarantee to work with all the VR games.
I always saw VR as a platform for experiences, like watching a movie or visiting a place or even for social share, but with that said I never truly tested VR until recently.
I got my hands on a really cheap VR headset for mobile (just 2 lenses on a plastic case) and tried some mobile games, while most of them weren’t any interesting I did see some potential for this platform and this kind of games, and after watching some youtubers play some games I found some issues with how this games are presented to people.
So I decided to give it a try:
Although I’m building it specifically for VR, I’m also adding multiple options like playing the game with or without a gamepad, in VR or not and if you are not playing in VR then you can also play with touch controls as in any other first person mobile game, the most difficult thing right now is trying to balance the game through the multiple type of input but I think it can be achieved.
There is no much to say about the game right now, I’m still dancing around some concepts for games that I have, there are several challenges in this project since this is not only my first VR game but also my first game made in Unity but so far is been a nice ride.
So, I’ve been busy the last month learning about other methods for rendering the voxels, specially on the GPU, I came across a method called raymarching which use signed distance functions (SDF) to create scenes, it is really powerfull and easy to write, you can create shadows, reflections and other effects with a few lines of code:
In raymarching you use a traditional ray casting method only that instead of advancing at a constant step you advance by searching the minimum distance to a solid in the whole scene:
The main problem with this is that you need to check the distance to all the objects in the scene to determinate how much you need to move, this is ok for 2 or 3 objects in the scene but not for a real (game) scene, you need a way to obtain just the object that falls in the ray direction, you can achieve this by many ways, the simplest one being using a raycast algorithm (Like this fast voxel traversal by Amanatides and Woo) in a grid to obtain the objects and then perform raymarching to get the pixel and other properties of the object. This improves the rendering time and let you have more complex scenes.
This works pretty well but since I need only small voxels (cubes) and no the others SDF so I wrote a small program in C++ to do raycasting on a voxels grid, this image contains a 64x64x64 grid but it supports bigger scenes at +60fps:
So I’m not going to continue what I had in JS using the greedy merging geometry (ala minecraft) but I will continue in C++, I have some issues right now, the main being sending all the voxels data to the GPU is rather slow, I tried writting a software renderer solution but with no luck so far due to speed issues, I’m also reading about OpenCL and CUDA but I’m not sure yet if I should use those. One thing that I’m sure is that I need to migrate the data from a raw array of voxels to a sparse voxels octree.
Anyways, this is still the beginning of this project (and this is by far the hardest thing I’ve ever tried), so I’m feeling a little patient and happy for now 🙂
Progress is going to be a little slower for the next month because I’m taking a break, I’m still working on this whenever I have free time but for the next month or two I’m going to be on other subjects.
This week I implemented the frustum culling to avoid rendering of parts of the world that are not visible, it test against an octree so it is really easy to determinate that large areas are not going to be render.
I also been working a little bit more on optimizing the rendering algorithm, it is better now but there is still work to do on that field.
I did a little research on how to generate a terrain using the perlin noise algorithm, this article on devmag.org was really usefull on this subject, I already did a basic implementation but I have to work more on it to achieve a good result:
I’m going to start working a little on the collision part, mostly allowing to create and remove voxels with the mouse and after that I will work on the lighting system.
So this last week was a little slow for me, I couldn’t work on all the features that I wanted but I did manage to improve the greedy meshing algorithm that I was using.
It works pretty fast now even when removing multiple blocks on several chunks, one of the things I did was to change the way I was doing the merge, in the previous version I had to render both faces of each triangle because of situations like this:
When two voxels shared the same face but the face needed to look in both directions at the same time, the solution was simply to split the face in to two faces:
With this done now I can activate the culling and render each triangle only once.
I also Implemented the octrees to distribute the chunks and be able to do culling (still pending):
I hope to finish the frustum culling this week and maybe do some implementation for occlusion culling.
I’ve been busy last week trying to implement a greedy meshing algorithm based on the article by Mikola Lysenko on the 0FPS blog, It was a bit more tricky than I expected (I still have to optimize it more) but the basic theory for this is pretty straight forward:
This allows me to merge multiple blocks and hide the triangles that are not visible
So far I think it is working fine, it takes quite some time right now (about 50ms) to regenerate the chunk of 16x16x16, which would be about 4 frames in a 60fps application, I will try to reduce this number as much as I can.
Next thing on the list is trying to implement octrees to later perform culling of the chunks.
I’ve been busy the last couple of months: learning a bit of pixelart and story writting and most recently I started to research about voxels and decided to give it a try by myself:
For now there is no much to see, I’ve been working on this for a couple of weeks now laying down all the basic structures, chunk management an geometry reconstruction:
I’m not targeting to do a game with this but I do want to publish it later as a library along with several examples that I will be developing during the development time; I’ve already have an example of several voxels (around 2M) and it worked fine but it still needs optimization in order to run properly:
That would be all for now at least on this topic of voxels.
I was busy last week doing a game for a little challenge that took place over the YoYoGames forums. The idea was to create a pseudo 3D game using Game Maker without using any of the d3d functions that the program offers.
So I decided to go with something simple, a raycaster engine in GML, I’ve done many raycasters previously in JS so I’m very familiar to how it works, since the other participants were doing amazing 3D projects I decided to aim to the “fun” category so I took one of the pieces of my last current project (also in GM) Wraith and did a First Person Shooter / Tower Defense mix.
There were 3 categories in which the games were qualified and I made it at the top 3 of those 3 categories:
I continued the development of this project (now called Wraith) This is the end of the 3rd week and most of the work has been directed towards the optimization of the engine, it was running pretty well but I don’t really enjoy having so many instances doing nothing.
The first thing I did is to modify the way the geometry and solid instances were handled in GM, I had before one instance per block and the geometry was the same size of the block:
Each individual color is a collision mask and 3D geometry:
I merged the horizontal and vertical collisions and the geometry is merged by texture.
Finally, I started working on a single level to test enemies encounters and the gameplay elements. If everything goes well then I will have a demo version towards the end of February.
So this new year I decided to start a new project and take a step back from the RPGs I’ve been trying to develop for the last years… My favorite games are the first person shooter and they are actually what got me into game development in the beginning, since I had an old license for Game Maker Studio I decided to give it a try and start a new project.
I know there are far better tools than Game Maker to make a 3D game, but that’s also the reason I picked GMS, it’s because I know it has a great potential for this kind of task, I already tried to develop a 3D game with GM 6 years ago and it failed, but it was done with GM8 and it was poorly optimised so I want to make it better now.
I’ve been developing it for 2 weeks now, most of the time has been working in the engine itself but I’m aiming to have something playable towards the middle or end of February
The gameplay will be based on old fps (Doom, Quake, etc) in which the action is faster and there is few story elements during gameplay, the game itself will have a story although I’m still thinking on how to present it without taking much of the game. It will have a single player campaign and a multiplayer mode, the weapons and game are going to be futuristics but in a wasteland environment.
The textures I have now (except for the gun) are from the game hexen but I’m going to replace all of them with custom made textures, I’ve done so far the collision detection in 3D (very simplistic for now since the maps are made on a grid), picking up weapons and firing making bullet holes on the walls, a terminal (like quake) to make modifications to the game and system messages for when picking weapons or making actions.
That would be all for now, I will be posting updates on this game hopefully every week with the new features I added to it.
This year is going pretty fast, its been a long time since my last post for the 7DRL game. I’ve been busy working on different personal projects during the last 4 months but there is nothing really to show, here is what I’ve been to:
Perhaps the biggest project I’ve spend time is on learning graphics programming and developing a new WebGL library, it is going pretty well but it is a really big project so there is still a lot to do, I will try to upload demos in the next months while I work with it:
I’m also learning to work on the unreal engine, I like it a lot but I don’t think that I will develop a project any time soon:
And finally, I decided to retake the development on Lune, I was developing this project along with Slash but we kind of dropped it after the contest for the 7DRL challenge, anyway, since he is busy working on Ananias, I will work on it for now: