Control structure for cloud system
Howdy all, I've been reading Nitshita's paper on Realtime clouds, attempting to update it into capable hardware. (That is, rendering the data through a voxel field instead of the metaball/splatting approach)
i found a thread that delt with the rendering part, and shows that it works pretty damn good. However, his clouds were generated just using simple perlin noise; No creation, destruction etc like Nitshita.
So my main question is this: Has anyone implimented a constrolstructure similiar to Nishita's?
Essencially, it's 3 boolean arrays (XxYxZ in size) determining humidity, activation, and precipitation. Which is all find and dandy by me. The problem comes when trying to transfer that data to the pixel shader for raytracing: To my knowlage, there's not a bit sized image format in hardware. I understand how the perlin noise function can do it, that's no problem. I'm interested in how to handle that information dynamicly using activation.
Thoughts?
~Main
I did implement it - you can see a video in action here. Although i didn't spend a lot of time on the shading itself, so you are warned.
My first goal was performance, and making the clouds volumetric (so you could fly through them, like in a flight sim). I get from 400 to 600 fps on a GF6 when looking at the sky from ground level.
I do not use any pixel shader at all, although i intensively use vertex shaders for high performance particles rendering. There are more details in my journal, if you're interested. The rendering is optimized by using impostors pretty much everywhere, so when there is no impostors to update, i usually render around 1000 triangles per frame for the whole sky.
Y.
My first goal was performance, and making the clouds volumetric (so you could fly through them, like in a flight sim). I get from 400 to 600 fps on a GF6 when looking at the sky from ground level.
I do not use any pixel shader at all, although i intensively use vertex shaders for high performance particles rendering. There are more details in my journal, if you're interested. The rendering is optimized by using impostors pretty much everywhere, so when there is no impostors to update, i usually render around 1000 triangles per frame for the whole sky.
Y.
Those Clouds look pretty damn good.
So, correct me if i'm wrong, but it sounds like all you're doing is billboarding a sprite at each voxel location, and changing it's alpha and color based upon the three state values for the clouds.
Have you attempted/considered doing a full volumetric approach? That is, converting the actual state data to a 3d texture, then rendering a ray-traced volume cloud?
And how's the fill rate with that many particles? Seems to look like a lot...
~Main
So, correct me if i'm wrong, but it sounds like all you're doing is billboarding a sprite at each voxel location, and changing it's alpha and color based upon the three state values for the clouds.
Have you attempted/considered doing a full volumetric approach? That is, converting the actual state data to a 3d texture, then rendering a ray-traced volume cloud?
And how's the fill rate with that many particles? Seems to look like a lot...
~Main
You're right - for every voxel, i use a single particle. Empty voxels (with a cloud density of 0) do not generate any particle, obviously. I'm using a 96x20x96 voxel space. This voxel space is then converted to a set of shaded particles. To reduce memory usage, N types of spaces are used (N is 5 or 6 in that video), each corresponds to different clouds conditions. The world is split in 16x16 cells, and each cell is assigned a cloud voxel type more or less randomly. Each cloud type is in the 5000 to 25000 particles range.
The total amount of particles in the world is very high, but you only need to render some of these particles when updating an impostor, ie. not very often, especially if you are moving "slowly" (= plane speeds). Because 99% of the time you're only rendering the impostors and not the particles, the fillrate is pretty low.
I didn't try a full volumetric approach. 3D textures are still pretty expensive and you'd need to slice many layers to give a good volumetric feeling (killing your framerate due to overdraw/blending), or to use a kind of ray-caster in a pixel shader (arg! performance).
Y.
The total amount of particles in the world is very high, but you only need to render some of these particles when updating an impostor, ie. not very often, especially if you are moving "slowly" (= plane speeds). Because 99% of the time you're only rendering the impostors and not the particles, the fillrate is pretty low.
I didn't try a full volumetric approach. 3D textures are still pretty expensive and you'd need to slice many layers to give a good volumetric feeling (killing your framerate due to overdraw/blending), or to use a kind of ray-caster in a pixel shader (arg! performance).
Y.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement