Remember, my complete blog is now at: http://www.SebbyLive.com/ (http://www.sebbylive.com/post/2007/11/Flight-Simulator-X-AccelerationSP2—Water-DX10-vs-DX9.aspx)
About time hunh? I know, acceleration is already out and I was not even finished with the overview of all the features I worked on for my blog. That’s life for ya…
Before I start explaining anything, the two videos below compare the DX10 and DX9 water effects…
DX10 Water (Download Here)
DX9 Water (Download Here)
See the difference? Well I swear there is one, and the quality of these video clips sure doesn’t give it justice. Of course, those that remember this magical “PR mock-up” screen shot showing what DX10 could be, you probably say the dynamically moving water with waves crashing on the shoreline,… Obviously this did not happen. Probably the best way to approach this topic is to start explaining what happened and then go through the things that didn’t happen and explain why.
What Did Happen in DX10
Most of the work for DX10 was kept as small size chunks. This was on purpose to try and keep our work balanced between the various features. But overall here is a breakdown of the improvements made:
Performance improvements to the generation of the reflection map. Turns out we were doing alot of useless things to generate this low-resolution texute. This is still not perfect but in some extreme cases it did create a 20% performance improvement on my DX10 system.
Significant enhancements to the water shader. For the most part this includes the addition of more bump for the water so the bumpiness appears less repetitive and more dynamic. I have also added a new “detail bumpmap” which only kicks in when the viewer is closeby. This is to compensate for the lack of resolution of the bump when on the water (which created really blocky lighting and reflection). This texture does fade out with distance to avoid any aliasing problems.
Also, I added support for simple whitecaps. At this time, it isn’t done through dynamically generated particles or other geometry but it is actually done procedurally within the pixel shader based on an estimation of the local turbulence. It actually looks quite nice considering the simplicity of the algorithm.
I also started the implementation of the framework needed to allow the variation of the water settings on a per-waterclass basis. The code that is in place is not complete and was disabled. This feature came in too late and was too risky to turn on so we did have to “ditch it” at the last minute.
What Didn’t Happen in DX10 🙁
Actually, the main thing that did not happen and which is the main feature that is noticed is the dynamically waving water. This was indeed in the initial plans for SP2/Acceleration. Actually, this was even in the initial FSX plans but at the time the only solution was to do this on the CPU and seeing that it would consume 30-50% of the CPU on complex scenes, we decided to postpone this feature until it could be done on the graphic hardware.
Of course, DirectX 10 was a prime opportunity for this. However a few problems caused us some grief. The initial plan was to leave the water geometry as-is and let the GPU tesselate the geometry within the new geometry shader. Well once the real hardware came out, it turned out that geometry shaders we not performant enough to accomplish this. The second option was to pre-generate the water geometry but let the dynamic update happen on the GPU. The problem in that case is that it would roughly double the terrain/water geometry memory footprint.
In other words we were doomed either way and deemed this was just too risky at the moment, at least until we could fully investigate the consequences of each option and to see what else could be done.