<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4217826068942535587</id><updated>2012-01-31T19:52:09.421+01:00</updated><category term='bittorrent'/><category term='helicopter'/><category term='cessna'/><category term='Google Maps'/><category term='water'/><category term='simulator'/><category term='roads'/><category term='atmosphere'/><category term='fractal terrain'/><category term='fog'/><category term='horizontal displace'/><category term='flight simulator'/><category term='planet rendering'/><category term='chromium'/><category term='Catmull-Rom'/><category term='xnview'/><category term='elevation data'/><category term='depth buffer'/><category term='detail texturing'/><category term='video capture'/><title type='text'>Outerra</title><subtitle type='html'>http://outerra.com
Planetary engine that is using elevation and other available datasets (like climate maps) in combination with fractal refinement algorithms to render planets down to centimeter resolution. Quad-tree based spherical planet rendering; using wavelet compression of elevation data with progressive download, on-demand decompression of required LOD for visible quad-tree nodes, bicubic fractal subdivision algorithms used to generate the finer detail.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-8558875888674316800</id><published>2011-10-12T15:24:00.001+02:00</published><updated>2011-10-12T15:34:24.230+02:00</updated><title type='text'>Basic environment sounds</title><content type='html'>We have added sound system (based on OpenAL), and provided aircraft with engine sounds using preliminary sound samples. Once the sound system was working, I went to add some basic environmental sounds so that the world feels more alive.&lt;br /&gt;&lt;br /&gt;The whole system works by sampling coarse level environment data points surrounding the camera, using a 5x5 cornerless grid. Sound emitters are then set up at the places of the points, and each emitter is assigned a sound buffer corresponding to the type of environment.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qJv2dE1XRkw/TpV3Sfthy5I/AAAAAAAAALA/_SKz_HPMkvQ/s1600/sound-grid.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="450" src="http://3.bp.blogspot.com/-qJv2dE1XRkw/TpV3Sfthy5I/AAAAAAAAALA/_SKz_HPMkvQ/s640/sound-grid.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To hide the grid layout, the emitters are set up to start attenuating the sound only from a distance that is larger than half the grid step. This works almost alright, except that the unattenuated zone also spans upwards, which doesn't feel natural. Later we'll have to implement a custom attenuation function that will handle it.&lt;br /&gt;&lt;br /&gt;At the moment there are just 4 environment types - grass, open sea, shoreline and forest. Each emitter of given type can use only one of two sound samples (for now), that are pseudorandomly picked for given location. Locations are identified using a global unique identifier; this identifier is also used to manage the reuse of sound emitters.&lt;br /&gt;&lt;br /&gt;Apart from these ground sources there is also another layer of emitters that are used to provide sounds of wind and rustling of tree leaves. They are positioned higher above the ground.&lt;br /&gt;&lt;br /&gt;Following video shows it in action. The sound of wind in the last part of the video (in forest) is too loud, especially when the leaves and branches aren't moving yet.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="400" src="http://www.youtube.com/embed/jjzyvjSKQKc?hd=1" width="728"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;***&lt;/div&gt;&lt;br /&gt;In other news, we have started a closed beta testing of our alpha demo (yea, beta of alpha &lt;grin&gt;). Here's the &lt;a href="http://www.outerra.com/forum/index.php?topic=464.0"&gt;announcement&lt;/a&gt; and some info from it.&lt;/grin&gt;&lt;br /&gt;&lt;br /&gt;It goes pretty well, meaning we are getting lots of crash and bug reports and unexpected behavior reports on various combinations of hardware, OS versions and internet settings.&lt;br /&gt;It's keeping us quite busy at the moment.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;***&lt;/div&gt;&lt;br /&gt;There's also a new truck model with digital camouflage texture, that we want to use for our demo game:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-33sC3vOC0XU/TpWOWHAHqeI/AAAAAAAAALY/DJAgq_7AV20/s1600/truck7-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://4.bp.blogspot.com/-33sC3vOC0XU/TpWOWHAHqeI/AAAAAAAAALY/DJAgq_7AV20/s640/truck7-1.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-0FC4M63VbiM/TpWOW4ToSHI/AAAAAAAAALg/WOOA_CWEj0o/s1600/truck7-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://2.bp.blogspot.com/-0FC4M63VbiM/TpWOW4ToSHI/AAAAAAAAALg/WOOA_CWEj0o/s640/truck7-2.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The camouflage is a modern type that is apparently not so well-known, and from the initial reactions it seems that Minecraft has spoiled it for people who didn't know about it before :-)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-8558875888674316800?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/8558875888674316800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=8558875888674316800' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/8558875888674316800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/8558875888674316800'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2011/10/basic-environmental-sounds.html' title='Basic environment sounds'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-qJv2dE1XRkw/TpV3Sfthy5I/AAAAAAAAALA/_SKz_HPMkvQ/s72-c/sound-grid.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-6203433448643963476</id><published>2011-07-29T00:24:00.001+02:00</published><updated>2011-07-29T09:04:18.091+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fog'/><category scheme='http://www.blogger.com/atom/ns#' term='atmosphere'/><category scheme='http://www.blogger.com/atom/ns#' term='water'/><title type='text'>White balance</title><content type='html'>When implementing the fog mentioned in the &lt;a href="http://outerra.blogspot.com/2011/07/fog-and-dust.html"&gt;previous post&lt;/a&gt;, I observed a weird thing happening: the fog wasn't white, as I expected, but it had a dirty Beige tint making it look a bit like a smog or something. But since the implementation didn't use different absorption and scattering coefficients for RGB components, and thus the color of the sun light shouldn't have been modified, I thought it was a bug, and neglected it until most of other issues were solved. &lt;br /&gt;But then, after inspecting all the code paths, I came to the only conclusion that the computation is right and the problem must be in the interpretation. So I tried to convince myself that the fog must be white, and the tint actually isn't there. Almost made it, too.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-JAbvtYvJyvs/TjG_DeXnWYI/AAAAAAAAAJU/rduwHV-IvnU/s1600/wb1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://3.bp.blogspot.com/-JAbvtYvJyvs/TjG_DeXnWYI/AAAAAAAAAJU/rduwHV-IvnU/s400/wb1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;But the machine coldly asserted that the color wasn't white as well. Didn't bother with any hinting as to why, though.&lt;br /&gt;Apparently the incoming light that was scattering on fog particles was already this color, even though the sun color was not modified in any way, unlike in the previous &lt;a href="http://outerra.blogspot.com/2011/07/alien-planet-earth.html"&gt;experiments&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Interpretation?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The thing is that sunlight really gets modified a bit until it arrives to the planet surface. The same thing that is responsible for blue sky causes this: a small part of the blue light (and a smaller part of the green light too) gets scattered away from the sun ray. What comes down here has a slightly shifted spectrum.&lt;br /&gt;But how come we see the fog white in real life?&lt;br /&gt;Turns out, everything is fake.&lt;br /&gt;&lt;br /&gt;The way we perceive colors is purely subjective interpretation of a part of the electromagnetic spectrum.&lt;br /&gt;And as it is easier for the brain to orient in the environment when the &lt;a href="http://www.youtube.com/watch?v=KEyvvAiIwYc"&gt;sensors don't move&lt;/a&gt;, it is also simpler to stick with constant properties on objects. Our brain "knows" that a sheet of paper is white, and so it will make it appear white in wildly varying lighting conditions. This becomes apparent when you use a digital camera without adjusting for the white color - the results will be ugly.&lt;br /&gt;&lt;br /&gt;So basically that's why we have to implement an automatic white balancing, at least until we all have full surround displays and our brains magically adapt by themselves. By the way, playing in fullscreen in the dark room with uncorrected colors slowly makes it adapt too.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-pWAdXbWz1-0/TjHGWpre41I/AAAAAAAAAJY/5RVD7Gvs__M/s1600/wb2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://2.bp.blogspot.com/-pWAdXbWz1-0/TjHGWpre41I/AAAAAAAAAJY/5RVD7Gvs__M/s400/wb2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Implementation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Our implementation tries to mimic what the perception actually does. By definition, a white sheet appears to be white under a wide range of lighting conditions. So we are running a quick computation that uses the existing atmospheric code on GPU, that computes what light reflects off a white horizontal surface. The light has two components - sun light that reflects at an angle and its illuminative power diminishes as the sun recedes from zenith, and the second one is the aggregated light from the sky. Once this compound color is known, we could perform the color correction as a post-process, but there's another way - adjusting the color of sun so that the resulting surface color is white. This has an advantage of not affecting the performance at all, since the sun color is already taken into equation.&lt;br /&gt;&lt;br /&gt;While this algorithm doesn't mimic the human perception precisely, i.e. the actual process is more complex and depends on other things, it seems to be pretty satisfactory, though I expect further tuning.&lt;br /&gt;&lt;br /&gt;Some of the properties: it extends the period of day that seems to have a "normal" lighting, and removes the unnatural greenish tint on the sky:&lt;br /&gt;&lt;br /&gt;&lt;table border="0" style="width: 320px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://4.bp.blogspot.com/-6Um1xmgES4k/TjHPNBkXSVI/AAAAAAAAAJc/6dIRE-Tu000/s1600/wb3.jpg"&gt;&lt;img border="0" height="180" src="http://4.bp.blogspot.com/-6Um1xmgES4k/TjHPNBkXSVI/AAAAAAAAAJc/6dIRE-Tu000/s320/wb3.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://1.bp.blogspot.com/-TNcWjk1jZ9o/TjHPPJ-Hx4I/AAAAAAAAAJg/W03Ze-JAeFA/s1600/wb4.jpg"&gt;&lt;img border="0" height="180" src="http://1.bp.blogspot.com/-TNcWjk1jZ9o/TjHPPJ-Hx4I/AAAAAAAAAJg/W03Ze-JAeFA/s320/wb4.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;During the day it compensates for the brownish light color by making the blue things bluer. Can't say the old colors were entirely bad though.&lt;br /&gt;&lt;br /&gt;&lt;table border="0" style="width: 150px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://1.bp.blogspot.com/-DUK0fcmZPTc/TjHU7U_8KhI/AAAAAAAAAJk/CQ8I1HSSRUo/s1600/wb6.jpg"&gt;&lt;img border="0" height="180" src="http://1.bp.blogspot.com/-DUK0fcmZPTc/TjHU7U_8KhI/AAAAAAAAAJk/CQ8I1HSSRUo/s320/wb6.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://3.bp.blogspot.com/-FnjjSQz3Kb8/TjHU7zsa24I/AAAAAAAAAJo/IGtA4bZ0KzY/s1600/wb7.jpg"&gt;&lt;img border="0" height="180" src="http://3.bp.blogspot.com/-FnjjSQz3Kb8/TjHU7zsa24I/AAAAAAAAAJo/IGtA4bZ0KzY/s320/wb7.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table border="0" style="width: 150px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://2.bp.blogspot.com/-YqlgXPpgvFU/TjHU8rssCpI/AAAAAAAAAJs/2FhwiRGq014/s1600/wb8.jpg"&gt;&lt;img border="0" height="180" src="http://2.bp.blogspot.com/-YqlgXPpgvFU/TjHU8rssCpI/AAAAAAAAAJs/2FhwiRGq014/s320/wb8.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://4.bp.blogspot.com/-UePt9eb9_L4/TjHU9NsWopI/AAAAAAAAAJw/rHyOh4N6Ves/s1600/wb9.jpg"&gt;&lt;img border="0" height="180" src="http://4.bp.blogspot.com/-UePt9eb9_L4/TjHU9NsWopI/AAAAAAAAAJw/rHyOh4N6Ves/s320/wb9.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-78Tf_0cOhzc/TjHa2yGDQYI/AAAAAAAAAJ0/4BO6if82Qnc/s1600/wb5.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="225" src="http://2.bp.blogspot.com/-78Tf_0cOhzc/TjHa2yGDQYI/AAAAAAAAAJ0/4BO6if82Qnc/s400/wb5.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;So long, and thanks for all the fish&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-6203433448643963476?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/6203433448643963476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=6203433448643963476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6203433448643963476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6203433448643963476'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2011/07/white-balance.html' title='White balance'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-JAbvtYvJyvs/TjG_DeXnWYI/AAAAAAAAAJU/rduwHV-IvnU/s72-c/wb1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-3711740105025867167</id><published>2011-07-21T22:53:00.001+02:00</published><updated>2011-07-21T22:57:44.010+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fog'/><title type='text'>Fog and dust</title><content type='html'>In addition to the existing atmospheric model that already accounts for aerosol particles in air, we have been working also on incorporating ground fog and dust. It's defined by several parameters that determine its density, light scattering properties and boundary altitude. Shaders then compute resulting attenuation and scattering of sun light for terrain and objects. The code is similar to the code computing optical properties of water, using different values and omitting the upper reflective layer.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PVwxzhNPWLc/TiiCfgyKtKI/AAAAAAAAAI4/YifsJrvUf98/s1600/fog3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://2.bp.blogspot.com/-PVwxzhNPWLc/TiiCfgyKtKI/AAAAAAAAAI4/YifsJrvUf98/s640/fog3.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-r6ADWneVlMQ/TiiCnUI2NJI/AAAAAAAAAI8/waf46SNmIK0/s1600/fog4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://1.bp.blogspot.com/-r6ADWneVlMQ/TiiCnUI2NJI/AAAAAAAAAI8/waf46SNmIK0/s640/fog4.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-rZoaytQhFr8/TiiCbYA4LBI/AAAAAAAAAI0/pyok2fSWB6k/s1600/fog2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://2.bp.blogspot.com/-rZoaytQhFr8/TiiCbYA4LBI/AAAAAAAAAI0/pyok2fSWB6k/s640/fog2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Viewing valleys of fog from a greater distance, illuminated by evening sun.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TKRd7NYzx5c/TiiCsy4SWiI/AAAAAAAAAJE/tMDm7gQEq-Y/s1600/fog6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://3.bp.blogspot.com/-TKRd7NYzx5c/TiiCsy4SWiI/AAAAAAAAAJE/tMDm7gQEq-Y/s640/fog6.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;When the amount of scattering is lowered, one gets appearance of dust. Also, thicker layers of dust/mist can cast the terrain down below into darkness&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wpUaYz8t8Yo/TiiCrFz6B_I/AAAAAAAAAJA/PQPrDq-TZVo/s1600/fog5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://1.bp.blogspot.com/-wpUaYz8t8Yo/TiiCrFz6B_I/AAAAAAAAAJA/PQPrDq-TZVo/s640/fog5.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There are several things that need to be done yet - currently the fog settings act globally, covering the whole planet in a veil of mist. There's no modulation that would give the fog a nicer, non-uniform look.&lt;br /&gt;&lt;br /&gt;Ultimately, fog (or dust) should appear dynamically according to a probabilistic model that would describe chances of it forming at a given place (climate, precipitation) on the planet in given time of day/year. Or using a real time weather report feed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-3711740105025867167?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/3711740105025867167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=3711740105025867167' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/3711740105025867167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/3711740105025867167'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2011/07/fog-and-dust.html' title='Fog and dust'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-PVwxzhNPWLc/TiiCfgyKtKI/AAAAAAAAAI4/YifsJrvUf98/s72-c/fog3.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-5402867089012354067</id><published>2011-07-13T09:45:00.000+02:00</published><updated>2011-07-13T09:45:18.128+02:00</updated><title type='text'>Alien planet Earth</title><content type='html'>&lt;div class="entry-content"&gt;Rendering our planet "alienized", using a different set of basic materials  for fractal mixer, with changed parameters of atmosphere, sun and water.&lt;br /&gt;&lt;br /&gt;Scattering  of light in the atmosphere determines both the color of sky and  sunsets. We can see a blue sky because the blue light is more likely to  bounce off the air molecules than the green and even more than the red  components of sun light. As the light from sun travels through the  atmosphere above us, some of it gets scattered away from the ray and  towards our eyes. The same effect is responsible for red sunsets - as  the sun sets, light from it has to travel a longer way through a denser  layers of atmosphere. By the time it reaches us, most of the blue and  green light gets scattered away from the ray, leaving only the most  persistent red component.&lt;br /&gt;&lt;br /&gt;This effect is simulated in Outerra, and  so we are able to play with it. What if the atmosphere consisted of  different gases and the scattering characteristic was different?&lt;br /&gt;&lt;br /&gt;In  the following video we are showing planet Earth that was "alienized".  The atmosphere in it scatters the green light best, which you can see  not only on the sky itself but also on the shaded parts that are not  lighted by sun but only by a portion of the sky.&lt;br /&gt;The sun has got an  orange shade, which you can see mainly on the horizon (the sun itself is  too bright so looking at it directly saturates the color to white).&lt;br /&gt;&lt;br /&gt;The  absorption of light in the water has been altered as well - normally,  the red light gets only so far in the water, when it almost entirely  disappears. Here, the medium absorbs the green and blue light instead,  letting the red one to penetrate into depths. Of course, since the water  surface largely reflects the sky at an angle, the ocean appears to be  green in the distance.&lt;br /&gt;&lt;br /&gt;At the end there's also a short sequence with a red-orange atmosphere.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe width="700" height="428" src="http://www.youtube.com/embed/kHz6XkYDhtg?hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Here are some screens showing it under various settings:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/alien/alien1.jpg"&gt;&lt;span class="postimg"&gt;&lt;img alt="http://www.outerra.com/shots/alien/alien1.jpg" height="360" src="http://www.outerra.com/shots/alien/alien1.jpg" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Milk water &amp;amp; yellow skies:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/alien/alien3.jpg"&gt;&lt;span class="postimg"&gt;&lt;img alt="http://www.outerra.com/shots/alien/alien3.jpg" height="360" src="http://www.outerra.com/shots/alien/alien3.jpg" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Violet atmosphere:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/alien/alien4.jpg"&gt;&lt;span class="postimg"&gt;&lt;img alt="http://www.outerra.com/shots/alien/alien4.jpg" height="360" src="http://www.outerra.com/shots/alien/alien4.jpg" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;No atmosphere (or no atmospheric scattering). This is what you'd get for example on the Moon:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="postimg"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="postimg"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/alien/alien5.jpg"&gt;&lt;span class="postimg"&gt;&lt;img alt="http://www.outerra.com/shots/alien/alien5.jpg" height="360" src="http://www.outerra.com/shots/alien/alien5.jpg" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-5402867089012354067?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/5402867089012354067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=5402867089012354067' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5402867089012354067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5402867089012354067'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2011/07/alien-planet-earth.html' title='Alien planet Earth'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/kHz6XkYDhtg/default.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-5028445040134645871</id><published>2011-07-03T11:21:00.000+02:00</published><updated>2011-07-03T11:21:13.108+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='planet rendering'/><title type='text'>Book: 3D Engine Design for Virtual Globes</title><content type='html'>&lt;a href="http://www.virtualglobebook.com/"&gt;3D Engine Design for Virtual Globes&lt;/a&gt; is a &lt;a href="http://www.amazon.com/3D-Engine-Design-Virtual-Globes/dp/1568817118?ie=UTF8&amp;amp;tag=virtua06a-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969"&gt;book&lt;/a&gt; by Patrick Cozzi and Kevin Ring describing the essential techniques and algorithms used for the design of planetary scale 3D engines. It's interesting to note that even though virtual globes gained the popularity a long time ago with software like Google Earth or NASA World Wind, there wasn't any book dealing with this topic until now.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mkKDRBO5nzs/TgXIy6U8KVI/AAAAAAAABXI/bbMt1GlZqLs/s1600/backcover.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-QEA50o1fVfE/TXgH3HJPtqI/AAAAAAAABVI/I5R7nzVnq-c/s400/cover.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-QEA50o1fVfE/TXgH3HJPtqI/AAAAAAAABVI/I5R7nzVnq-c/s320/cover.png" width="260" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/-mkKDRBO5nzs/TgXIy6U8KVI/AAAAAAAABXI/bbMt1GlZqLs/s1600/backcover.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-mkKDRBO5nzs/TgXIy6U8KVI/AAAAAAAABXI/bbMt1GlZqLs/s320/backcover.png" width="216" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As the topic of the book is relevant also for planetary engines like Outerra, I would like to do a short review here. &lt;br /&gt;I have been initially contacted by Patrick to review the chapter about the depth precision, and later he also asked for a permission to include some images from Outerra there. You can check out the sample chapters, for example the &lt;a href="http://www.virtualglobebook.com/3DEngineDesignForVirtualGlobesSection121.pdf"&gt;Level of Detail&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Behind the simple title you'll find almost surprisingly in-depth analysis of techniques essential for the design of virtual globe and planetary-scale 3D engines. After the intro, the book starts with the fundamentals: the basic math apparatus, and the basic building blocks of a modern, hardware friendly 3D renderer. The fundamentals conclude with a chapter about globe rendering, on the ways of tesselating the globe in order to be able to feed it to the renderer, together with appropriate globe texturing and lighting.&lt;br /&gt;&lt;br /&gt;Part II of the book guides you to the area that you cannot afford to neglect if you don't want to hit the wall further along in your design - precision. Regardless of what spatial units you are using, it's the range of detail expressible in floating point values supported by 3D hardware that is limiting you. If you want to achieve both global view on a planet from space, and a ground-level view on it's surface, without handling the precision you'll get jitter as you zoom in and it soon becomes unusable. The book introduces several approaches used to solve these vertex precision issues, each possibly suited for different areas.&lt;br /&gt;&lt;br /&gt;Another precision issue that affects the rendering of large areas is the precision of depth buffer. Because of an old non-ideal hardware design that reuses values from perspective division also for the depth values it writes, depth buffer issues show up even in games with larger outdoor levels. In planetary engines that also want a human scale detail this problem grows beyond the bounds. The chapter on depth buffer precision compares several algorithms that more or less solve this problem, including the algorithm we use in Outerra - &lt;a href="http://outerra.blogspot.com/2009/08/logarithmic-z-buffer.html"&gt;logarithmic depth buffer&lt;/a&gt;. Who knows, maybe one day we'll get a direct hardware support for it, as per &lt;a href="http://tulrich.com/geekstuff/log_depth_buffer.txt"&gt;Thatcher Ulrich's suggestion&lt;/a&gt;, and it becomes a thing of the past.&lt;br /&gt;&lt;br /&gt;Third part of the book concerns with the rendering of vector data in virtual globes, used to render things like country boundaries or rivers, or polygon overlays to highlight areas of interest. It also deals with the rendering of billboards (marks) on terrain, and rendering of text labels on virtual globes.&lt;br /&gt;&lt;br /&gt;The last chapter in this part, &lt;i&gt;Exploiting Parallelism in Resource Preparation&lt;/i&gt;, deals with an important issue popping up in virtual globes: utilizing parallelism in the management of content and resources. Being able to load data on the background, not interfering with the main rendering is one of the crucial requirements here.&lt;br /&gt;&lt;br /&gt;The last part of the book talks about the rendering of massive terrains in hardware friendly manner: about the representation of terrain, preprocessing, level of detail. Two major rendering approaches have their dedicated chapters in the book: geometry clipmapping and chunked LOD, together with a comparison. Of course, the book also comes with a comprehensive list of external resources in each chapter.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We've received many questions from several people that wanted to know how we started programming our engine and what problems we have encountered, or how did we solve this or that. Many of them I can now direct to this book, which really covers the essential stuff one needs to know here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-5028445040134645871?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/5028445040134645871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=5028445040134645871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5028445040134645871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5028445040134645871'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2011/07/book-3d-engine-design-for-virtual.html' title='Book: 3D Engine Design for Virtual Globes'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-QEA50o1fVfE/TXgH3HJPtqI/AAAAAAAABVI/I5R7nzVnq-c/s72-c/cover.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-6740886449721785694</id><published>2011-06-07T20:35:00.001+02:00</published><updated>2011-06-07T20:35:58.265+02:00</updated><title type='text'>Podcast about Outerra</title><content type='html'>I've never been much of a speaker, not in my native language and even less so in English. When Markus Völter, the man behind &lt;a href="http://www.se-radio.net/"&gt;SE Radio&lt;/a&gt; and &lt;a href="http://www.omegataupodcast.net/"&gt;omega tau&lt;/a&gt; podcasts, contacted me to make a podcast about Outerra and some of the technology behind it, I initially hesitated. But then I decided that it cannot hurt, and that I must force myself to train my tongue a bit.&lt;br /&gt;&lt;br /&gt;So, after some time we recorded a hour long interview and you can listen to it here:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://omegataupodcast.net/2011/06/67-rendering-the-world-with-outerra" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://omegataupodcast.net/wp-content/themes/wp-andreas01/img/wt.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://omegataupodcast.net/2011/06/67-rendering-the-world-with-outerra"&gt;omegataupodcast.net/2011/06/67-rendering-the-world-with-outerra&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Beware that I'm really slow speaker with pretty monotonous voice, and together with the technical nature it's probably not consumable for everyone. Enjoy if you can :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-6740886449721785694?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/6740886449721785694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=6740886449721785694' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6740886449721785694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6740886449721785694'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2011/06/podcast-about-outerra.html' title='Podcast about Outerra'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-4814460777744370225</id><published>2011-05-09T21:24:00.000+02:00</published><updated>2011-05-09T21:24:13.671+02:00</updated><title type='text'>Bumpy grass effect</title><content type='html'>Some time ago when I was modifying how dirt roads are being generated, to achieve their better integration into the terrain, I noticed that after one operation the grass close to the dirt tracks got a bumpy look, that had a potential in it to produce a better looking low grass fields.&lt;br /&gt;&lt;br /&gt;Recently I have got to those code corners again and decided to play with it more. It's using fractal channels to generate the bumps, subjecting it to several treatments - the effect being smaller on some types of grass, and also changing together with modulating colors.&lt;br /&gt;Here's the result:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-J7pghQul-0g/Tcg1_Jau3HI/AAAAAAAAAGs/z4xl42P48KY/s1600/grass1n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://3.bp.blogspot.com/-J7pghQul-0g/Tcg1_Jau3HI/AAAAAAAAAGs/z4xl42P48KY/s640/grass1n.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For comparison, here's how the same scene looked until recently:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-PjgzcrldqyA/Tcg2Ei0BzUI/AAAAAAAAAGw/scsszsT-yes/s1600/grass1o.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://1.bp.blogspot.com/-PjgzcrldqyA/Tcg2Ei0BzUI/AAAAAAAAAGw/scsszsT-yes/s640/grass1o.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The effect is most visible when the sun is lower, it's achieved just by normal lighting. It should be probably combined with another effect that will make it more attractive during noons - shades from grass blades, visible from the side.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-OO191TQ72rM/Tcg2FIwip4I/AAAAAAAAAG0/tIJnJHhzdrY/s1600/grass2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://1.bp.blogspot.com/-OO191TQ72rM/Tcg2FIwip4I/AAAAAAAAAG0/tIJnJHhzdrY/s640/grass2.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Of course, an important thing will be to combine it with real 3D blades smoothly appearing up close, and to apply the effect on other types of vegetation visible at distance.&lt;br /&gt;&lt;br /&gt;A short video showing the thing in motion:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;iframe width="732" height="446" src="http://www.youtube.com/embed/d-ghwgcYeVA?hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-4814460777744370225?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/4814460777744370225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=4814460777744370225' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/4814460777744370225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/4814460777744370225'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2011/05/bumpy-grass-effect.html' title='Bumpy grass effect'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-J7pghQul-0g/Tcg1_Jau3HI/AAAAAAAAAGs/z4xl42P48KY/s72-c/grass1n.jpg' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-1775754730491475120</id><published>2011-04-14T09:56:00.003+02:00</published><updated>2011-04-14T10:04:18.231+02:00</updated><title type='text'>A comparison of the old and new datasets</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;Here's the promised comparison between the old and new data. Despite the base terrain resolution being the same in both cases (3" or roughly 90m spacing), the new dataset comes with much better erosion shapes that were previously rather washed out.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The new data come from multiple sources, mainly the original SRTM data and data from Viewfinder Panoramas that provide enhanced data for Eurasia. It appears that the old data were somehow blurred, and fractal algorithms that refine the terrain down didn't like it.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The difference shows best in Himalayas - the screens below are from there, starting with Mt.Everest.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="color: #cc0000;"&gt;&amp;nbsp;old &amp;nbsp; |&amp;nbsp;&amp;nbsp; new&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-eso06i6mvr4/TaYF1IJgmpI/AAAAAAAAAGQ/1rmip-Kbpfs/s1600/datacomp1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://2.bp.blogspot.com/-eso06i6mvr4/TaYF1IJgmpI/AAAAAAAAAGQ/1rmip-Kbpfs/s640/datacomp1.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-gK8rI3t5SPU/TaYF2GcSdMI/AAAAAAAAAGY/OpPj8x12TTw/s1600/datacomp3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://3.bp.blogspot.com/-gK8rI3t5SPU/TaYF2GcSdMI/AAAAAAAAAGY/OpPj8x12TTw/s640/datacomp3.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-WjLmkahcByk/TaYF2zk0OKI/AAAAAAAAAGc/9XQkNyno0qs/s1600/datacomp4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://4.bp.blogspot.com/-WjLmkahcByk/TaYF2zk0OKI/AAAAAAAAAGc/9XQkNyno0qs/s640/datacomp4.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-cKTfXMnJI9w/TaYF3QqXZvI/AAAAAAAAAGg/o1shCxseQ2k/s1600/datacomp5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://4.bp.blogspot.com/-cKTfXMnJI9w/TaYF3QqXZvI/AAAAAAAAAGg/o1shCxseQ2k/s640/datacomp5.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;There are also finer, 1" (~30m) resolution data for some mountainous areas of the world, and we plan to test these too - interested to see how it affects the size and changes the look.&lt;br /&gt;&lt;br /&gt;→ &lt;a href="http://www.outerra.com/forum/viewtopic.php?pid=3602"&gt;forum link &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-1775754730491475120?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/1775754730491475120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=1775754730491475120' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1775754730491475120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1775754730491475120'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2011/04/comparison-of-old-and-new-datasets.html' title='A comparison of the old and new datasets'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-eso06i6mvr4/TaYF1IJgmpI/AAAAAAAAAGQ/1rmip-Kbpfs/s72-c/datacomp1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-6432177450858817556</id><published>2011-04-13T18:57:00.001+02:00</published><updated>2011-04-13T18:58:20.018+02:00</updated><title type='text'>A new terrain mapper tool</title><content type='html'>Our old terrain mapping and compression tool has been recently replaced by a new one, developed from scratch. The old tool has been the only piece that was not done completely by us (core Outerra people), and as the result it felt somewhat "detached" and not entirely designed in line with our concepts. It was quite slow and contained several bugs that caused artifacts mainly in coastal regions.&lt;br /&gt;&lt;br /&gt;What's going on with the tool? Its purpose is to convert terrain data from usual WGS84 projection into a variant of &lt;a href="http://en.wikipedia.org/wiki/Quadrilateralized_spherical_cube"&gt;quadrilateralized spherical cube&lt;/a&gt; projection we are using, along with wavelet-based compression of the data during the process. It takes ~70GB of raw data and processes them into a 14GB datased usable in Outerra, endowing it with ability to be streamed effectively and to provide the needed level of detail.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_5w1pA4uFBM/TaXGviHjy2I/AAAAAAAAAF0/FxRRz3AcCHg/s1600/mapping.jpg"&gt;&lt;img border="0" height="360" src="http://1.bp.blogspot.com/-_5w1pA4uFBM/TaXGviHjy2I/AAAAAAAAAF0/FxRRz3AcCHg/s640/mapping.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;With the aforementioned defects in mind, and with the need to compile a new dataset with a better detail for northern regions above 60° latitude, we've decided to rework the tool, in order to speed it up and to extend the functionality as well.&lt;br /&gt;&lt;br /&gt;I originally planned to implement it using CUDA or OpenCL, but after analyzing it deeper I decided to make it a part of the engine, using OpenGL 3.x shaders for the processing. This will allow for creating an integrated and interactive planet or terrain creator tool later, which is worth it in itself.&lt;br /&gt;&lt;br /&gt;The results are surprisingly good. For comparison: to process the data for whole Earth, the old CPU-only tool needed to run continuously for one week (!) on a 4-core processor. The same thing now takes just one hour, using a single CPU core for preparing the data and running bitplane compressor, and a GTX 460 GPU for mapping and computation of wavelet coefficients. In fact the new tool is processing more data, as there are also the northern parts of Scandinavia, Russia and more included in the new dataset.&lt;br /&gt;&lt;br /&gt;All in all it represents roughly a &lt;b&gt;200X&lt;/b&gt; speedup, which is way more than we expected and hoped for. Although GPU processing plays a significant role in it, without the other improvements it would show much less. The old tool was often bound on I/O transfers - it synchronously processed and streamed the data. The new one does things asynchronously, additionally it now reads the source data directly in packed form, saving the disk I/O bandwidth - it can do the unpacking without losing time because the main load has been moved from CPU to GPU. Another thing that attributed to the speedup is a much better caching mechanism that plays nicely with the GPU job.&lt;br /&gt;&lt;br /&gt;There's another interesting piece used in the new tool - unlike the old one, this traverses the terrain using adaptive Hilbert curves.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-iWT7034MSrw/TaXSpWJ_zVI/AAAAAAAAAF4/otMWvxSNnyU/s1600/hilbert.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-iWT7034MSrw/TaXSpWJ_zVI/AAAAAAAAAF4/otMWvxSNnyU/s1600/hilbert.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://en.wikipedia.org/wiki/Hilbert_curve"&gt;Hilbert curve&lt;/a&gt; is a continuous fractal space-filling curve that has an interesting property - despite being just a line, it can fill a whole enclosed 2D area. Space-filling curves were discovered&lt;span style="font-family: inherit;"&gt; after mathematician Georg Cantor found &lt;/span&gt;&lt;span style="font-family: inherit;"&gt;out that an infinite number of points in a unit interval has the same cardinality as infinite number of points in a any finitely dimensional enclosed surface (manifold). In other words that there is a 1:1 mapping from points on a line segment into the points of a 2D rectangle.&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;These functions belong to our beloved family of functions - fractals.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the mapping tool it's being used in the form of a hierarchical recursive &amp;amp; adaptive Hilbert curve. While any recursive quad-tree traversal method would work effectively, Hilbert curve was used because it preserves locality better (which has a positive effect on cache management), and because it is cool :)&lt;br /&gt;Here is a video showing it in action - the tool shows the progress of data processing on the map:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/ZOgZByQyNFk?hd=1" title="YouTube video player" width="640"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Apart from the speedup, the new dataset compiled with the tool is also smaller - the size fell down by 2GB to ~12GB, despite containing more detailed terrain for all parts of the world.&lt;br /&gt;&lt;br /&gt;I'm not complaining, but I'm not entirely sure why is that. There was one minor optimization in wavelet encoding that can't explain it. The main suspect is that the old tool was encoding wide coastal areas with higher resolution than actually needed. &lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;***&lt;/div&gt;&lt;br /&gt;Coming next - a comparison of new and old datasets. Apart from providing a more consistent terrain detail for whole world, the new dataset also comes with enhanced mountain shapes in several places.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-6432177450858817556?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/6432177450858817556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=6432177450858817556' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6432177450858817556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6432177450858817556'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2011/04/new-terrain-mapper-tool.html' title='A new terrain mapper tool'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-_5w1pA4uFBM/TaXGviHjy2I/AAAAAAAAAF0/FxRRz3AcCHg/s72-c/mapping.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-7471056896881857059</id><published>2011-02-18T14:19:00.003+01:00</published><updated>2011-02-18T17:43:10.810+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='water'/><title type='text'>Ocean Rendering</title><content type='html'>Let me first say that I'm often visiting my own blog to read how I did certain things. This is mostly true for some of the older, more technical posts. I decided to blog about recent water rendering development in a way that will be helpful for me in time when my brain niftily sends all the crucial bits to desert. I apologize in advance if some pieces seem incoherent.&lt;br /&gt;&lt;br /&gt;Now for the rendering of water in Outerra.&lt;br /&gt;&lt;br /&gt;There are two types of waves mixed - open sea waves with the direction of wind (fixed for now), and shore waves  (the surf) that orient themselves perpendicularly to the shore, appearing as the result of oscillating water volume that gets compressed with rising underwater terrain.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Open sea waves&lt;/b&gt; are simulated in a usual way by summing a bunch of &lt;a href="http://hyperphysics.phy-astr.gsu.edu/hbase/waves/watwav2.html"&gt;trochoidal&lt;/a&gt; (Gerstner) waves with various frequencies over a 2D texture that is then tiled over the sea surface. Obviously, the texture should be seamlessly tileable, and that puts some constraints on possible frequencies of the waves. Basically, the wave should peak on each point of the grid. This can be satisfied by guaranteeing that the wave has an integral number of peaks in both u,v texture directions. Resulting wave frequency is then &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-4qHFlEf3_a0/TV04kJ6oXYI/AAAAAAAAAE0/135vkD9WzSQ/s1600/f05503985bb8320e11d98f8dd797e21c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-4qHFlEf3_a0/TV04kJ6oXYI/AAAAAAAAAE0/135vkD9WzSQ/s1600/f05503985bb8320e11d98f8dd797e21c.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Other wave parameters depend on the frequency (or its reciprocal, the wavelength). Generally, wave amplitude should be kept below 1/20th of wave length, as larger ones would break.&lt;br /&gt;Wave speed for deep waves can be computed using the wavelength λ as:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-YuOpGJ_Z6Bc/TV0_Je4LWtI/AAAAAAAAAE8/eAfID5i7tQE/s1600/0faad608688cd6f019ff5951f416138b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-YuOpGJ_Z6Bc/TV0_Je4LWtI/AAAAAAAAAE8/eAfID5i7tQE/s1600/0faad608688cd6f019ff5951f416138b.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;Direction of waves can be determined by manipulating the amplitudes of generated wave, for example the directions that lie closer to the direction of wind can have larger amplitudes than the ones flowing in opposite direction. The opposite wave directions can be even suppressed completely, which may be usable e.g. for rivers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Shore waves&lt;/b&gt; form as the terrain rises and water slows down, while the wave amplitude rises. These waves tend to be perpendicular to shore lines.&lt;br /&gt;&lt;br /&gt;In order to make the beach waves we need to know the distance from particular point in water to shore. Additionally, a direction vector is needed to animate the foam.&lt;br /&gt;&lt;br /&gt;Distance from shore is used as an argument to wave shape function, stored in a texture. This shape is again trochoidal, but to simulate a breaking wave the equation has been extended to a &lt;i&gt;skewed trochodial&lt;/i&gt; wave by adding another parameter determining the skew. Here's how it affects the wave shape:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-JgtSygJ9i0k/TV13w2tPXUI/AAAAAAAAAFw/T77xJGYLuC4/s1600/trochoid2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-JgtSygJ9i0k/TV13w2tPXUI/AAAAAAAAAFw/T77xJGYLuC4/s1600/trochoid2.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_cJAPxrJq0c/TV13CX7mboI/AAAAAAAAAFs/sdVr--UyC7s/s1600/trochoid1.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;The equation for skewed trochoidal wave is:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ma_CznZ-7IU/TV1V0ARpw_I/AAAAAAAAAFM/tjKKxgPihm8/s1600/f5e240da7fb66c93138600de56c62cae.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ma_CznZ-7IU/TV1V0ARpw_I/AAAAAAAAAFM/tjKKxgPihm8/s1600/f5e240da7fb66c93138600de56c62cae.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-T1OuaTh4Gbo/TV1WGizqcQI/AAAAAAAAAFU/fvte-nrp5W8/s1600/348b7112cd5edae5087ee6ff219274e5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-T1OuaTh4Gbo/TV1WGizqcQI/AAAAAAAAAFU/fvte-nrp5W8/s1600/348b7112cd5edae5087ee6ff219274e5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Skew &lt;span style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;γ&lt;/span&gt;=1 gives a normal Gerstner wave.&lt;br /&gt;Several differently skewed waves are precomputed in a small helper texture, and the algorithm chooses the right one depending on water depth.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Y5kjPKQJprk/TV1vYYxRvGI/AAAAAAAAAFY/nKrqY_wGtEU/s1600/shore.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="155" src="http://4.bp.blogspot.com/-Y5kjPKQJprk/TV1vYYxRvGI/AAAAAAAAAFY/nKrqY_wGtEU/s640/shore.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Distance map is computed for terrain tiles that contain a shore, i.e. those with maximum elevation above sea level and minimum elevation below it. Shader finds the nearest point of opposite type (above or below sea level) and outputs the distance. Resulting distance map is filtered to smooth it out.&lt;br /&gt;Gradient vectors are computed by applying Sobel filter on the distance map.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3ydjMhwgpmQ/TVvchxN8LjI/AAAAAAAAAEg/XRAu1ClO_-o/s1600/gradient-f.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3ydjMhwgpmQ/TVvchxN8LjI/AAAAAAAAAEg/XRAu1ClO_-o/s1600/gradient-f.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="225" src="http://4.bp.blogspot.com/-3ydjMhwgpmQ/TVvchxN8LjI/AAAAAAAAAEg/XRAu1ClO_-o/s400/gradient-f.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Gradient field created from Gaussian filtered distance map&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Both wave types are then added together. The beach waves are conditioned using another texture with mask changing in time so that they aren't continual all around the shore.&lt;br /&gt;&lt;br /&gt;Water color is determined by several indirect parameters, most importantly by the absorption of color components under the water. For most of the screen shots shown here it was set to values of 7/30/70m for RGB colors, respectively. These values specify the distances at which the respective light components get reduced to approximately one third of their original value. &lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-U45V0ub9CNA/TV0LnSrjYNI/AAAAAAAAAEo/4riE7itmIWg/s1600/water-r7g30b70.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="http://2.bp.blogspot.com/-U45V0ub9CNA/TV0LnSrjYNI/AAAAAAAAAEo/4riE7itmIWg/s320/water-r7g30b70.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-yAH0wxDIBgc/TV0Ln5UIz1I/AAAAAAAAAEs/SJSHUuhPhiE/s1600/water-r70g30b7.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="http://1.bp.blogspot.com/-yAH0wxDIBgc/TV0Ln5UIz1I/AAAAAAAAAEs/SJSHUuhPhiE/s320/water-r70g30b7.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Red: 7m, Green: 30m, Blue: 70m, Scattering coefficient: 0.005&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Red: 70m, Green: 30m, Blue: 7m&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Another parameter is a reflectivity coefficient that tells how much light is scattered towards the viewer. Interestingly, scattering effect in pure water is negligible in comparison with the effect of light absorption. Main contributor to the observed scattering effect is dissolved organic matter, followed by inorganic compounds. This also gives seas slightly different colors.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-bC6LYjVKipk/TV108q_PD4I/AAAAAAAAAFc/pbOlgMdQrDI/s1600/water-refl000.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="http://2.bp.blogspot.com/-bC6LYjVKipk/TV108q_PD4I/AAAAAAAAAFc/pbOlgMdQrDI/s320/water-refl000.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-txJthSXCdu8/TV109OGzNAI/AAAAAAAAAFg/OSZ0fIxZ5Sc/s1600/water-refl020.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="http://1.bp.blogspot.com/-txJthSXCdu8/TV109OGzNAI/AAAAAAAAAFg/OSZ0fIxZ5Sc/s320/water-refl020.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Scattering coefficient: 0.000&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Scattering coefficient: 0.020&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Here's a short video showing it all in motion.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/s3ou65tURHw" title="YouTube video player" width="640"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;An earlier video that was posted on the forums with underwater scenes:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/6KhFBES0o0g" title="YouTube video player" width="640"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;b&gt;TODO&lt;/b&gt;&lt;br /&gt;Water rendering is not yet finished, this should be considered a first version. Here's a list of things that will be enhanced:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Better effect for wave breaking. This will probably require additional geometry, maybe a tesselation shader could be used for that.&lt;/li&gt;&lt;li&gt;Animated foam&lt;/li&gt;&lt;li&gt;Enhanced wave spectrum - currently the spectrum is flat, which doesn't correspond to reality. Wave frequencies could be even generated adaptively, reflecting the detail needed for the viewer.&lt;/li&gt;&lt;li&gt;Fixing various errors - underwater lighting, waves against the horizon, lighting of objects on and under the water, LOD level switching ...&lt;/li&gt;&lt;li&gt;Support for other types of wave breaking&lt;/li&gt;&lt;li&gt;Integrating climate type support to the engine, that will allow different sea parameters across the world&lt;/li&gt;&lt;li&gt;UI for setting water parameters &lt;/li&gt;&lt;li&gt;Reflect the waves in physics for boats&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;A few of &lt;a href="http://www.outerra.com/forum/viewtopic.php?id=267"&gt;ocean sunset&lt;/a&gt; and &lt;a href="http://www.outerra.com/forum/viewtopic.php?id=243"&gt;underwater&lt;/a&gt; screenshots that were posted on the forums during the development.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://twitter.com/outerra"&gt;&lt;img src="http://www.outerra.com/images/icon-tw.png" style="vertical-align: top;" /&gt;Outerra on Twitter&lt;/a&gt; &amp;nbsp; &lt;a href="http://www.facebook.com/outerra"&gt;&lt;img src="http://www.outerra.com/images/icon-fb.png" style="vertical-align: top;" /&gt;Outerra on Facebook&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-7471056896881857059?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/7471056896881857059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=7471056896881857059' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7471056896881857059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7471056896881857059'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2011/02/ocean-rendering.html' title='Ocean Rendering'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-4qHFlEf3_a0/TV04kJ6oXYI/AAAAAAAAAE0/135vkD9WzSQ/s72-c/f05503985bb8320e11d98f8dd797e21c.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-3969012022839962782</id><published>2010-12-26T20:35:00.001+01:00</published><updated>2010-12-26T21:50:02.925+01:00</updated><title type='text'>Outerra Year 2010 Retrospective</title><content type='html'>Our friend from Texas, artist and science-fiction writer born under nickname of &lt;a href="http://www.outerra.com/forum/viewtopic.php?pid=1941#p1941"&gt;C. Shawn Smith&lt;/a&gt;, made this nice compilation from pieces of our published and some unpublished videos created during the year 2010.&lt;br /&gt;&lt;br /&gt;Outerra 2010 Retrospective&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SeoT_cz2nC0?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/SeoT_cz2nC0?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Thanks Shawn, and happy New Year to all our fans and supporters all around the world!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://twitter.com/outerra"&gt;&lt;img src="http://www.outerra.com/images/icon-tw.png" style="vertical-align: top;" /&gt;Outerra on Twitter&lt;/a&gt; &amp;nbsp; &lt;a href="http://www.facebook.com/outerra"&gt;&lt;img src="http://www.outerra.com/images/icon-fb.png" style="vertical-align: top;" /&gt;Outerra on Facebook&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-3969012022839962782?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/3969012022839962782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=3969012022839962782' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/3969012022839962782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/3969012022839962782'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/12/outerra-year-2010-retrospective.html' title='Outerra Year 2010 Retrospective'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-3402949965859879540</id><published>2010-12-15T17:40:00.001+01:00</published><updated>2010-12-15T17:50:13.951+01:00</updated><title type='text'>Aeroworks and Outerra</title><content type='html'>This blog post will be about our recent visit of &lt;a href="http://merlin.fit.vutbr.cz/AeroWorks/"&gt;AeroWorks&lt;/a&gt; team at&amp;nbsp;Brno University of Technology in Brno, Czech Republic. These guys are working on SimStar project, a light aircraft simulator based on the cockpit section of Evektor SportStar aircraft.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://merlin.fit.vutbr.cz/AeroWorks/concept.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="225" src="http://merlin.fit.vutbr.cz/AeroWorks/concept.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Presentation photo, the space is actually jammed with stuff as anyone would expect&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;They were interested to use Outerra as one of the image generators that could be plugged in. We liked that idea as well, so ultimately we packed our stuff and went on a trip to Brno, which is just some 125km from our HQ in Bratislava. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;The project is being led by Peter Chudy who is coaching a few enthusiastic students working on related diploma theses with goal of enhancing the simulator. He is also ensuring that everything in this unique academic project goes right, undertaking all the necessary chores and dealing with all companies that might help to advance it. Peter is quite dedicated kind of guy who constantly fires jokes intermixed with questions caring whether we like the project. Nevertheless, or maybe thanks to that, he was nicknamed "Mr.Horrible", not just for forcing people to take off their shoes &lt;img src="http://www.outerra.com/forum/img/smilies/smile.png" style="vertical-align: middle;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_BoU4btzqsCY/TQjLZAAgmzI/AAAAAAAAAEI/kXZ-rmw1-ck/s1600/aeroworks4.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="480" src="http://1.bp.blogspot.com/_BoU4btzqsCY/TQjLZAAgmzI/AAAAAAAAAEI/kXZ-rmw1-ck/s640/aeroworks4.jpg" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Mr.Horrible ready to take off in Outerra&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_BoU4btzqsCY/TQjLYfW8G-I/AAAAAAAAAEE/-tMmZTbzhAg/s1600/aeroworks3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/_BoU4btzqsCY/TQjLYfW8G-I/AAAAAAAAAEE/-tMmZTbzhAg/s640/aeroworks3.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_BoU4btzqsCY/TQjG59rWU5I/AAAAAAAAADo/JP9XY8nfQkc/s1600/aeroworks1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="480" src="http://1.bp.blogspot.com/_BoU4btzqsCY/TQjG59rWU5I/AAAAAAAAADo/JP9XY8nfQkc/s640/aeroworks1.jpg" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Approaching Airport2. Displays are not yet interconnected with Outerra, but otherwise they function just fine.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;There were some issues with joystick detection and behavior, and we had to fix the blocking ones directly in place to be able to test the simulator. We still have to adjust the profiles for individual axes to get a more realistic behavior.&lt;br /&gt;&lt;br /&gt;The canvas has resolution of 1024x768 pixels which is quite low, the overall feeling will be even better when the projector is upgraded.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;Here's also a video montage of initial testing with Outerra as a visualizer. Because of the joystick issues the aircraft control was very clunky. But as a first test it was overall success, all the issues will be dealt with in coming time.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2P-AOlhlG98?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2P-AOlhlG98?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;For further steps we'll need to design a protocol for interconnecting all the components of the simulation, or to find a standard one that will suit our respective needs. One of the possibilities is &lt;a href="http://cigi.sourceforge.net/"&gt;CIGI&lt;/a&gt; from Boeing, but its design is somewhat old and doesn't entirely fit our architecture. If anyone knows about other possible standards that we might consider for the job, please let us know.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/forum/viewtopic.php?pid=2002#p2002"&gt;Forum topic&lt;/a&gt; for discussion.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://twitter.com/outerra"&gt;&lt;img src="http://www.outerra.com/images/icon-tw.png" style="vertical-align: top;" /&gt;Outerra on Twitter&lt;/a&gt; &amp;nbsp; &lt;a href="http://www.facebook.com/outerra"&gt;&lt;img src="http://www.outerra.com/images/icon-fb.png" style="vertical-align: top;" /&gt;Outerra on Facebook&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-3402949965859879540?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/3402949965859879540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=3402949965859879540' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/3402949965859879540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/3402949965859879540'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/12/aeroworks-and-outerra.html' title='Aeroworks and Outerra'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_BoU4btzqsCY/TQjLZAAgmzI/AAAAAAAAAEI/kXZ-rmw1-ck/s72-c/aeroworks4.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-5938567295593981241</id><published>2010-12-08T21:02:00.001+01:00</published><updated>2010-12-08T21:06:56.343+01:00</updated><title type='text'>IITSEC, ISS and DDG-96</title><content type='html'>&lt;a href="http://www.iitsec.org/"&gt;I/ITSEC&lt;/a&gt;, the world's largest modeling, simulation and training conference this year took place in Orlando. Although we weren't exhibiting, we still had a representation there. Packed with Alienware M11 notebook and a bunch of brochures, our friend and US partner Robert Francis was having several meetings with the attending companies, teasing everybody in range with images and videos.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_BoU4btzqsCY/TP_h23z2QlI/AAAAAAAAADk/RsAXkFMZOjU/s1600/iitsec2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_BoU4btzqsCY/TP_h23z2QlI/AAAAAAAAADk/RsAXkFMZOjU/s1600/iitsec2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;He was showing some of our older videos, as well as some newer ones with ISS space station and alpha version of ocean rendering. Even though the ISS model was using only default materials and wasn't quite finished, it's been a great hit - together with descending to earth surface it showed the scale of the world nicely. After showing the videos he ran the demo version on the laptop to prove the thing's real.&lt;br /&gt;&lt;br /&gt;Robert is saying:&lt;i&gt; The reaction received was extremely positive. Many times when demoing to one  person they would call their team members over excitedly so they could see the  demo. Several groups said that they would meet as a team to discuss options with  us and would be contacting us soon.&lt;/i&gt;&lt;br /&gt;&lt;div class="msg Nth"&gt;&lt;br /&gt;Here's one of the videos with ISS, descending down to a bay with docked USS Bainbridge ship. Don't mind the bugs visible on the water - they have been fixed already for the presentation.&lt;br /&gt;A blog about the new features in engine will be coming soon.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/HmeiXEm9hFY?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/HmeiXEm9hFY?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We've also modernized our communication channels, creating a &lt;a href="http://www.facebook.com/pages/Outerra/146954542022168?v=wall"&gt;Facebook&lt;/a&gt; page. Now you can also follow us on &lt;a href="http://twitter.com/outerra"&gt;Twitter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2Fpages%2FOuterra%2F146954542022168&amp;amp;width=200&amp;amp;colorscheme=light&amp;amp;connections=0&amp;amp;stream=false&amp;amp;header=false&amp;amp;height=62" style="border: medium none; height: 62px; overflow: hidden; width: 200px;"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;div class="extlink"&gt;&lt;a href="http://twitter.com/outerra"&gt;&lt;img src="http://www.outerra.com/logotwbx.png" /&gt;&lt;div&gt;&lt;span class="bname"&gt;Outerra&lt;/span&gt; on Twitter&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-5938567295593981241?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/5938567295593981241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=5938567295593981241' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5938567295593981241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5938567295593981241'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/12/iitsec-iss-and-ddg-96.html' title='IITSEC, ISS and DDG-96'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_BoU4btzqsCY/TP_h23z2QlI/AAAAAAAAADk/RsAXkFMZOjU/s72-c/iitsec2.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-622124579092050117</id><published>2010-10-31T21:48:00.001+01:00</published><updated>2011-02-18T17:42:13.948+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='planet rendering'/><title type='text'>Speed of Light</title><content type='html'>We've had this idea some time ago - to experience how fast the speed of light &lt;i&gt;actually&lt;/i&gt; is by flying away from the planet in Outerra at that speed. Now I've made a short video showing exactly that - flying away from the surface to space, and then returning back (but overshooting past it).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/MImRSkqV-Go?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/MImRSkqV-Go?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;And while the speed is indeed great, one can feel that's also terribly slow when considering the extents of space ..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-622124579092050117?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/622124579092050117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=622124579092050117' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/622124579092050117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/622124579092050117'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/10/speed-of-light.html' title='Speed of Light'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-8226013044215568345</id><published>2010-10-30T19:54:00.003+02:00</published><updated>2010-10-31T11:15:28.179+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='helicopter'/><category scheme='http://www.blogger.com/atom/ns#' term='fractal terrain'/><category scheme='http://www.blogger.com/atom/ns#' term='flight simulator'/><title type='text'>Apache helicopter</title><content type='html'>Here comes another video, this time with Apache AH-64 helicopter or two in it.We went to add a helicopter after the support for them has been recently added to &lt;a href="http://www.jsbsim.org/"&gt;JSBSim&lt;/a&gt; library. There still seem to be some bugs and our parameters for the model aren't entirely right either, so the behavior might not be absolutely correct.&lt;br /&gt;&lt;br /&gt;Still, flying the helicopter is a great fun. I wasn't able to fly helicopter in a simulator before, probably just because I never tried hard enough. But flying it here - over the forests and through the canyons and close to the rocky walls - that gives it a completely different feeling and experience, so even the types of me can get easily lost in time while wandering over the unknown lands here.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/FwtKHbl0pjs?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/FwtKHbl0pjs?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;In case you are wondering, the camera comes out from the Hydra rocket launcher at the beginning of the video, made possible thanks to the use of &lt;a href="http://outerra.blogspot.com/2009/08/logarithmic-z-buffer.html"&gt;logarithmic depth buffer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In order to make this video we added support for "translucent" shadows so that the shadows from rotor blades look more natural, the hard shadows were quite disturbing.&lt;br /&gt;&lt;br /&gt;Since the last blog update a number of things has been worked on - an updated atmospheric rendering code resulting in nicer and faster atmosphere rendering, while being also more consistent in various settings. There should be a separate and more technically oriented post about that for people who are fighting with atmospheric scattering which is quite hard to get right. And of course I need to write something about it so I can find how it works later when it drops off of my brain completely again.&lt;br /&gt;&lt;br /&gt;As a part of the atmospheric code also the ambient light has been tweaked so the shaded and shadowed terrain is now looking better; this shows best on the features of rocks - previously it didn't have the right amount of contrast and looked quite bland.&lt;br /&gt;&lt;br /&gt;Another batch of work done concentrated on GPU memory consumption optimizations; large terrains are quite demanding in this regard so an effective management of it is essential. We managed to save bits of memory here and there by employing various hacks and different formats, which totaled to hundreds of megabytes in the end. But while someone had to effort and tweak the system to save the megabytes, someone else just had to delete that dummy 80MB buffer that was sitting there :-)&lt;br /&gt;&lt;br /&gt;Lastly, here are some screenshots with the helicopters:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_BoU4btzqsCY/TMxaGwQwjFI/AAAAAAAAADE/eReed5CDP0Q/s1600/apache1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://2.bp.blogspot.com/_BoU4btzqsCY/TMxaGwQwjFI/AAAAAAAAADE/eReed5CDP0Q/s640/apache1.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_BoU4btzqsCY/TMxaHfdDMeI/AAAAAAAAADI/5LBzO8xe54c/s1600/apache2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://3.bp.blogspot.com/_BoU4btzqsCY/TMxaHfdDMeI/AAAAAAAAADI/5LBzO8xe54c/s640/apache2.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_BoU4btzqsCY/TMxaIBuBcYI/AAAAAAAAADM/waAkgsHhvWc/s1600/apache3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://4.bp.blogspot.com/_BoU4btzqsCY/TMxaIBuBcYI/AAAAAAAAADM/waAkgsHhvWc/s640/apache3.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_BoU4btzqsCY/TMxaI29pziI/AAAAAAAAADQ/Heo9C8CDOm0/s1600/apache4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://2.bp.blogspot.com/_BoU4btzqsCY/TMxaI29pziI/AAAAAAAAADQ/Heo9C8CDOm0/s640/apache4.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_BoU4btzqsCY/TMxaJq_GB_I/AAAAAAAAADU/vipIY3vHrLY/s1600/apache5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://4.bp.blogspot.com/_BoU4btzqsCY/TMxaJq_GB_I/AAAAAAAAADU/vipIY3vHrLY/s640/apache5.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/tracker.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/tracker.png" /&gt;&lt;/a&gt;&lt;/div&gt;Forum topic - &lt;a href="http://www.outerra.com/forum/viewtopic.php?id=156"&gt;Apache helicopter&lt;/a&gt;.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-8226013044215568345?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/8226013044215568345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=8226013044215568345' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/8226013044215568345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/8226013044215568345'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/10/apache-helicopter.html' title='Apache helicopter'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BoU4btzqsCY/TMxaGwQwjFI/AAAAAAAAADE/eReed5CDP0Q/s72-c/apache1.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-836947519291796230</id><published>2010-09-26T19:31:00.000+02:00</published><updated>2010-09-26T19:31:45.720+02:00</updated><title type='text'>Asynchronous Job Scheduler</title><content type='html'>Today's blog will be again more technical, speaking about some of the internal engine components.&lt;br /&gt;&lt;br /&gt;One of the essential components is an asynchronous job scheduler, named simply &lt;i&gt;jobmaster&lt;/i&gt; in the engine. Its task is to execute jobs that have to be carried out asynchronously because they contain code that usually blocks while waiting for disk I/O or network operations to complete. This code has to run decoupled from the main application and the renderer threads as it would introduce stuttering.&lt;br /&gt;&lt;br /&gt;However, programming asynchronous routines is not that straightforward as it is with the synchronous ones. Previously we used special job processors that used a fixed number of threads to process jobs, that explicitly handled their state and issued respins to allow running other jobs while waiting for their asynchronous operations to complete.&lt;br /&gt;This was cumbersome to use and consequently we often coded some things as synchronous routines, pushing it to a queue of things to be done "later". As you can guess, many things queued there and we had to think how to make this simpler and more enjoyable.&lt;br /&gt;&lt;br /&gt;Jobmaster came as a solution to this, because it allowed us to write a simple synchronous code to handle things like texture and terrain data loading and downloading terrain data over bittorrent, while still effectively handling multiple jobs in parallel. Another important property is that one can set the number of threads that will run concurrently, adjustable to the number of processor cores available on the system and thus not fighting for the resources unnecessarily.&lt;br /&gt;&lt;br /&gt;Jobmaster keeps a pool of threads that it uses to handle jobs. A thread can be in one of three states - either sleeping when no job is assigned to it, running a job code, or sleeping while waiting for a blocking operation to complete. At any time only the designated maximum number of threads can be running. Other jobs will have to wait until the active jobs terminate or hit a block. In that case the thread looks if there is another job that can continue because its blocking operation completed already, or if there's a free thread that can run another queued job. In any case, the current thread suspends itself afterward, keeping the context of the job's routine.&lt;br /&gt;&lt;br /&gt;A blocker can be also an explicit wait operation for completion of other jobs, usually of the children ones that were spawned from the job previously. Consequently it has to prioritize jobs that are likely to progress because all jobs they are waiting for were completed already.&lt;br /&gt;&lt;br /&gt;The jobmaster is programmed using lock-free queues and pools to maintain its state.&lt;br /&gt;&lt;br /&gt;So far the testing shows this system is much more convenient to use than the previous one, what is probably also its major advantage.&lt;br /&gt;&lt;br /&gt;***&lt;br /&gt;&lt;br /&gt;Another component worth mentioning is the logger/grapher used to identify performance problems and timing issues in jobs and the main threads. The graphs can be fed from custom timers used to measure time durations or amount of resources. They are resizing dynamically to cover the actual range of values.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/graphs.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/graphs.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Graphs are used to point to the problematic component during a  particular activity and as such are mainly complementing the log system,  so there are means of identifying the frame numbers that showed some  erroneous behavior, that are then used to locate more detailed information in the logs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-836947519291796230?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/836947519291796230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=836947519291796230' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/836947519291796230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/836947519291796230'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/09/asynchronous-job-scheduler.html' title='Asynchronous Job Scheduler'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-168460104198796987</id><published>2010-09-21T08:15:00.002+02:00</published><updated>2010-10-31T11:16:44.770+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='roads'/><category scheme='http://www.blogger.com/atom/ns#' term='cessna'/><category scheme='http://www.blogger.com/atom/ns#' term='flight simulator'/><title type='text'>Himalayas - unused footage and failed attempts</title><content type='html'>As we are currently in the midst of reworking and updating several key components of the engine, which is taking time, I pieced this video from unused footage made for the &lt;a href="http://outerra.blogspot.com/2010/08/himalayas-trip.html"&gt;Himalayas trip video&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Shows  mainly the failed attempts to land at Lukla and some other sequences.  The problem with Lukla runway is that the engine of that particular  Cessna has vastly reduced power at that altitude, and cannot propel  itself up the slope. One has to touch down at a higher point, using the  momentum to overcome it. Which of course usually didn't work as imagined &lt;img alt="smile" height="15" src="http://www.outerra.com/forum/img/smilies/smile.png" width="15" /&gt;&lt;br /&gt;&lt;br /&gt;The second half contains many attempts at getting the flyover right; we managed to meet at designated point on like 10th try.&lt;br /&gt;&lt;br /&gt;The video ends with one preserved recording of how we always rushed back to the starting positions to make another attempt in a row of several needed for each scene.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/pMn7_bsqnow?fs=1&amp;amp;hl=en_US&amp;amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/pMn7_bsqnow?fs=1&amp;amp;hl=en_US&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-168460104198796987?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/168460104198796987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=168460104198796987' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/168460104198796987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/168460104198796987'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/09/himalayas-unused-footage-and-failed.html' title='Himalayas - unused footage and failed attempts'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-8151317763708078790</id><published>2010-08-18T14:41:00.002+02:00</published><updated>2010-10-31T11:17:19.553+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='roads'/><category scheme='http://www.blogger.com/atom/ns#' term='cessna'/><category scheme='http://www.blogger.com/atom/ns#' term='flight simulator'/><title type='text'>Himalayas trip</title><content type='html'>Finally here comes the video we promised some time ago, with Lukla airport and more.&lt;br /&gt;The video is quite long, over 13 minutes and that's after some heavy trimming. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/gf8YQ9WSdiw?fs=1&amp;amp;hl=en_US&amp;amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/gf8YQ9WSdiw?fs=1&amp;amp;hl=en_US&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For those not interested in the flying parts, here's just the last part with Tatra trucks:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/a0aZZDK4dMw?fs=1&amp;amp;hl=en_US&amp;amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/a0aZZDK4dMw?fs=1&amp;amp;hl=en_US&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Making of video&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It consumed three music tracks, and it consists of three main parts as well:&lt;br /&gt;- landing at Lukla, a short fly over and then a take off with mountain scenery views&lt;br /&gt;- approaching and landing at a fictional airport built at the edge of Lesser Himalayas&lt;br /&gt;- driving Tatra truck to a log cabin in woods on a nearby hill&lt;br /&gt;&lt;br /&gt;A simple LAN networking was added to make the scenes where two vehicles can be seen moving: two Cessna planes in Lukla, a Cessna flying over the truck in the second part and finally two trucks in the last part.&lt;br /&gt;The network connects up automatically whenever the other machine is reachable. It led to several surprising encounters when we were each just debugging and tuning our code, suddenly seeing the other one go by, like when one was working on the pavements in Lukla and while the other suddenly showed up, training the landing at the airport. It was quite a refreshment during the development.&lt;br /&gt;&lt;br /&gt;Otherwise the making of the video resembled real movie making - each scene was taken several times from various angles, capturing two video streams in each run. There was probably 20 times more material taken than used for the final scene. Not counting those shots where we forgot to adjust sun position chosen for given location.&lt;br /&gt;&lt;br /&gt;The video shows the current state of engine, and given that it's still in an alpha stage there are some noticeable bugs. Bear in mind that we aren't scenery designers so basically everything you see there is programmers art.&lt;br /&gt;&lt;br /&gt;Here are also some images from used locations.&lt;br /&gt;&lt;br /&gt;Lukla &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu09.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu09t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu10t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu07.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu07t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu08.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu08t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Fictional airport &amp;amp; city&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu06.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu06t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu11t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu12.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu12t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Roads &amp;amp; Woods&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu01t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu02t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu05.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu05t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu13t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Woods &amp;amp; Mountains&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu04.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu04t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/lu03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/lu03t.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;Used music:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;Fresh Air / Airports and Hotels / Great Outdoors by ibaudio.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;a href="http://www.freesound.org/samplesViewSingle.php?id=53380"&gt;Meadow ambient sound&lt;/a&gt; by &lt;a href="http://www.freesound.org/usersViewSingle.php?id=407362"&gt;eric5335&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-8151317763708078790?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/8151317763708078790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=8151317763708078790' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/8151317763708078790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/8151317763708078790'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/08/himalayas-trip.html' title='Himalayas trip'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-3338366253210966830</id><published>2010-08-09T22:43:00.001+02:00</published><updated>2010-08-10T12:07:29.755+02:00</updated><title type='text'>Earth Fly-by</title><content type='html'>A video of Earth fly-by, with head-up display showing altitude, ground distance, speed, heading and current latitude/longitude.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/XGMs7Iem3Vg&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/XGMs7Iem3Vg&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-3338366253210966830?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/3338366253210966830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=3338366253210966830' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/3338366253210966830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/3338366253210966830'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/08/earth-fly-by.html' title='Earth Fly-by'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-1979691526277404689</id><published>2010-07-20T22:48:00.000+02:00</published><updated>2010-07-20T22:48:18.572+02:00</updated><title type='text'>A collection of screenshots from the development 2</title><content type='html'>Another collection of screen shots from the recent development.&lt;br /&gt;&lt;br /&gt;Stars rendering was added to make the background more interesting. It uses a real star database of more than 100k stars. It will need some additional effects to make it nicer, like a halo around bright stars etc. There should be also an adaptive HDR to manage the large differences in luminance.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k290.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/k290.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The terrain is quite dark at night even when sky is still lit, it doesn't take secondary scattering into account yet.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k291.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/k291.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Something from another corner - the following image shows fractal blending of two materials and how it looks like from up close and from a distance. A similar approach will be used to blend land classes.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k294x.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/k294x.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A quick hack of the terrain material system to make it like there is a snow on the mountains. The snow covers the surface if it is flatter than a critical slope,  whereas the critical slope depends also on the elevation. This way the  transition to lower altitudes looks better, although it still needs some  tuning.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k298.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/k298.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k299.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/k299.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k300.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/k300.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;At the moment snow doesn't have any thickness, but later a build up of snow will be possible along with temporary tracks behind vehicles.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k301.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/k301.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Last images, showing distant marked peaks and how they are visible against the background, viewed from altitude 7000m (~23,000ft):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k302.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/k302.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The same view from 20,000m (65,617ft):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k303.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/k303.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-1979691526277404689?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/1979691526277404689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=1979691526277404689' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1979691526277404689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1979691526277404689'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/07/collection-of-screenshots-from.html' title='A collection of screenshots from the development 2'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-7637478844683487701</id><published>2010-07-05T12:29:00.001+02:00</published><updated>2010-07-05T12:31:04.074+02:00</updated><title type='text'>Cessna in Mountains</title><content type='html'>A short video of Cessna flying high over mountains. Angrypig took it somewhere in Lesser Himalayas, mixed in some music, and here's the result.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rvuc52kZYOk&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/rvuc52kZYOk&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-7637478844683487701?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/7637478844683487701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=7637478844683487701' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7637478844683487701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7637478844683487701'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/07/cessna-in-mountains.html' title='Cessna in Mountains'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-4165776650211885607</id><published>2010-06-29T11:29:00.000+02:00</published><updated>2010-06-29T11:29:37.949+02:00</updated><title type='text'>A collection of screenshots from the development</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Here are some screen shots from the development, that we collected during the past week.&lt;br /&gt;&lt;br /&gt;Cab view is working, speed indicator in Tatra works as well. Also the basics of scene editing are there so we could create this small airfield with some hangars and scattered containers. Somewhere in Nepal, I think.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/l001.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/l001.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Inside the hangar.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/l002.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/l002.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Indicators in Cessna are now working too.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/l003.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/l003.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The same cockpit now in the evening.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/l008.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/l008.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And a couple of outdoor evening shots ..&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/l004.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/l004.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/l005.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/l005.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/l006.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/l006.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/l007.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://www.outerra.com/shots/l007.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-4165776650211885607?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/4165776650211885607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=4165776650211885607' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/4165776650211885607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/4165776650211885607'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/06/collection-of-screenshots-from.html' title='A collection of screenshots from the development'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-1930035746758158799</id><published>2010-06-19T09:38:00.002+02:00</published><updated>2010-06-19T09:39:47.619+02:00</updated><title type='text'>Development screen shots and videos</title><content type='html'>I have decided to create a forum section where we could post various development screen  shots and videos of stuff we are just working on, with only a short description. It should be updated more often. Some of the videos may be occasionally posted here as well.&lt;br /&gt;&lt;br /&gt;Here is the link to the &lt;a href="http://www.outerra.com/forum/viewforum.php?id=6"&gt;development screen shots and videos&lt;/a&gt; forum.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tatra T813 Cab View Video&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/LC9FOHwNw9o&amp;hl=en_US&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/LC9FOHwNw9o&amp;hl=en_US&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-1930035746758158799?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/1930035746758158799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=1930035746758158799' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1930035746758158799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1930035746758158799'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/06/development-screen-shots-and-videos.html' title='Development screen shots and videos'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-9085646349423647763</id><published>2010-06-09T07:25:00.003+02:00</published><updated>2010-06-09T07:40:13.644+02:00</updated><title type='text'>Dirt Roads</title><content type='html'>In the previous post about &lt;a href="http://outerra.blogspot.com/2010/05/integrating-vector-data-roads.html"&gt;roads&lt;/a&gt; in Outerra I mentioned that different road types can be created by using road profiles. Here comes one example.&lt;br /&gt;&lt;br /&gt;Dirt roads are using the very same mechanism as normal roads, in fact the only difference is that road nodes here contain a different road type identifier. That is used to look up the corresponding road profile in shaders that generate the roads, and it determines other things as well - the pavement and border materials, for example.&lt;br /&gt;&lt;br /&gt;Road profile specifies "exactness" values across the road width, in range from 0 to 1. Normal roads have value 1 across the whole road width, meaning that the elevation given by the road spline interpolation is exact and the resulting surface will be smooth and level. Values less than 1 will cause that the computed surface elevation is blended with the actual underlying terrain elevation with given blending coefficient. Additionally, the less exact the road surface elevation is, the more it is randomized by fractal to make it rougher.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k270.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k270.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The roughness created by the fractal noise can vary with the road type. The depth of the furrows can be determined by setting road surface under the terrain by a specific amount, and it can change node by node. On the sample road above it creates deeper or shallower parts. Or even a ridge when the way points are not set densely enough to follow the terrain accurately.&lt;br /&gt;&lt;br /&gt;Here is a road that was created from way points lying 0.4m (on average) below the terrain surface with high roughness:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k277.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k277.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Another one that was put only slightly under the terrain and the roughness is low:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k275.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k275.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Lastly, few screen shots how it all looks in the terrain.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k271.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k271.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.outerra.com/shots/k276.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k276.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k273.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k273.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In order to utilize the generated detail we also set a finer level to be used for vehicle physics. In the previous &lt;a href="http://www.youtube.com/watch?v=RNw7_lyxPmA"&gt;video with Tatra truck&lt;/a&gt; the resolution for physics was around 1.2m, and it was quite visible. In the following video the resolution for physics is around 0.15m, 8 times better. The wheels are simulated as simple ray casts so it may be occasionally visible. Also, Angrypig toyed with the suspension and I left it in for the video; Tatra truck now sways way too much, but at least it serves to show the response to the terrain shape.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/izyZ1kKQzbE&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/izyZ1kKQzbE&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Forum topic &lt;a href="http://www.outerra.com/forum/viewtopic.php?id=64"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-9085646349423647763?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/9085646349423647763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=9085646349423647763' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/9085646349423647763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/9085646349423647763'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/06/dirt-roads.html' title='Dirt Roads'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-1990465542044368025</id><published>2010-05-25T11:02:00.011+02:00</published><updated>2010-06-09T08:44:19.726+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='roads'/><title type='text'>Integrating Vector Data - Roads</title><content type='html'>You may remember an earlier blog about &lt;a href="http://outerra.blogspot.com/2009/06/roads.html"&gt;roads&lt;/a&gt; where the approach and algorithms for creating spline based roads were outlined. At that time it was just a concept of how it may work, with many unresolved issues.&lt;br /&gt;&lt;br /&gt;In the past weeks I occupied myself with integrating the road system into the engine, making it more robust and powerful on the way. The road way points now contain additional information such as road type, width, marking style and more that will allow to make a variety of road types, also including forest roads with ruts, for example.&lt;br /&gt;&lt;br /&gt;As you can see on the following screenshots, the roads are completely integrated into the terrain - no terrain poking through the road surface ever. The integration also modifies the surrounding terrain to make the embedment natural. Side of the road is initially smooth up to a specified border width (can be specified per road spline node), and after that the fractal roughness gradually takes on.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k248.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k248.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Depressions are filled and an embankment is created.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k253.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k253.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;Routing the road through a rock or hill makes rocky slopes with defined steepness on the side(s).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k249.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k249.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;More screenshots showing the creation process and the results, with varying level of detail.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k250.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://www.outerra.com/thumbs/k250.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://www.outerra.com/shots/k251.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://www.outerra.com/thumbs/k251.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://www.outerra.com/shots/k252.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://www.outerra.com/thumbs/k252.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://www.outerra.com/shots/k254.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://www.outerra.com/thumbs/k254.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://www.outerra.com/shots/k255.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://www.outerra.com/thumbs/k255.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://www.outerra.com/shots/k256.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://www.outerra.com/thumbs/k256.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://www.outerra.com/shots/k257.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://www.outerra.com/thumbs/k257.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;The trees are automatically removed from the road surface and its border area, although sometimes you can see branches hanging over the road.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k258.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k258.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Splines allow for some mad road shapes but it still fits into the terrain :)&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k260.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://www.outerra.com/thumbs/k260.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://www.outerra.com/shots/k261.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://www.outerra.com/thumbs/k261.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Terrain under the road is initially roughly prepared - gaps are filled and excess volume is cut out. This is being done at tile with resolution ~10m, so that fractal algorithm can refine it down naturally. Previously, when the road cut into a hill, the cut was unnaturally smooth. Now only the road border is smooth, gradually transitioning into a rougher fractal structure.&lt;br /&gt;&lt;br /&gt;In the following screenshots you can see the process documented:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I. Placing the waypoints - this is currently being done as you move over the terrain pressing a build-road key, later a built-in editor will allow for better editing modes and options.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k259-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k259-1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;II. Rough terrain treatment - note this is actually hidden within the process, I've visualized it here just to show what effect it has on the terrain.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k259-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k259-2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;III. Finalizing the road&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k259-3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k259-3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The engine has no problems with terrain resolution (as is apparently the case with many planetary engines), to the extent that asphalt can have actual thickness - I think it's 3cm now (~1.2inch).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k262.jpg"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k262.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Other notable features are&lt;br /&gt;&lt;ul&gt;&lt;li&gt;vector data are automatically partitioned and indexed in quad-tree managing the terrain&lt;/li&gt;&lt;li&gt;overlay dirt textures per road type&lt;/li&gt;&lt;li&gt;roads can connect, additional helper code will be needed to adjust the spline points and their attributes so that the connection is smoother&lt;/li&gt;&lt;li&gt;the same system is also used for terrain leveling, with or without pavement placing or with gravel surface etc.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Finally the process can be seen on the YouTube video. Original uploaded video was 500MB with good quality, but the recompression step on YouTube reduced it considerably.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/r_BJLfq1ntI&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/r_BJLfq1ntI&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;The same system is used also for runways, here's a teaser screenshot for upcoming video where Angrypig tries to properly land at .. you can guess where this is from :-)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.outerra.com/shots/k263.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.outerra.com/thumbs/k263.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The corresponding discussion topic on Outerra Forums can be found &lt;a href="http://www.outerra.com/forum/viewtopic.php?id=57"&gt;here&lt;/a&gt;&lt;br /&gt;See also the &lt;a href="http://outerra.blogspot.com/2010/06/dirt-roads.html"&gt;dirt roads&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-1990465542044368025?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/1990465542044368025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=1990465542044368025' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1990465542044368025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1990465542044368025'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/05/integrating-vector-data-roads.html' title='Integrating Vector Data - Roads'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-1193098264374884483</id><published>2010-03-28T16:40:00.003+02:00</published><updated>2010-03-29T12:49:57.735+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video capture'/><title type='text'>In-Game HD Video Capture using Real-Time YUYV-DXT Compression</title><content type='html'>&amp;nbsp;This article describes a method of recording in-game HD videos without  the large impact on frame rate as with an external video capture  software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The method used in this approach was inspired by an article about &lt;a href="http://developer.nvidia.com/object/real-time-ycocg-dxt-compression.html"&gt;Real-Time  YCoCg-DXT Compression&lt;/a&gt; which presented a real-time GPU compression  algorithm to DXT formats.&lt;br /&gt;Standard DXT texture formats aren't very suitable for compression of  general images like the game frames, the higher contrast results in  artifacts like color bleeding and color blocking. The article introduced  YCoCg-DXT format that encodes colors to &lt;a href="http://wiki.multimedia.cx/index.php?title=YCoCg"&gt;YCoCg&lt;/a&gt; color  space (intensity and orange and green chrominance). It also contains the  source code for real-time GPU compression and comparison of achieved  results.&lt;br /&gt;&lt;br /&gt;The YCoCg format is suitable for decompression on GPU, because decoding  YCoCg values back to RGB only takes a few shader instructions. However,  for the purpose of decoding the frame data in a video codec, a better  format is a YUV-based one that allows to decode the data directly to the  video surface without additional conversions. The best format for this  seemed to be YUYV with 16 bits per sample, which means there's one U and  V value per 2 horizontal samples.&lt;br /&gt;The compression algorithm differs from the YCoCg-DXT one in the initial  color space conversion to YUYV and in that it encodes 4x4 YY, U and V  blocks in the way alpha component is encoded in DXT5 format.&lt;br /&gt;&lt;br /&gt;The algorithm is as follows:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Video frames are compressed with fragment shader to YUYV-DXT format  by render to texture technique, reducing the data to 1/3 of its original  size&lt;/li&gt;&lt;li&gt;The compressed textures are &lt;u&gt;asynchronously&lt;/u&gt; read back to CPU&lt;/li&gt;&lt;li&gt;The data are continuously written to disk&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The compression on GPU reduces the bandwidth needed between CPU and GPU,  but more importantly also the bandwidth needed for disk writes.  Sustainable write speed of a SATA drives is somewhere around 55MB/s, transferring a raw 1280x720/30fps video takes 79.1MB/s, while the DXT  compressed video only takes 26.4MB/s. A Full-HD video stream is 59.3MB/s.&lt;br /&gt;&lt;br /&gt;To capture the frame buffer data the application first renders to an  intermediate target. The compression shader uses this as the input  texture, rendering to a uint4 target with one quarter width and height  of the original resolution, that is then read back to CPU memory.&lt;br /&gt;&lt;br /&gt;The next step is decoding the captured video. To make this easy I've  written a custom video codec and video format plugin for &lt;a href="http://ffmpeg.org/"&gt;ffmpeg&lt;/a&gt; library. The format was named Yog  (from &lt;b&gt;Y&lt;/b&gt;C&lt;b&gt;o&lt;/b&gt;C&lt;b&gt;g&lt;/b&gt;) as the encoding was originally in  YCoCg format, changed only later to YUYV.&lt;br /&gt;The game produces *.yog video files that can be directly replayed by  ffplay or converted to another video format with the ffmpeg utility.  They are also recognized by any video processing software that uses  ffmpeg or ffplay executables or uses the avcodec and avformat dlls from  the suite, such as &lt;a href="http://winff.org/"&gt;WinFF&lt;/a&gt; or &lt;a href="http://corz.org/windows/software/ffe/"&gt;FFe&lt;/a&gt; or many others.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Results&lt;/h3&gt;&lt;br /&gt;After starting the video recording in our game the frame rate drops only  by a few fps, and it's still playable normally, unlike when recording  for example with Fraps. Disadvantage is that this has to be integrated  into the renderer path.&lt;br /&gt;Quality wise the results are quite good, as it can be seen on the  following screen shots:&lt;br /&gt;&lt;br /&gt;Original&lt;br /&gt;&lt;a href="http://www.outerra.com/video/vid-orig.png"&gt;&lt;img src="http://www.outerra.com/video/vid-orig1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;YUYV compressed, note this is slightly lighter because of an issue in  ffmpeg that has to be solved yet.&lt;br /&gt;&lt;a href="http://www.outerra.com/video/vid-yog.png"&gt;&lt;img src="http://www.outerra.com/video/vid-yog1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The difference, 4X amplified&lt;br /&gt;&lt;a href="http://www.outerra.com/video/vid-dif4x.png"&gt;&lt;img src="http://www.outerra.com/video/vid-dif4x1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The source code and further implementation details can be found at &lt;a href="http://www.outerra.com/video/index.html"&gt;outerra.com/video/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-1193098264374884483?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/1193098264374884483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=1193098264374884483' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1193098264374884483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1193098264374884483'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/03/in-game-hd-video-capture-using-real.html' title='In-Game HD Video Capture using Real-Time YUYV-DXT Compression'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-6954003767103344783</id><published>2010-02-09T08:59:00.000+01:00</published><updated>2010-02-09T08:59:57.801+01:00</updated><title type='text'>Tatra T813 Video</title><content type='html'>Previous video with Cessna test flight apparently made some good (for most) waves in the flight sim scene. Here comes another video, this time with the Tatra T813 truck, focused on its independent swing suspension exercising on bumpy slopes somewhere in High Tatras mountains (it's not a coincidence, the truck got its name after the mountain range).&lt;br /&gt;&lt;br /&gt;Suspension limits and parameters were set only approximately so the behavior may not be precise. But it's normal that an unloaded Tatra truck has its hind wheels in V shape.&lt;br /&gt;Also the dynamically refined terrain has a higher resolution than the mesh used for physics, that may be slightly visible in closeups.&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/RNw7_lyxPmA&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/RNw7_lyxPmA&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;As a technical note, both videos were captured using GPU-based compression of video frames to reduce the bandwidth needed for sustained disk writes, while not imposing a noticeable performance penalty. Since the video frames are being compressed on GPU, GPU-&amp;gt;CPU transfers are also smaller what is a good thing as well.&lt;br /&gt;I also made a custom video codec for ffmpeg that can decode these videos so one can recompress the video directly with ffmpeg or any other tool that uses the libavcodec dll. There will be a separate blog entry with more technical description and the code to be usable for others.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-6954003767103344783?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/6954003767103344783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=6954003767103344783' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6954003767103344783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6954003767103344783'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/02/tatra-t813-video.html' title='Tatra T813 Video'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-2998675184163869760</id><published>2010-02-05T10:19:00.001+01:00</published><updated>2011-02-18T17:42:40.775+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fractal terrain'/><category scheme='http://www.blogger.com/atom/ns#' term='cessna'/><title type='text'>Cessna Test Flight</title><content type='html'>Angrypig finally managed to implement collision detection for JSBSim  planes along with the joystick support, so we created a short test  flight video with Cessna plane.&lt;br /&gt;&lt;br /&gt;Here it comes.&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/TVjCetERjN8&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/TVjCetERjN8&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-2998675184163869760?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/2998675184163869760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=2998675184163869760' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/2998675184163869760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/2998675184163869760'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/02/cessna-test-flight.html' title='Cessna Test Flight'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-3168929760816707967</id><published>2010-01-27T19:44:00.002+01:00</published><updated>2010-01-27T19:44:52.816+01:00</updated><title type='text'>Outerra Engine Progress</title><content type='html'>It's been some time since I blogged about the Outerra engine, so here  comes the latest info about what we've been doing.&lt;br /&gt;&lt;br /&gt;Lots of stuff has been done on the visuals - shadows are finally in, and  even though they are not finished yet the output is much nicer with  them. It uses a randomized lookup into the shadow map but the blurring  pass is not present yet, so the closeups show noisy shadow edges. This  will go away with the blurring pass on the shadow map.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k210.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k210.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The ugly patterns on the ground visible in older screen shots, resulting  from tiled textures have been suppressed by more fractal magic - a free  fractal channel has been used to mix three textures (daisies, grass and  a lighter grass) together and the pattern is almost completely gone.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k209.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k209.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Another thing that helped a lot was the color transformation to &lt;a href="http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html"&gt;linear  space&lt;/a&gt;. This included both the input (loading the textures in sRGB  format and also correctly computing the mipmaps) and setting the render  target. The fix is most obvious on the atmosphere that now looks more  natural.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k207.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k207.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The trees are also slightly randomly colorized to break the  monotonicity.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k206.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k206.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The material system has progressed as well, as it can be seen on the new  truck model here.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k198.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k198.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k199.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k199.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k200.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k200.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also new is the support for dirty windows.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k201.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k201.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A gun is mounted on the roof, with a separate controller. It should be  also functional soon, along with some flying prey to ground &lt;img border="0" src="http://www.gamedev.net/community/forums/images/smileys/smile.gif" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k202.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k202.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k203.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k203.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k204.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k204.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k205.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k205.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The new model appearing in the shots is the Tatra T813 8x8 heavy  all-terrain truck with unique independent swing half axles. I wrote  specialized code to handle its physics, and it works quite nicely. It is  much better visible in motion, a video will be coming soon.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k212.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k212.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k213.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k213.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k214.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k214.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k208.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/k208.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-3168929760816707967?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/3168929760816707967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=3168929760816707967' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/3168929760816707967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/3168929760816707967'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2010/01/outerra-engine-progress.html' title='Outerra Engine Progress'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-434885432478493971</id><published>2009-12-31T11:08:00.002+01:00</published><updated>2010-01-10T19:20:47.249+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='planet rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='depth buffer'/><title type='text'>Floating Point Depth Buffer</title><content type='html'>I had always thought that using a floating point depth buffer on modern hardware would solve all the depth buffer problems, in a similar way than the &lt;a href="http://outerra.blogspot.com/2009/08/logarithmic-z-buffer.html"&gt;logarithmic depth buffer&lt;/a&gt; but without requiring any changes in the shader code, and having no artifacts and potential performance losses in their workarounds. So I was quite surprised when swiftcoder mentioned in &lt;a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=557264"&gt;this thread&lt;/a&gt; that he had found that the floating point depth buffer had insufficient resolution for a planetary renderer.&lt;br /&gt;&lt;br /&gt;The value that gets written into the Z-buffer is value of z/w after projection, and it has an unfortunate shape that gives enormous precision to a very narrow part close to the near plane. In fact, almost half of the possible values lie within two times the distance of the near plane. In the picture below it's the red "curve". The logarithmic distribution (blue curve), on the other hand, is optimal with regards to object sizes that can be visible at given distance.&lt;br /&gt;&lt;img src="http://www.outerra.com/images/zw.gif" /&gt;&lt;br /&gt;&lt;br /&gt;Floating point depth buffer should be able to handle the original z/w curve because the exponent part corresponds to the logarithm of the number.&lt;br /&gt;&lt;br /&gt;However, here's the catch. Depth buffer values converge towards value of 1.0, or in fact most of the depth range gives values very close to it. The resolution of floating point around 1.0 is entirely given by the mantissa, and it's approximately 1e-7. That is not enough for planetary rendering, given the ugly shape of z/w.&lt;br /&gt;&lt;br /&gt;However, the solution is quite easy. Swapping the values of far and near plane and changing the depth function to "greater" inverts the z/w shape so that it iterates towards zero with rising distance, where there is a plenty of resolution in the floating point.&lt;br /&gt;&lt;br /&gt;I've also found an &lt;a href="http://www.humus.name/index.php?ID=255"&gt;earlier post by Humus&lt;/a&gt; where he says the same thing, and also gives more insight into the old W-buffers and various Z-buffer properties and optimizations.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Update&lt;/h3&gt;&lt;br /&gt;I tried to compute the depth resolution of various Z-buffers for whole range from 0 to 10,000 kilometers. Here's the result (if I didn't make a mistake), showing the resolution at given distance (lower is better):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.outerra.com/images/zres.gif" /&gt;&lt;br /&gt;&lt;img src="http://www.outerra.com/images/zres1.gif" /&gt;&lt;br /&gt;&lt;br /&gt;The red curve shows resolution of the logarithmic Z-buffer. It scales linearly with distance, what means that in the screen space it's constant. That's also an ideal behavior.&lt;br /&gt;&lt;br /&gt;The blue curve shows the resolution of 32 bit floating point depth buffer with swapped far and near plane. The spikes are formed with each decrement of the exponent. Floating point depth buffer has worse resolution than the logarithmic one, but it should be still sufficient. The green line is for an ideal Z-buffer that has depth resolution of 0.12 millimeters at one kilometer. It also happens to be the worst case bound for the floating point depth buffer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-434885432478493971?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/434885432478493971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=434885432478493971' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/434885432478493971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/434885432478493971'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/12/floating-point-depth-buffer.html' title='Floating Point Depth Buffer'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-2030945030431386042</id><published>2009-12-10T09:06:00.000+01:00</published><updated>2009-12-10T09:06:18.634+01:00</updated><title type='text'>Early vehicle physics test</title><content type='html'>First test of vehicle physics in the engine. Camera isn't yet attached to the vehicle so I had to chase it, without much success I admit &lt;img border="0" src="http://www.gamedev.net/community/forums/images/smileys/smile.gif" /&gt;&lt;br /&gt;Also it's really easy to lose sight of the truck in the big world.&lt;br /&gt;&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/47paAW7ljRc&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/47paAW7ljRc&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-2030945030431386042?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/2030945030431386042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=2030945030431386042' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/2030945030431386042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/2030945030431386042'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/12/early-vehicle-physics-test.html' title='Early vehicle physics test'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-7565705695520046502</id><published>2009-11-26T12:00:00.000+01:00</published><updated>2009-11-26T12:01:00.351+01:00</updated><title type='text'>Collada Importer</title><content type='html'>Angrypig managed to get Collada importer into beta stage, so here are some first screens with new Cessna model and Gaz 66 truck. Too bad neither AO nor shadows are ready yet, the screens would be much nicer with it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cessna cockpit has quite a high resolution; the indicators should become alive soon.&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-cessna05.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Views from the outside. Propeller is already turning, but there's no motion blur on it yet. Transparency works too but there's a bug in the model. The windows ask for bit of dirt here and there, too.&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-trans01.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-trans02.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-trans03.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-cessna04.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Approximately 3,900 feet above the ground.&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-cessna02.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-cessna03.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-cessna_gaz66_01.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-cessna01.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Mount Etna in the background.&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-cessna06.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Gaz 66 truck ..&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-gaz66_01.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;.. and a fleet of them.&lt;br /&gt;&lt;img src="http://www.outerra.com/shots/l1-gaz66_04.jpg" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-7565705695520046502?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/7565705695520046502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=7565705695520046502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7565705695520046502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7565705695520046502'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/11/collada-importer.html' title='Collada Importer'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-1173634429375581823</id><published>2009-11-12T09:40:00.002+01:00</published><updated>2009-11-26T13:54:41.938+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fractal terrain'/><category scheme='http://www.blogger.com/atom/ns#' term='horizontal displace'/><title type='text'>Horizontal displacement</title><content type='html'>Recently I've been working on the code that computes fractal data - a bit of reorganization to be able to have more independent fractal channels that are used everywhere in the engine, as I was running short of them already. Previously we had one channel where the terrain elevation fractal was computed, another channel with low-pass filtered terrain slope and 2 independent fractal channels. After the redesign we have 4 independent fractal channels, but additionally the filtered slope is computed independently for u,v terrain directions.&lt;br /&gt;&lt;br /&gt;The two-dimensional slope values allow for better horizontal displacement effect on the generated terrain, because now it's possible to make the rock bulge from the hill slope in the right direction. In the previous version only the absolute slope value was known, and the fractals extruded the mesh independently in two orthogonal directions, and of course that did not always look good.&lt;br /&gt;&lt;br /&gt;The equation for the displacement was in addition parametrized, to be able to get more effects out of it. Currently it's possible to vary the dominant wavelength, bias and amplitude of the used fractal.&lt;br /&gt;&lt;br /&gt;Here is a quick comparison of what the parameters do.&lt;br /&gt;&lt;br /&gt;Bias +0.5 (bulging outwards from the slope), wavelength 19m&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k175-hf.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/m175-hf.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wavelength 38m&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k175-mf.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/m175-mf.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wavelength 76m&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k175-lf.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/m175-lf.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the last screenshot the fractal used for the displacement is already only slightly visible and the bulbous shape of purely slope-dependent displacement shows up.&lt;br /&gt;Here's how the displacement looks like when the bias is even larger, i.e. when the sloped parts are pushed even more outwards (bias +1.5):&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k175-pbias.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/m175-pbias.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's also possible to use a negative bias values, that make the sloped parts carved into the hill (bias -1.0):&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k175-nbias.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/m175-nbias.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On the other hand, amplitude boost can emphasize the effect of the fractal, creating more visible overhangs here and there:&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k175-boost.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/m175-boost.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For comparison, here's how the same terrain looks like without any horizontal fractal effect at all:&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k175-plain.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/m175-plain.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;... and without the vertical fractal, only a bicubic subdivision of original 76m terrain grid:&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k175-cubic.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/m175-cubic.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next thing to try could be using a texture containing rough shape of specific type of erosion one would like to achieve. Current technique still cannot generate proper cliff and canyon walls, but combining it with the shape map lookup should theoretically do the job.&lt;br /&gt;&lt;br /&gt;There's also an &lt;a href="http://www.outerra.com/procedural/demo2.html"&gt;interactive comparison&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-1173634429375581823?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/1173634429375581823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=1173634429375581823' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1173634429375581823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1173634429375581823'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/11/horizontal-displacement-2.html' title='Horizontal displacement'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-7730171431551983361</id><published>2009-10-02T18:43:00.004+02:00</published><updated>2009-10-02T20:52:22.333+02:00</updated><title type='text'>Web Site Update</title><content type='html'>Some time ago I had an idea to make the web site with white background. That idea was inspired by a bug in early atmosphere rendering that made Earth as if submerged in watery milk. I remembered it and managed to reproduce the bug in RenderMonkey, tuned it and here's how it looks:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.outerra.com/w/earth2.png" alt="earth" /&gt;&lt;br /&gt;&lt;br /&gt;The whole new look built around that idea can be seen here: &lt;a href="http://www.outerra.com/"&gt;outerra.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-7730171431551983361?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/7730171431551983361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=7730171431551983361' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7730171431551983361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7730171431551983361'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/10/web-site-update.html' title='Web Site Update'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-394022537616800972</id><published>2009-09-02T10:12:00.001+02:00</published><updated>2009-09-02T10:15:11.155+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chromium'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Maps'/><title type='text'>Chromium &amp; Google Maps</title><content type='html'>Another short video showing the embedded Chromium browser and Google Maps that is synchronized to engine camera.&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/AoDOPFIiesg&amp;hl=en&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/AoDOPFIiesg&amp;hl=en&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-394022537616800972?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/394022537616800972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=394022537616800972' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/394022537616800972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/394022537616800972'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/09/chromium-google-maps.html' title='Chromium &amp; Google Maps'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-4449985470850782951</id><published>2009-08-31T13:50:00.002+02:00</published><updated>2009-08-31T17:28:53.673+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='planet rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='flight simulator'/><title type='text'>Short flight sim video</title><content type='html'>It's been one year since we released the first videos from Outerra engine. So it's about time to release another short one featuring a lifeless Jalapeno and a pilotless Cessna plane with broken propeller &lt;img src="http://www.gamedev.net/community/forums/images/smileys/cool.gif" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/EEqIFG2tO88&amp;hl=en&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/EEqIFG2tO88&amp;hl=en&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-4449985470850782951?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/4449985470850782951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=4449985470850782951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/4449985470850782951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/4449985470850782951'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/08/short-flight-sim-video.html' title='Short flight sim video'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-2410227472776398779</id><published>2009-08-17T08:45:00.003+02:00</published><updated>2009-08-20T10:11:56.834+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='simulator'/><category scheme='http://www.blogger.com/atom/ns#' term='cessna'/><title type='text'>Flight sim?</title><content type='html'>Two guys I'm working with on the engine, Laco 'angrypig' Hrabcak and Tomas 'jonsky' Mihalovic have some time ago worked on FNPT II MCC trainer with Boeing 737-800 cockpit replica (Laco has got some photos in his &lt;a href="http://outerra.com/hrabcak/history.html"&gt;history page&lt;/a&gt;)&lt;br /&gt;They are still being quite drawn to simulators, so when we got positive reception from flight sim community with the engine we decided to lean the development slightly more that way.&lt;br /&gt;&lt;br /&gt;Recently, Laco got preliminary Collada loader working, loading a Cessna model. He is also incorporating &lt;a href="http://www.jsbsim.com/"&gt;JSBSim&lt;/a&gt; Flight Dynamics Model library into the engine, while Tomas works on the cockpit.&lt;br /&gt;&lt;br /&gt;Here are some first screens.&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k130.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t130.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are some screens with (now featureless) cockpit, recent Z-buffer development allows to handle the cockpit and terrain without problems.&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k131.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t131.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k132.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t132.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k133.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t133.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A look below while grounded.&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k134.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t134.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And some screens from outside.&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k135.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t135.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k136.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t136.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k137.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t137.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-2410227472776398779?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/2410227472776398779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=2410227472776398779' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/2410227472776398779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/2410227472776398779'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/08/flight-sim.html' title='Flight sim?'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-1993837842484806351</id><published>2009-08-12T17:33:00.016+02:00</published><updated>2011-07-03T13:42:31.991+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='planet rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='depth buffer'/><title type='text'>Logarithmic Depth Buffer</title><content type='html'>I assume pretty much every 3D programmer runs into Z-buffer issues sooner or later. Especially when doing planetary rendering; the distant stuff can be a thousand kilometers away but you still would like to see fine details right in front of the camera.&lt;br /&gt;&lt;br /&gt;Previously I have dealt with the problem by splitting the depth range in two and using the first part for near stuff and another for distant stuff. The boundary was floating, somewhere around 5km - quad-tree tiles up to certain level were using the distant part, and the more detailed tiles that by law of LOD are occurring nearer the camera used the other part.&lt;br /&gt;Most of the time this worked. But in one case it failed miserably - when a more detailed tile appeared behind a less detailed one.&lt;br /&gt;I was thinking about the ways to fix it, grumbling why we can't have a Z-buffer with better distribution, when it occurred to me that maybe we can.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html"&gt;Steve Baker's document&lt;/a&gt; explains common problems with Z-buffer. In short, the depth values are proportional to the reciprocal of Z. This gives amounts of precision near the camera but little off in the distance. Common method is then to move your near clip plane further away, which helps but also brings its own problems, mainly that .. the near clip plane is too far &lt;img border="0" src="http://www.gamedev.net/community/forums/images/smileys/rolleyes.gif" /&gt;&lt;br /&gt;&lt;br /&gt;A much better Z-value distribution is a logarithmic one. It also plays nicely with LOD used in large scale terrain rendering.&lt;br /&gt;Using the following equation to modify depth value after it's been transformed by the projection matrix:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;nbsp;   z = log(C*z + 1) / log(C*Far + 1) * w      //DirectX with depth range 0..1&lt;/pre&gt;&lt;pre&gt;or &lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;   z = (2*log(C*z + 1) / log(C*Far + 1) - 1) * w   //OpenGL, depth range -1..1&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;Where C is constant that determines the resolution near the camera, and the multiplication by w undoes in advance the implicit division by w later in the pipeline.&lt;br /&gt;Resolution at distance x, for given C and n bits of Z-buffer resolution can be computed as&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;nbsp;   Res = log(C*Far + 1) / ((2^n - 1) * C/(C*x+1))&lt;/pre&gt;&lt;br /&gt;So for example for a far plane at 10,000 km and 24-bit Z-buffer this gives the following resolutions:&lt;br /&gt;&lt;pre&gt;&amp;nbsp;           1m      10m     100m    1km     10km    100km   1Mm     10Mm&lt;br /&gt;------------------------------------------------------------------------&lt;br /&gt;C=1         1.9e-6  1.1e-5  9.7e-5  0.001   0.01    0.096   0.96    9.6     [m]&lt;br /&gt;C=0.001     0.0005  0.0005  0.0006  0.001   0.006   0.055   0.549   5.49    [m]&lt;/pre&gt;&lt;br /&gt;Along with the better utilization of z-value space it also (almost) gets us rid of the near clip plane.&lt;br /&gt;&lt;br /&gt;And here comes the result.&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k128.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t128.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looking into the nose while keeping eye on distant mountains ..&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k127.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t127.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;10 thousand kilometers, no near Z clipping and no Z-fighting! HOORAY!&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;More details&lt;/h4&gt;The C basically changes the resolution near the camera; I used C=1 for the screenshots, having theoretical resolution 1.9e-6m. However, the resolution near the camera cannot be utilized fully as long as the geometry isn't finely tessellated too, because the depth is interpolated linearly and not logarithmically. On models such as the guy on the screenshots it is perfectly fine to put camera on his nose, but with models with long stripes with vertices few meters apart the bugs from the interpolation can be visible. We will be dealing with it by requiring certain minimum tessellation.&lt;br /&gt;&lt;br /&gt;Also I think I've read somewhere that some forthcoming generation of hardware will support different modes of interpolation too.&lt;br /&gt;&lt;br /&gt;So yes, modifying C changes the resolution near the camera, setting it to a value that gives the largest acceptable resolution may be desirable to achieve more linear distribution in the near range and thus minimizing the interpolation problem.&lt;br /&gt;&lt;br /&gt;Near clip plane can be put arbitrarily 'near' but not zero because of the 1/w division. I have put it to 0.0001m. This is using standard perspective projection setup.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Negative Z artifact fix&lt;/h4&gt;&lt;a href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;amp;reply_id=3513134"&gt;Ysaneya suggested a fix&lt;/a&gt; for the artifacts occurring with thin or huge triangles when Z goes behind the camera, by writing the correct Z-value at the pixel shader level. This disables fast-Z mode but he found the performance hit to be negligible.&lt;br /&gt;&lt;br /&gt;See also: &lt;a href="http://outerra.blogspot.com/2009/12/floating-point-depth-buffer.html"&gt;floating point depth buffer&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-1993837842484806351?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/1993837842484806351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=1993837842484806351' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1993837842484806351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1993837842484806351'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/08/logarithmic-z-buffer.html' title='Logarithmic Depth Buffer'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-5227436461396516421</id><published>2009-06-25T15:46:00.006+02:00</published><updated>2009-09-09T10:31:05.436+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='roads'/><category scheme='http://www.blogger.com/atom/ns#' term='Catmull-Rom'/><title type='text'>Roads</title><content type='html'>Added support for vector data which is currently used for simple roads, later it will be used also for rivers and similar stuff.&lt;br /&gt;The points are interpolated using Catmull-Rom spline, and the generated path is baked into tile's material map with specific artifical material. Tile height map is modified too by setting the elevation from the path but gradually blending the borders to terrain.&lt;br /&gt;The roads can also be slanted.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k122.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t122.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The actual algorithm runs in shader, finding the distance to spline from each point and outputs a blending coefficient and elevation. Asphalt material id is generated where the coefficient is one, otherwise only the height map is modified by blending.&lt;br /&gt;Once the map is created it incurs no additional performance penalty - it's just another set of materials used.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k123.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t123.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;While the algorithm can also generate the road surface markings as specific materials, the resolution of the material map for the tile isn't sufficient for such highly contrasting stuff. This will have to be drawn separately as an overlay on the tile, possibly using the same algorithm but when drawing to the screen.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k124.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t124.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The algorithm&lt;/h3&gt;&lt;br /&gt;I'm drawing quads with road segments into an intermediate texture that contains elevation (as interpolated by the spline) and blending coefficient which is 1 for road surface and slowly falling to 0 on road borders.&lt;br /&gt;To get the distance to spline for particular pixel I had to transform world coordinates to road segment's lengthwise and crosswise coordinates.&lt;br /&gt;&lt;br /&gt;The final solution got somewhat more complicated, though.&lt;br /&gt;&lt;br /&gt;Since the linear interpolation on quads is ambiguous, I had to treat the segment as a bilinear surface and compute the inverse of it so as to get these lengthwise/crosswise coordinates. See &lt;a href="http://stackoverflow.com/questions/808441/inverse-bilinear-interpolation"&gt;http://stackoverflow.com/questions/808441/inverse-bilinear-interpolation&lt;/a&gt; for explanation.&lt;br /&gt;&lt;br /&gt;But as it turned out this wasn't sufficient enough, because of course the spline road segment isn't a bilinear surface. It led to roads that narrowed in sharper turns or disappeared.&lt;br /&gt;Actual road segment surface equation could be:&lt;br /&gt;&lt;pre&gt;    p = q(s) + t*n(s)&lt;/pre&gt;where q(s) is the spline equation, n(s) is 2D normal to the spline, s is the lengthwise coordinate and finally t is the crosswise coordinate. However, this would lead to solving 5th degree polynomial and one would have to pick the correct root too ...&lt;br /&gt;&lt;br /&gt;But ultimately I used this equation to take one step of &lt;a href="http://en.wikipedia.org/wiki/Newton%27s_method"&gt;Newton-Raphson approximation&lt;/a&gt;, seeding it with value of s computed by the inverse bilinear transform. The approximation converges rapidly so one step was enough.&lt;br /&gt;The equation for one step of Newton-Raphson is:&lt;br /&gt;&lt;pre&gt;    s1 = s0 - f(s0)/f'(s0)&lt;/pre&gt;with&lt;br /&gt;&lt;pre&gt;    f(s) = (px - qx(s)) * qx'(s) + (py - qy(s)) * qy'(s)&lt;br /&gt;  f'(s) = (px - qx(s)) * qx"(s) - qx'(s) * qx'(s)&lt;br /&gt;        + (py - qy(s)) * qy"(s) - qy'(s) * qy'(s)&lt;/pre&gt;So you need the first and second derivative of the spline equation to compute it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-5227436461396516421?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/5227436461396516421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=5227436461396516421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5227436461396516421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5227436461396516421'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/06/roads.html' title='Roads'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-6567390880240596066</id><published>2009-05-29T11:44:00.005+02:00</published><updated>2009-11-12T09:43:02.358+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fractal terrain'/><category scheme='http://www.blogger.com/atom/ns#' term='horizontal displace'/><title type='text'>Horizontal displacement</title><content type='html'>As always I do not keep strictly to the plan, and decided to try one of things I wanted to do someday - horizontal displacement of terrain.&lt;br /&gt;&lt;br /&gt;The fractal map computed for quadtree node already contains 3 independent fractal noise channels. The first one computes elevation and is seeded from heightmap data. Other two are used for detail material mixing and other things. There is also a fourth channel containing global slope.&lt;br /&gt;I modified the shader that computes vertex positions to displace also in horizontal directions, using one of the two independent fractal channels. Amount of displacement also varies with global slope - areas in flat regions are shifted minimally, but sloped parts that are also treated as rock are displaced a lot. This makes rocky parts much more interesting. For the record, the actual equation used for displacing point on a sphere in tangent space is this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.outerra.com/images/eq1.png" /&gt;&lt;br /&gt;&lt;br /&gt;Next thing that had to be done was to compute the normals of such deformed surface. &lt;a href="http://http.developer.nvidia.com/GPUGems/gpugems_ch42.html"&gt;Article in GPU Gems about deformers&lt;/a&gt; provides nice info about Jacobian matrix that can be used for the job. After some pounding to my math circuits I managed to produce the following Jacobian of the above equation (in tangent space):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.outerra.com/images/eq2.png" /&gt;&lt;br /&gt;&lt;br /&gt;Normal is then computed as cross product between the second and third column, since the tangent and binormal are {0,1,0} and {0,0,1} respectively.&lt;br /&gt;&lt;br /&gt;Finally, here is the result - left side original with only the vertical displacement, on the right side vertical&amp;amp;horizontal displacement:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outerra.com/shots/k105.jpg"&gt;&lt;img src="http://www.outerra.com/thumbs/t105b.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are still some issues but the overall effect is quite nice. Of course, collisions with sloped parts are no longer accurate and I'll have to do something with it later.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://outerra.com/"&gt;Outerra planetary engine&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-6567390880240596066?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/6567390880240596066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=6567390880240596066' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6567390880240596066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6567390880240596066'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/05/horizontal-displacement.html' title='Horizontal displacement'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-980249933047039849</id><published>2009-05-22T17:54:00.003+02:00</published><updated>2009-08-17T20:57:54.968+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bittorrent'/><category scheme='http://www.blogger.com/atom/ns#' term='elevation data'/><title type='text'>Progressive download</title><content type='html'>Complete dataset for Earth with 76m sampling is 192GB, after wavelet compression it is roughly 14GB. That is still too much for direct download, and it will be even slightly larger after more detailed data are used for some parts at higher latitudes that are currently only coarsely defined. Possible solution could be to use a coarser sampling, but this rapidly washes out nice terrain features that the fractal cannot supersede easily.&lt;br /&gt;Fortunately it seems we will be able to use the 76m dataset since progressive download works quite nicely.&lt;br /&gt;Wavelet compression of elevation data helps here because it not only nicely compresses the data but perhaps more significantly it arranges the data in layers by level of detail. Particular level of detail for quad-tree nodes can be then downloaded when needed.&lt;br /&gt;&lt;br /&gt;Results are that landing on the ground in a mountainous area (where the data are largest) requires around 30-40MB of compressed data to be downloaded progressively and cached. Further data (3-8MB) are needed again only after traveling some 300km from the spot. So it seems that even camera following a cruise missile can be handled too, though possibly it could skip the most detailed data at that speed anyway.&lt;br /&gt;&lt;br /&gt;Lastly, the downloader uses &lt;a href="http://www.rasterbar.com/products/libtorrent/index.html"&gt;libtorrent&lt;/a&gt; library so the data can be downloaded using p2p, initially from http seed.&lt;br /&gt;&lt;br /&gt;Using finer sampling manifests itself mainly in mountainous areas where high frequency features occur most.&lt;br /&gt;Here's comparison of High Tatras as rendered by the engine and by the nature.&lt;br /&gt;&lt;img src="http://www.outerra.com/images/s025.jpg"&gt;&lt;br /&gt;&lt;br /&gt;Currently we are working on material mixer that will allow us to assign different materials to different climatic bands, so the peaks here will not be covered by grass and mountain pine will grow at higher elevations too.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://outerra.com"&gt;Outerra planetary engine&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-980249933047039849?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/980249933047039849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=980249933047039849' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/980249933047039849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/980249933047039849'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/05/progressive-download.html' title='Progressive download'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-1204537906633117609</id><published>2009-03-06T08:28:00.002+01:00</published><updated>2009-06-03T09:18:56.052+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chromium'/><title type='text'>chromium</title><content type='html'>Angrypig experimented with &lt;a href="http://code.google.com/chromium/"&gt;chromium code&lt;/a&gt; and ultimately managed to integrate the browser into our engine. Works fairly well, with mouse and keyboard too. It's still just a prototype, though; the integration with the engine will be reworked and optimized for example to have to update only the changed parts in the web page and to make the whole thing asynchronous.&lt;br /&gt;&lt;br /&gt;Also, we are going to hook into V8 engine to handle javascript events in Google Maps, so that the camera moves to the selected location in the maps, and vice versa.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k082.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t082.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k083.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t083.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k084.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t084.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://outerra.com"&gt;Outerra planetary engine&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-1204537906633117609?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/1204537906633117609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=1204537906633117609' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1204537906633117609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1204537906633117609'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/03/chromium.html' title='chromium'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-1261336045425585519</id><published>2009-02-26T06:32:00.002+01:00</published><updated>2009-11-12T09:43:32.091+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fractal terrain'/><title type='text'>Procedural terrain algorithm visualization</title><content type='html'>When I tried to visualize resolution of elevation dataset we are currently using, it occurred to me it would be a good idea to visualize also the various steps and enhancements to the procedural refinement algorithm. These more or less show also how the algorithm evolved.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First, the terrain rendered with bilinear subdivision just to show the resolution of elevation data. We currently use ~150m dataset for whole Earth. All detail below 150m is generated procedurally.&lt;br /&gt;To have a completely procedural planet, another algorithm would generate rough map with continental plates and mountain ranges, that will be then used as the basis for further procedural refinement.&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k080-1.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t080-1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The same terrain now with bicubic subdivision of tiles producing molten ice cream hills. The terrain is textured mostly according to the slope, with slight perturbation with another fractal.&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k080-2.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t080-2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Adding homogeneous wavelet noise to the bicubically subdivided terrain. Doesn't look right, though - no erosion except for the glacial one, that is visible even in the original data.&lt;br /&gt;Shows symptoms of simple fractal terrains - different parts look similar.&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k080-3.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t080-3.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To fix the erosion, the amplitude of noise is modulated by slope - flat areas have less noise, while the steeper get more.&lt;br /&gt;This starts to get right, at least for the valleys, but the slopes are still too monotonous.&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k080-4.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t080-4.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The idea for the next step is that anything below the angle of repose is subject to excessive sediment deposition, and is then more even and less noisy.&lt;br /&gt;This creates larger continuous grass surfaces on moderate slopes, with rocks here and there.&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k080-5.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t080-5.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One problem with slope-dependent noise is that the mountaintops tend to be smooth because the slope is low there.&lt;br /&gt;The subdivision also distributes the flatness to wider area.&lt;br /&gt;The solution is to make the amplitude of noise rise with positive values of curvature too, depending also on elevation.&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k080-6.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t080-6.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also an &lt;a href="http://www.outerra.com/procedural/demo.html"&gt;interactive comparison here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-1261336045425585519?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/1261336045425585519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=1261336045425585519' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1261336045425585519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/1261336045425585519'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/02/procedural-terrain-algorithm.html' title='Procedural terrain algorithm visualization'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-7702180067730951902</id><published>2009-01-29T23:25:00.001+01:00</published><updated>2009-05-29T22:47:54.056+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='detail texturing'/><title type='text'>Playing with detail texturing</title><content type='html'>Playing with detail texturing.&lt;br /&gt;&lt;br /&gt;First creating detail material map for each tile, computed from terrain data - elevation, slope and curvature, using two additional fractal channels for mixing.&lt;br /&gt;The algorithm first computes slope, if it's steeper than some defined angle of repose it's considered to be a rock.&lt;br /&gt;I'm not using slope directly here though - a positive (convex) curvature is used to boost the slope slightly to make rocks more protruding at the top.&lt;br /&gt;&lt;br /&gt;Gradual slopes and flat parts can use one of three textures. The mixing is done using one fractal channel. The first texture is default, the two other textures have some coherent probability of occurrence, that is additionally altered so they are more likely to occur on gradual slopes (dryer grass) or flat parts, respectively.&lt;br /&gt;&lt;br /&gt;Yet another fractal channel is used for coloring - slight modification of texture colors to break the monotonous pattern on large flat areas.&lt;br /&gt;&lt;br /&gt;The textures didn't come from an artist so all the patterns are my fault.&lt;br /&gt;Also, due to &lt;a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=522198"&gt;this bug&lt;/a&gt; I can't have anisotropic filtering on atlas textures yet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k076.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t076.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k077.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t077.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/k079.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t079.jpg"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-7702180067730951902?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/7702180067730951902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=7702180067730951902' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7702180067730951902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7702180067730951902'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2009/01/playing-with-detail-texturing.html' title='Playing with detail texturing'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-4770035736661144391</id><published>2008-12-03T05:55:00.000+01:00</published><updated>2009-05-25T15:12:23.141+02:00</updated><title type='text'>vimeo</title><content type='html'>We tried Vimeo's HD videos and the result is &lt;a href="http://vimeo.com/2385874"&gt;here&lt;/a&gt;, with music giving it somewhat different mood &lt;img src="http://www.gamedev.net/community/forums/images/smileys/oh.gif" border="0"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2385874"&gt;&lt;img src="http://images.vimeo.com/20/37/99/203799082/203799082_96.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Only afterwards I noticed that the function computing the tree distribution stopped working correctly after some variables (namely the local terrain curvature) changed in magnitude as they are computed slightly differently. So the trees now grow on much steeper slopes than they should. I won't deal with it now, it has to be reworked into a generic vegetation placement module anyway, when climate info becomes available.&lt;br /&gt;&lt;br /&gt;Just now I have to optimize tile manager and generator because it not very efficiently handles GPU memory.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-4770035736661144391?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/4770035736661144391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=4770035736661144391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/4770035736661144391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/4770035736661144391'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2008/12/vimeo.html' title='vimeo'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-471624134197608822</id><published>2008-11-22T06:24:00.000+01:00</published><updated>2009-05-25T15:12:23.141+02:00</updated><title type='text'>Flying above forest</title><content type='html'>Managed to finish some other tasks before the shadows and detail ground textures.&lt;br /&gt;&lt;br /&gt;First was placing objects on terrain, with persistence to cache. Later the local cache will be synced with a server, which will be also used to retrieve objects existing anywhere in the world, placed there by other users. We plan a multiplayer demo where users could build their own cities or settlements, and also visit other people scattered on Earth. Still a long way there, though.&lt;br /&gt;&lt;br /&gt;Also modified tree rendering so that the boundaries between trees and more distant areas where trees are rendered as solid color are almost invisible. There is a better tree model used too. Now I should focus on the ground texture generation because its the ugliest part there.&lt;br /&gt;&lt;br /&gt;Here is video with the new stuff:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=lYHRqRto9KU&amp;amp;fmt=6"&gt;&lt;img src="http://i1.ytimg.com/vi/lYHRqRto9KU/1.jpg"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-471624134197608822?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/471624134197608822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=471624134197608822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/471624134197608822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/471624134197608822'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2008/11/flying-above-forest.html' title='Flying above forest'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-5073600128717264625</id><published>2008-11-07T07:41:00.000+01:00</published><updated>2009-05-25T15:12:23.142+02:00</updated><title type='text'>Collisions - terrain vs. Jose</title><content type='html'>I am now reading the generated terrain tile data back from GPU and doing basic collision testing (ray vs. terrain). We test it with one model of man we call &lt;a href="http://www.youtube.com/watch?v=DS1cpMZ14xE"&gt;Jose Jalapeno&lt;/a&gt;, because of the lacking animation. &lt;img src="http://www.gamedev.net/community/forums/images/smileys/smile.gif" border="0"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/s023.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t023.jpg"&gt;&lt;/a&gt; &lt;a href="http://members.gamedev.net/cameni/s024.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t024.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The yellow lines that are visible somewhere mark the boundaries of the tile where Jose currently resides - without this we cannot possibly find him in the world, ever.&lt;br /&gt;&lt;br /&gt;We are currently working also on several other things too:&lt;ul&gt;&lt;li&gt;Finally adding the shadows. We waited with these until quad-tree traversal would be right&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Detailed ground textures, selected by several parameters: climate, bedrock or soil type, terrain slope and curvature etc.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Elevation datasets with better detail - 30m resolution for many mountain ranges, along with additional datasets for whole world with climate data. These will be used to select the ground material sets and to condition various other subsystems, like vegetation probabilities or modification of fractal algorithm parameters by bedrock type or other local terrain attributes.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-5073600128717264625?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/5073600128717264625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=5073600128717264625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5073600128717264625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5073600128717264625'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2008/11/collisions-terrain-vs-jose.html' title='Collisions - terrain vs. Jose'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-7040262221436410136</id><published>2008-10-20T00:17:00.001+02:00</published><updated>2009-05-29T22:48:23.562+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xnview'/><title type='text'>xnview plugin</title><content type='html'>We created XnView plugin for viewing terrain elevation maps (raw or srtm files) to help us visualize input heightfield data in any combination of format (8-, 16- or 32-bit depth, signed or unsigned, integer or floating point, endianness etc.).&lt;br /&gt;&lt;br /&gt;The plugin also autodetects image dimensions by computing row correlation coefficient for all possible image dimensions (i.e. the dimensions that give the correct file size for specified image options)&lt;br /&gt;&lt;br /&gt;Find it &lt;a href="http://outerra.com/xnview"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://outerra.com/xnview"&gt;&lt;img src="http://members.gamedev.net/cameni/xnview.jpg"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-7040262221436410136?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/7040262221436410136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=7040262221436410136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7040262221436410136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/7040262221436410136'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2008/10/xnview-plugin.html' title='xnview plugin'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-4757903439623043682</id><published>2008-08-29T23:13:00.000+02:00</published><updated>2009-05-25T15:12:23.142+02:00</updated><title type='text'>Tree placement</title><content type='html'>In addition to the elevations that are read from wavelet-compressed dataset and then refined by fractal algorithm, the engine computes 3 other fractal channels in parallel. These contain 'normal' fractals that will be used as source for coherent random values for various engine parts.&lt;br /&gt;&lt;br /&gt;First of these channels was used to enhance the tree placement algorithm. The algorithm in fragment shader first computes the probability of tree being there, according to elevation, slope and terrain curvature. If the actual tree occurrence is determined by comparing the probability against a fixed threshold, it results in large continuous forest areas. The fractal channel provides threshold value that changes continuously and modifies the probability threshold, that results in clearings and woods, but an occasional lonely tree too.&lt;br /&gt;&lt;br /&gt;Here is a short video, flying from somewhere in Europe to Africa:&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=bvlOEkm47WU&amp;amp;fmt=6"&gt;&lt;img src="http://i3.ytimg.com/vi/z68cQUGmcX4/default.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;An earlier video without the trees, where angrypig madly flies and turns around &lt;img src="http://www.gamedev.net/community/forums/images/smileys/totally.gif" border="0"&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=-qHi_duhNJo&amp;amp;fmt=6"&gt;&lt;img src="http://i2.ytimg.com/vi/-qHi_duhNJo/default.jpg"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-4757903439623043682?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/4757903439623043682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=4757903439623043682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/4757903439623043682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/4757903439623043682'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2008/08/tree-placement.html' title='Tree placement'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-6499279279210962224</id><published>2008-08-22T09:37:00.001+02:00</published><updated>2009-05-25T22:03:29.568+02:00</updated><title type='text'>Atmospheric scattering</title><content type='html'>I've implemented atmospheric scattering as described by Sean O'Neil, with some modifications and endless tweaking. I'm still not quite satisfied, though, but I'll return to it later.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/s021.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t021.jpg" /&gt;&lt;/a&gt; &lt;a href="http://members.gamedev.net/cameni/s020.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t020.jpg" /&gt;&lt;/a&gt; &lt;a href="http://members.gamedev.net/cameni/s019.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t019.jpg" /&gt;&lt;/a&gt; &lt;a href="http://members.gamedev.net/cameni/s018.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t018.jpg" /&gt;&lt;/a&gt; &lt;a href="http://members.gamedev.net/cameni/s017.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t017.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Meanwhile the other two lethargic programmers are presently awakened too.&lt;br /&gt;Angrypig &lt;img src="http://www.gamedev.net/community/forums/images/smileys/pig.gif" border="0" /&gt; is working on tree generator that will produce all levels of detail needed for tree&amp;amp;forest rendering, from detailed models through continuously simplified and increasingly unified models down to billboards.&lt;br /&gt;&lt;img src="http://members.gamedev.net/cameni/p001.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Jonsky &lt;img src="http://www.gamedev.net/community/forums/images/smileys/disturbed.gif" border="0" /&gt; is modifying the toolchain used to process heightfield maps for the engine (currently used to process earth's elevation data - remapping and wavelet compression). This can be then used to create custom planets; in fact he is currently testing it with the heightfield map of Tolkien's Middle-earth. When we release a demo you will be able to fly over that fantasy planet, or land in Mordor &lt;img src="http://www.gamedev.net/community/forums/images/smileys/evil.gif" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;So if people are interested, we could release some flyable demo sometime in the near future, with the possibility to define your own world using the heightfield map patches, specifying elevations in some rougher resolution. Fractal algorithm computes the details, vegetation is placed by algorithm taking terrain properties into account. One thing still missing are the climatic maps so we could generate deserts and steppes and so on; but this one still requires some thinking.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-6499279279210962224?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/6499279279210962224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=6499279279210962224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6499279279210962224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/6499279279210962224'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2008/08/atmospheric-scattering.html' title='Atmospheric scattering'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-9172991605242221292</id><published>2008-08-03T07:34:00.000+02:00</published><updated>2009-05-25T15:12:23.143+02:00</updated><title type='text'>Lots of trees</title><content type='html'>We've added some simple, crude billboard trees into the terrain. These are generated in fragment shader after the tile elevation map is computed. There can be one tree in roughly each 2x2 meter square; whether there actually is one is determined by an ecotype probability equation that takes into account elevation, slope and curvature of the terrain. There's currently just a testing one, producing a single type of tree. Everything is computed in shaders, billboards are created using render-to-vbo technique.&lt;br /&gt;&lt;br /&gt;Now there are more than 500 000 trees rendered as billboards, but the furthermost ones are just a pixel high. Even more distant tiles, that have texels covering larger area than 2x2 meters have the trees just baked in as colors (in a marketing-speak it would read as hundreds of millions trees rendered, but if you get to that parts you'd really see the trees there, so .. &lt;img src="http://www.gamedev.net/community/forums/images/smileys/cool.gif" border="0"&gt;). I shall use a different approach for the far billboards though - the frame rate dropped considerably, from 350-600 to about 60-100 with the trees (on 8800GT), and it chokes ati x1600 mobility on my nb to ~12 fps.&lt;br /&gt;&lt;br /&gt;Nevertheless the trees nicely show the scale of the world and the ranges of detail that is generated by the fractal algorithm.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/s014.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t014.jpg"&gt;&lt;/a&gt; &lt;a href="http://members.gamedev.net/cameni/s015.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t015.jpg"&gt;&lt;/a&gt; &lt;a href="http://members.gamedev.net/cameni/s016.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t016.jpg"&gt;&lt;/a&gt; &lt;a href="http://members.gamedev.net/cameni/s013.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t013.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Replying to the comments in the previous entry - we should soon produce some videos too. That is, if the other two lethargic programmers here manage to create something during my one week offline vacation (going to forests &lt;strike&gt;to observe tree distribution patterns&lt;/strike&gt; &lt;strike&gt;to think about optimizing the forest rendering&lt;/strike&gt; .. to rest &lt;img src="http://www.gamedev.net/community/forums/images/smileys/wink.gif" border="0"&gt;)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-9172991605242221292?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/9172991605242221292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=9172991605242221292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/9172991605242221292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/9172991605242221292'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2008/08/lots-of-trees.html' title='Lots of trees'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4217826068942535587.post-5439938465291581808</id><published>2008-07-31T08:14:00.000+02:00</published><updated>2009-05-25T15:12:23.143+02:00</updated><title type='text'>Intro</title><content type='html'>Hi everybody.&lt;br /&gt;I'd like to introduce our project - a planetary engine.&lt;br /&gt;&lt;br /&gt;Features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Planetary engine that can be used with an elevation dataset, enhancing its resolution using fractal algorithms. Resolution of the elevation data is arbitrary, fractal algorithms further refine the detail down to under-foot resolution. It's possible to have a completely random fractal terrain too, or to sketch the terrain in rough resolution and have the fractal to generate the details.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Level of detail ranging from thousands of kilometers down to centimeters.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Currently working with earth elevation data (3arc sec dataset remapped to cube faces with roughly 150m resolution).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Elevation data are packed using a modifed wavelet compression, the required level of detail can be extracted effectively on the fly. Decompression done on GPU.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Finer resolution tiles are generated by fractal algorithm entirely on the GPU.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Textures are generated on the GPU from the fractal data using per-pixel computed elevation, slope and terrain curvature; later a material mapper would also utilize climatic data, bedrock maps etc. to more accurately texture the world.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fully asynchronous engine using OpenGL, majority of the algorithms running on the GPU&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;There are many things to do, though - the material mapper, detail textures, atmospheric model, rendering rivers and water bodies, vegetation etc.&lt;br /&gt;&lt;br /&gt;Now some pixel food.&lt;br /&gt;&lt;br /&gt;Approaching earth. Until we implement the atmosphere, space is full of air :-)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/s001.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t001.jpg"&gt;&lt;/a&gt;&lt;a href="http://members.gamedev.net/cameni/s002.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t002.jpg"&gt;&lt;/a&gt;&lt;a href="http://members.gamedev.net/cameni/s003.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t003.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Heading towards High Tatras in central europe.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/s004.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t004.jpg"&gt;&lt;/a&gt;&lt;a href="http://members.gamedev.net/cameni/s005.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t005.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fractal refinement starts to show up. Original elevation data have resolution ~152 meters.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/s006.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t006.jpg"&gt;&lt;/a&gt;&lt;a href="http://members.gamedev.net/cameni/s007.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t007.jpg"&gt;&lt;/a&gt;&lt;a href="http://members.gamedev.net/cameni/s008.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t008.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That rock over there ..&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/s009.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t009.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;.. is roughly 4 meters wide, completely fractal generated.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://members.gamedev.net/cameni/s010.jpg"&gt;&lt;img src="http://members.gamedev.net/cameni/t010.jpg"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4217826068942535587-5439938465291581808?l=outerra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://outerra.blogspot.com/feeds/5439938465291581808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4217826068942535587&amp;postID=5439938465291581808' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5439938465291581808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4217826068942535587/posts/default/5439938465291581808'/><link rel='alternate' type='text/html' href='http://outerra.blogspot.com/2008/07/intro.html' title='Intro'/><author><name>Brano Kemen</name><uri>https://profiles.google.com/114695058354540083700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Pgt-QEbRUWI/AAAAAAAAAAI/AAAAAAAAAIA/fEeSZA3tpQ0/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry></feed>
