Remember that my Main Blog has moved to www.SebbyLive.com (FSX: What is the Difference Between the Water 2.X Low/Mid/High/Max Settings?)
The purpose of this post is to address a question that was sent to me in regards to water reflections in general. The question actually is two questions... The first one asks me to explain the difference between the various Water 2.X settings (Low/Mid/High/Max) and why these settings have such an effect on perf. The second question was in regards sd to why dynamic reflections are only on bodies of water and not other wet surfaces (such as a wet runway). I want to keep the answer as simple as possible but at least provide some insight as to how things work and why we have to make some specific decisions some times...
This is actually a good questions. We do apply "reflections" to the other wet surfaces but the reflection map that is used is static and is not dynamic as with the water. There are a few reasons for this but I will cover the main ones. The approach that is used with water surface reflections is to assume that the water is a flat surface and to treat as if it was a plain mirror. With this assumption, we can generate a reflection map simply by reflecting the camera around the plane that is generated by the water surface and taking a "screen shot" from that point of view. This is a really nice and easy way to accomplish water reflections and when dealing with waves, we simply distort the lookup into this reflection map. This is far from perfect but does the job really well in this case.
But what about adding reflection maps on everything else? There are a few problems with this in general. The first one was implied in the first paraghaph "to assume that the water is a flat surface"... This is not generally true for general objects and this method breaks down rather quickly as soon as a surface is not planar. The next best alternative is to use a cubemap as a reflection map, but this automatically increases the cost by a factor of 6x. Going back to the specific case of runways and wet pavement, in the majority of cases, we could likely assume a flat surface. But there is another overall problem (which is also a problem with water in genral). What if there is more than one planar surface in view? What to do in the case where you can see two lakes that are at a different altitude within the same view? The correct approach in this case would be to generate a seperate reflection map for each planar surface that is visible. But as you can imagine, that would be impractical and would make the cost of rendering the reflection maps unpredictable. For water, we simply look at what is in view and make a good faith guess as to what is the predominent body of water and use its elevation to generate the water reflection map.
Also, in the case of water, we have nice vector data which outlines the contour of the body of water, making it easy for us to determine the outline of the bodies of water. For generic reflective materials, it is more difficult. We do have similar information for airport related asphalt but not necessarily for other reflective surfaces in the game. Dynamically generating a reflection map is something that can get hairy real quick so it was decided that, at least for FSX, we would focus only on water reflection.
Instead of writing a long paragraph on this, I think a picture is worth a thousand words. I have captured a snapshot of the same scene using the various 2.x water settings. In the caption below the image I indicate what is rendered inside the reflection map and I've also turned on a debut feature which shows the content of the reflection map in the top-left corner. I will not go into the details of where all the performance goes, but you can likely extrapolate from the amount of detail in each map that the Max setting is going to cost LOTS MORE than the Low setting.
Water 2.X Max - All is rendered, equivalent to rendering the whole scene twice with the exception of a few optimizations which take advantage of the autogen and batching LOD system to reduce the overall number of draw calls.
Water 2.X High - Only the aircraft, full sky (with clouds), terrain and non-autogen scenery is rendered.
Water 2.X Med - Only the aircraft, full sky (with clouds) and non-autogen scenery is rendered.
Water 2.X Low - Only the aircraft and sky (without clouds) is rendered.