<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CEYCQ34-fSp7ImA9WhZWFkk.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011</id><updated>2011-05-17T20:22:42.055+06:00</updated><category term="boost" /><category term="outdoor" /><category term="lod" /><category term="demo fog" /><category term="vegetation" /><category term="fun" /><category term="generation" /><category term="landscape" /><category term="demo" /><category term="lighting" /><category term="useful" /><category term="thoughts" /><title>Naughty Samurai</title><subtitle type="html">^_^</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://timai-ru.blogspot.com/" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/timai" /><feedburner:info uri="timai" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DEQCR3s7fyp7ImA9WxdSGEU.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-8554704416268541904</id><published>2008-05-27T16:30:00.003+06:00</published><updated>2008-05-27T17:06:06.507+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-27T17:06:06.507+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="demo fog" /><title>Volumetric fog</title><content type="html">Недавно, когда я проходил собеседование в одну компанию, был задан вопрос о тумане - типы, примеры реализации и т.д. И вот тогда я вспомнил, что давно хотел пощупать volumetric fog, но всё как-то руки не доходили. Время свободное есть, почему бы не попробывать?&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Volumetric fog&lt;/B&gt;&lt;br /&gt;Для начала - что же такое volumetric fog (объёмный туман) и для чего он нужен? У &lt;A href="http://www.gamedev.ru/terms/Fog"&gt;обычного тумана&lt;/A&gt; есть один недостаток - он окутывает всю сцену. Этого обычно достаточно чтобы воссоздать вид "утреннего тумана", но если мы хотим сделать нечто посложнее, например, туман, стелющийся по земле, то эта техника не подходит.&lt;br /&gt;Нужно придать ему форму. Как? Сейчас это выясним.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/8_01.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_8_01.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Чуточку теории&lt;/B&gt;&lt;br /&gt;Туман — форма выделения паров воды в виде микроскопических капель или ледяных кристаллов, которые, собираясь в приземном слое атмосферы, делают воздух менее прозрачным [&lt;A href="http://ru.wikipedia.org/wiki/Туман"&gt;link&lt;/A&gt;].&lt;br /&gt;Если опустить детали, то туман - это частицы, частично препятствующие видимости. И, соответственно, чем больше этих частиц между наблюдателем и объектом, тем хуже этот объект видно. В компьютерной графике обычно используют 2 формулы для определения степени видимости в точке - &lt;A href="http://www.gamedev.ru/terms/LinearFog"&gt;линейную&lt;/A&gt; и &lt;A href="http://www.gamedev.ru/terms/ExpFog"&gt;экспоненциальную&lt;/A&gt;.&lt;br /&gt;Я в своём примере буду использовать линейный тип.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Снятие глубины. Depth texture&lt;/B&gt;&lt;br /&gt;Для реализации задуманного нам нужно будет снимать глубину сцены. Вкратце опишу что это такое (если вдруг кто забыл).&lt;br /&gt;Очень часто для реализации определенных техник может понадобиться доступ к depth buffer сцены, но в DX9 это не так просто. Что делать? На помощь приходит специальный текстурный формат - &lt;i&gt;D3DFMT_R32F&lt;/i&gt;, который позволяет писать 32-х битный float в текстуру.&lt;br /&gt;&lt;br /&gt;1) Создаём текстуру данного формата с размерами, идентичными размеру окна (разумеется один раз, а не на каждый кадр)&lt;br /&gt;2) Выставляем её в качестве &lt;i&gt;render target&lt;/i&gt;&lt;br /&gt;3) Устанавливаем специальный шейдер&lt;br /&gt;4) Рисуем сцену&lt;br /&gt;5) Возвращаем оригинальный render target&lt;br /&gt;&lt;br /&gt;Рекомендую так же создать отдельный &lt;i&gt;depth stencil surface&lt;/i&gt; для всех &lt;i&gt;render to texture&lt;/i&gt; проходов, ибо это позволит избежать многих проблем (в т.ч. с &lt;i&gt;multisampling&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;Шейдер может выглядеть так:&lt;br /&gt;&lt;TABLE width="100%" bgColor=#f2f2f2&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;float4x4&lt;/FONT&gt; &lt;FONT color=#000000&gt;g_wvp&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; &lt;FONT color=#000000&gt;vs_depth&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;inout&lt;/FONT&gt; &lt;FONT color=#000000&gt;float4&lt;/FONT&gt; &lt;FONT color=#000000&gt;pos&lt;/FONT&gt;   &lt;FONT color=#c8003c&gt;:&lt;/FONT&gt; &lt;FONT color=#000000&gt;POSITION&lt;/FONT&gt;  &lt;FONT color=#c8003c&gt;,&lt;/FONT&gt;&lt;br /&gt;                 &lt;FONT color=#000000&gt;out&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;float&lt;/FONT&gt;  &lt;FONT color=#000000&gt;depth&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;:&lt;/FONT&gt; &lt;FONT color=#000000&gt;TEXCOORD0&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;)&lt;/FONT&gt;&lt;br /&gt;&lt;FONT color=#c8003c&gt;{&lt;/FONT&gt;&lt;br /&gt;    &lt;FONT color=#000000&gt;pos&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;mul&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;pos&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;g_wvp&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;);&lt;/FONT&gt;&lt;br /&gt;    &lt;FONT color=#000000&gt;depth&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;pos&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;z&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;/FONT&gt;&lt;br /&gt;&lt;FONT color=#c8003c&gt;}&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#000000&gt;float4&lt;/FONT&gt; &lt;FONT color=#000000&gt;ps_depth&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;in&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;float&lt;/FONT&gt; &lt;FONT color=#000000&gt;depth&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;:&lt;/FONT&gt; &lt;FONT color=#000000&gt;TEXCOORD0&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;)&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;:&lt;/FONT&gt; &lt;FONT color=#000000&gt;COLOR&lt;/FONT&gt;&lt;br /&gt;&lt;FONT color=#c8003c&gt;{&lt;/FONT&gt;&lt;br /&gt;    &lt;FONT color=#0000ff&gt;return&lt;/FONT&gt; &lt;FONT color=#000000&gt;float4&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;depth&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#40b440&gt;0.&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#40b440&gt;f&lt;/FONT&gt;&lt;/B&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#40b440&gt;0.&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#40b440&gt;f&lt;/FONT&gt;&lt;/B&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#40b440&gt;0.&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#40b440&gt;f&lt;/FONT&gt;&lt;/B&gt; &lt;FONT color=#c8003c&gt;);&lt;/FONT&gt;&lt;br /&gt;&lt;FONT color=#c8003c&gt;}&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD align=right&gt;&lt;B&gt;&lt;I&gt;&lt;A href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;FONT color=#727272 size=1&gt;_Winnie C++ Colorizer&lt;/FONT&gt;&lt;/A&gt;&lt;/I&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;&lt;br /&gt;Хочу обратить внимание на строчку&lt;br /&gt;&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#000000"&gt;depth&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;pos&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;z&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Это т.н. "быстрый" расчёт глубины. Для повышения точности рекомендуют использовать формулу:&lt;br /&gt;&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#000000"&gt;depth&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;distance&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;world_pos&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;camera_eye_pos&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;где&lt;br /&gt;&lt;I&gt;&amp;nbsp; world_pos&lt;/I&gt; - вершина, трансформированная по мировой матрицы&lt;br /&gt;&lt;I&gt;&amp;nbsp; camera_eye_pos&lt;/I&gt; - положение наблюдателя.&lt;br /&gt;&lt;br /&gt;Но для нашего случая высокая точность не обязательна, поэтому будем использовать "быстрый" вариант.&lt;br /&gt;&lt;br /&gt;После этого прохода мы получим текстуру, в red-компоненте которой будет лежать глубина данного пикселя.&lt;br /&gt;&lt;br /&gt;&lt;I&gt;&lt;STRONG&gt;Hint:&lt;/STRONG&gt; во время съёма &lt;i&gt;depth&lt;/i&gt;-текстуры существует одна тонкость. Если мы делаем &lt;i&gt;IDirect3DDevice9::Clear&lt;/i&gt; и в качестве параметра цвета задаём значением 0x00ff0000 (красный цвет), то в финальной текстуре мы и получим в качестве глубины 1.f.&lt;br /&gt;Т.е. к примеру на сцене у нас один единственный объект - чайник. На &lt;i&gt;depth&lt;/i&gt;-текстуре на месте этого чайника глубина будет правильная, в вот вся остальная область будет забита единицами. Как будто на расстоянии 1.f от камеры мы нарисовали плоскость перекрывающую весь экран. &lt;br /&gt;Такая проблема редкость, ибо в игровых проектах сцена занимает всю область экрана (даже &lt;i&gt;D3DCLEAR_TARGET&lt;/i&gt; флаг выставлять не нужно). Но если всё же надо грамотно очистить - рисуйте большой (больше сцены) куб во время снятия глубины в текстуру, с &lt;i&gt;D3DCULL_CW&lt;/i&gt; (по часовой). Это заполнит текстуру правильными значениями.&lt;/I&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/8_02.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_8_02.jpg" width=500 height=188 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Создаём туман&lt;/B&gt;&lt;br /&gt;В качестве формы тумана можно использовать любую геометрию. Единственное условие - она должна быть замкнутой. Почему - будет понятно по ходу объяснений.&lt;br /&gt;Как действует туман? Степень видимости объекта зависит от того, через какой количество частиц тумана прошёл луч света от объекта до глаза. Соответственно если мы можем определить "количество" тумана, лежащего между камерой и объектом, мы можем расчитать степень видимости в данной точке. Как это сделать?&lt;br /&gt;&lt;br /&gt;1) Для начала нам нужно создать &lt;i&gt;depth&lt;/i&gt;-текстуру с "задними" полигонами геометрии тумана. Как это делается, я описал выше. Есть 3 "но":&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a) Очищаем текстуру (&lt;i&gt;IDirect3DDevice9::Clear&lt;/i&gt;) с параметром &lt;i&gt;Z&lt;/i&gt; = 0.f (а не &lt;i&gt;Z&lt;/i&gt; = 1.f как обычно)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; b) Меняем render state &lt;i&gt;D3DRS_ZFUNC&lt;/i&gt; на &lt;i&gt;D3DCMP_GREATER&lt;/i&gt; (вместо &lt;i&gt;D3DCMP_LESSEQUAL&lt;/i&gt;), это заставит работать &lt;i&gt;depth-buffer&lt;/i&gt; "наоборот"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; c) Выставляем &lt;i&gt;D3DRS_CULLMODE&lt;/i&gt; в &lt;i&gt;D3DCULL_CW&lt;/i&gt;( вместо &lt;i&gt;D3DCULL_CCW&lt;/i&gt; )&lt;br /&gt;&lt;br /&gt;2) Cоздаём &lt;i&gt;depth&lt;/i&gt;-текстуру для "передних" полигонов тумана. Тут всё как обычно.&lt;br /&gt;&lt;br /&gt;В результате мы имеем 2 текстуры с "началом" и "концом" тумана в каждой точке. Зная это, можно без проблем найти "плотность" тумана для каждого пикселя сцены.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Туманим&lt;/B&gt;&lt;br /&gt;Рисовать будем так - на уже отрендеренную сцену накладываем прямоугольник из 2-х полигонов со специальным шейдером. Как при постпроцессинге, да.&lt;br /&gt;&lt;br /&gt;Степень "затуманенности" каждого пикселя может посчитать по формуле:&lt;br /&gt;&lt;br /&gt;&lt;DIV align=center&gt;&lt;B&gt;&lt;I&gt;k = ( fog_back - fog_front ) * fog_density&lt;/I&gt;&lt;/B&gt;&lt;/DIV&gt;где&lt;br /&gt;&lt;I&gt;&amp;nbsp; fog_back&lt;/I&gt; - расстояние от камеры до "задней" части тумана&lt;br /&gt;&lt;I&gt;&amp;nbsp; fog_front&lt;/I&gt; - расстояние от камеры до "передней" части тумана&lt;br /&gt;&lt;I&gt;&amp;nbsp; fog_density&lt;/I&gt; - коэффициент плотности. Через расстояние dist * fog_density туман полностью скроет объект.&lt;br /&gt;&lt;br /&gt;Всё хорошо, но полученный туман игнорирует объекты сцены. Чтобы исправить это, нужно снять глубину самой сцены (она так же нужна для таких вещей для soft particles или depth of field) и немного изменить нашу формулу.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;i&gt;k = ( ( fog_back &amp;lt; scene_depth ? fog_back : scene_depth ) - fog_front ) * fog_density&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;где&lt;br /&gt;&amp;nbsp; scene_depth - глубина сцены в данной точке&lt;br /&gt;&lt;br /&gt;Если Вы не любите IF'ы в шейдере, то можно написать так:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;i&gt;k = ( ( fog_back - fog_front ) - ( fog_back - clamp( scene_depth, 0, fog_back ) ) * fog_density&lt;/i&gt;&lt;/b&gt;&lt;/div&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Alpha blending&lt;/b&gt;&lt;br /&gt;Пару слов о том, как накладывать полученное изображение на сцену.&lt;br /&gt;В случае когда мы имеем дело с белым туманом - всё просто, достаточно выставить аддитивный блендинг и выводить цвет как&lt;br /&gt;&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#0000FF"&gt;return&lt;/font&gt; &lt;font color="#000000"&gt;float4&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;fog_color&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;k&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#40B440"&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Но в случае если мы захотим использовать цвет отличный от белого, то появятся артефакты. Почему? Аддитивный блендинг считается по формуле:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;i&gt;res_color = src_color + dest_color&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Предположим что у нас зелёный туман закрывает красный объект. Что мы получим?&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;b&gt;res_color = ( 0.f, 1.f, 0.f ) + ( 1.f, 0.f, 0.f ) = ( 1.f, 1.f, 0 )&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;Внезапно! Желтый цвет.&lt;br /&gt;&lt;br /&gt;Как этого избежать? Выставляем &lt;i&gt;src_blend = D3DBLEND_SRCALPHA&lt;/i&gt;, &lt;i&gt;dest_blend = D3DBLEND_INVSRCALPHA&lt;/i&gt; и выводим цвет как&lt;br /&gt;&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#0000FF"&gt;return&lt;/font&gt; &lt;font color="#000000"&gt;float4&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;fog_color&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;k&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/8_03.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_8_03.jpg" width=500 height=188 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Последний этап&lt;/b&gt;&lt;br /&gt;Вся подготовка завершена, теперь можно рисовать полученные туманности.&lt;br /&gt;Шейдер отрисовки тумана ( всё очень просто ):&lt;br /&gt;&lt;TABLE width="100%" bgColor=#f2f2f2&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;float4&lt;/FONT&gt; &lt;FONT color=#000000&gt;ps_draw_fog&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;in&lt;/FONT&gt; &lt;FONT color=#000000&gt;float2&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;:&lt;/FONT&gt; &lt;FONT color=#000000&gt;TEXCOORD0&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;)&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;:&lt;/FONT&gt; &lt;FONT color=#000000&gt;COLOR&lt;/FONT&gt;&lt;br /&gt;&lt;FONT color=#c8003c&gt;{&lt;/FONT&gt;&lt;br /&gt;    &lt;FONT color=#0000ff&gt;float&lt;/FONT&gt; &lt;FONT color=#000000&gt;fog_back&lt;/FONT&gt;    &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex2D&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;s_fog_back&lt;/FONT&gt;    &lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;).&lt;/FONT&gt;&lt;FONT color=#000000&gt;r&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;/FONT&gt;&lt;br /&gt;    &lt;FONT color=#0000ff&gt;float&lt;/FONT&gt; &lt;FONT color=#000000&gt;fog_front&lt;/FONT&gt;   &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex2D&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;s_fog_front&lt;/FONT&gt;   &lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;).&lt;/FONT&gt;&lt;FONT color=#000000&gt;r&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;/FONT&gt;&lt;br /&gt;    &lt;FONT color=#0000ff&gt;float&lt;/FONT&gt; &lt;FONT color=#000000&gt;scene_depth&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex2D&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;s_scene_depth&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;).&lt;/FONT&gt;&lt;FONT color=#000000&gt;r&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;/FONT&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;FONT color=#0000ff&gt;float&lt;/FONT&gt; &lt;FONT color=#000000&gt;k&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;fog_back&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;-&lt;/FONT&gt; &lt;FONT color=#000000&gt;fog_front&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;/FONT&gt;&lt;br /&gt;    &lt;FONT color=#000000&gt;k&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;-=&lt;/FONT&gt; &lt;FONT color=#000000&gt;fog_back&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;-&lt;/FONT&gt; &lt;FONT color=#000000&gt;clamp&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;scene_depth&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#40b440&gt;0&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;fog_back&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;);&lt;/FONT&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;FONT color=#0000ff&gt;return&lt;/FONT&gt; &lt;FONT color=#000000&gt;float4&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;g_fog_color&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;k&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;*&lt;/FONT&gt; &lt;FONT color=#000000&gt;g_fog_density&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;);&lt;/FONT&gt;&lt;br /&gt;&lt;FONT color=#c8003c&gt;}&lt;/FONT&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD align=right&gt;&lt;B&gt;&lt;I&gt;&lt;A href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;FONT color=#727272 size=1&gt;_Winnie C++ Colorizer&lt;/FONT&gt;&lt;/A&gt;&lt;/I&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;&lt;br /&gt;Что мы получили в итоге:&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/8_04.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_8_04.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Да, кстати, камеру можно помещать внутрь тумана, рисоваться будет по прежнему правильно:&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/8_05.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_8_05.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Итого&lt;/b&gt;&lt;br /&gt;Техника получилась довольно простая (на написании статьи ушло больше времени) и лёгкая в реализации. К тому же, её не сложно прикрутить к уже готовому движку, ибо не нужно вносить существенных изменений в &lt;i&gt;render pipeline&lt;/i&gt;. Все действия можно производить после окончательного рендера сцены (но до постпроцессинга).&lt;br /&gt;&lt;br /&gt;Где это можно использовать? На вскидку:&lt;br /&gt;1) Непосредственно сам объёмный туман&lt;br /&gt;2) Пар стелящийся по земле. В этом случае можно оптимизировать алгоритм и убрать 1 проход&lt;br /&gt;3) Добавить вершинную анимацию, чтобы туман "заиграл"&lt;br /&gt;4) Вода. Мутная вода. Жидкости в больших сосудах&lt;br /&gt;5) Volumetric light&lt;br /&gt;6) Игровые эффекты. Можно сделать симпатичных "призраков"&lt;br /&gt;7) Добавить анимированную текстуру для выборки альфы - пар или дым&lt;br /&gt;8) Мелькает мысль про использования схожего алгоритма для теней. Должно получиться любопытно, ибо можно сделать очень "мягкие" тени&lt;br /&gt;&lt;br /&gt;Ну и ещё в нагрузку пару картинок&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/8_06.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_8_06.jpg" width=250 height=188 border=0&gt;&lt;/a&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/8_07.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_8_07.jpg" width=250 height=188 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/8_08.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_8_08.jpg" width=250 height=188 border=0&gt;&lt;/a&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/8_09.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_8_09.jpg" width=250 height=188 border=0&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1166717357843559011-8554704416268541904?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/DCqvTf5ERjQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/8554704416268541904/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=8554704416268541904" title="Комментарии: 7" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/8554704416268541904?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/8554704416268541904?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/DCqvTf5ERjQ/blog-post.html" title="Volumetric fog" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>7</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2008/05/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MMQnc4cSp7ImA9WxZSFEo.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-7665219649336227188</id><published>2008-01-28T01:34:00.000+05:00</published><updated>2008-01-28T03:04:43.939+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-28T03:04:43.939+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><category scheme="http://www.blogger.com/atom/ns#" term="vegetation" /><category scheme="http://www.blogger.com/atom/ns#" term="outdoor" /><title>Растительность. Часть 3( заключительная ). Ветер</title><content type="html">&lt;b&gt;Ветер&lt;/b&gt;&lt;br /&gt;Пришло время оживить нашу растительность. Для этого придётся добавить немного ветра.&lt;br /&gt;Физика стеблей очень похожа на физику резиновой палки ( звучит тупо, знаю ). Если к нему прикладывать силу, он отклониться,  но стоит силе исчезнуть, стебель вернётся к своей первоначальной форме.&lt;br /&gt;&lt;br /&gt;Для начала нужно определить несколько новых коэффициентов.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;max_deflection&lt;/i&gt; - максимальное расстояние, на которое может отклониться куст. &lt;br /&gt;&lt;i&gt;flex&lt;/i&gt; - На сколько отклонится стебель при ветре 1м/с.&lt;br /&gt;&lt;i&gt;recovery_speed&lt;/i&gt; - С какой скоростью модель будет возвращаться к своей первоначальной форме.&lt;br /&gt;&lt;br /&gt;Высчитываем смещение стеблей.&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#0000FF"&gt;static&lt;/font&gt; &lt;font color="#000000"&gt;vec2&lt;/font&gt; &lt;font color="#000000"&gt;current_offset&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;current_offset_lenght&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;vec_lenght&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;current_offset&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#808080"&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#000000"&gt;vec2&lt;/font&gt; &lt;font color="#000000"&gt;recovery_dir&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;vec_normalize&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;recovery_dir&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#C8003C"&gt;-&lt;/font&gt;&lt;font color="#000000"&gt;current_offset&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#808080"&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;deflection_k&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;current_offset_lenght&lt;/font&gt; &lt;font color="#C8003C"&gt;/&lt;/font&gt; &lt;font color="#000000"&gt;max_deflection&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;wind_power&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;wind_speed&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;flex&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;time_step&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;recovery_power&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;recovery_speed&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;deflection_k&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;time_step&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#808080"&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#000000"&gt;current_offset&lt;/font&gt; &lt;font color="#C8003C"&gt;+=&lt;/font&gt; &lt;font color="#000000"&gt;wind_dir&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;wind_power&lt;/font&gt; &lt;font color="#C8003C"&gt;+&lt;/font&gt; &lt;font color="#000000"&gt;recovery_dir&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;recovery_power&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;clamp&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;current_offset&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;x&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;current_offset&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;x&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#C8003C"&gt;-&lt;/font&gt;&lt;font color="#000000"&gt;max_deflection&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#C8003C"&gt;+&lt;/font&gt;&lt;font color="#000000"&gt;max_deflection&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;clamp&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;current_offset&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;y&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;current_offset&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;y&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#C8003C"&gt;-&lt;/font&gt;&lt;font color="#000000"&gt;max_deflection&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#C8003C"&gt;+&lt;/font&gt;&lt;font color="#000000"&gt;max_deflection&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Как видно из вышеуказанного кода, на куст действует одновременно 2 силы - ветер и восстановление.  Когда ветер стихает, модель возвращается к своей первоначальной форме.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Кстати, ветер у нас 2-хмерный( т.к. вверх/вниз трава не деформируется ). Поэтому считаем смещение  только по X и Z осям.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Трава у нас стала "подчинятся" ветру, но этого мало. В реальном мире она "колышется". Этот эффект( в  основном ) достигается за счёт того что ветер никогда не бывает статичным. Он постоянно меняет своё  направление и силу в небольшом диапазоне.&lt;br /&gt;&lt;br /&gt;Реализовать этот эффект можно, к примеру, так:&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#0000FF"&gt;const&lt;/font&gt; &lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;wind_minmax_k&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#40B440"&gt;0.5&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;wind_max_power&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;wind_power&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;wind_min_power&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;wind_power&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;wind_minmax_k&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#808080"&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;static&lt;/font&gt; &lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;wind_amplitude&lt;/font&gt;       &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;static&lt;/font&gt; &lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;wind_amplitude_dir&lt;/font&gt;   &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#40B440"&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;const&lt;/font&gt;  &lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;wind_amplitude_speed&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#40B440"&gt;0.5&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#808080"&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;rand_k&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;lerp&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#40B440"&gt;0.25&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#40B440"&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;rand&lt;/font&gt;&lt;font color="#C8003C"&gt;()&lt;/font&gt; &lt;font color="#C8003C"&gt;/&lt;/font&gt; &lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;RAND_MAX&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#808080"&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#000000"&gt;wind_amplitude&lt;/font&gt; &lt;font color="#C8003C"&gt;+=&lt;/font&gt; &lt;font color="#000000"&gt;wind_amplitude_speed&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;wind_amplitude_dir&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;m_time_step&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;rand_k&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;wind_amplitude&lt;/font&gt; &lt;font color="#C8003C"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#40B440"&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color="#C8003C"&gt;||&lt;/font&gt; &lt;font color="#000000"&gt;wind_amplitude&lt;/font&gt; &lt;font color="#C8003C"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;wind_amplitude_dir&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#C8003C"&gt;-&lt;/font&gt;&lt;font color="#000000"&gt;wind_amplitude_dir&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#808080"&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;saturate&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;wind_amplitude&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;wind_amplitude&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;wind_speed&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;lerp&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;wind_min_power&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;wind_max_power&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;wind_amplitude&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Данный код позволяет эмулировать порывы, линейно меняя скорость ветра между двумя значениями. А  внесение  в расчёты небольшого количества хаоса ( &lt;i&gt;rand_k&lt;/i&gt; ) добавит немного естественности.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Трансформация&lt;/b&gt;&lt;br /&gt;Мы рассчитали на какое расстояние должен сместиться стебель ( &lt;i&gt;current_offset&lt;/i&gt; ), осталось его  нарисовать.&lt;br /&gt;&lt;br /&gt;Очевидно, что смещать мы должны верхние вершины стеблей. Определить где верх, где низ, очень просто -  текстурные координаты у нас идут сверху вниз. Зная это, легко определить высоту вершины &lt;i&gt;( 1.f -  tex_coord.y )&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Может возникнуть соблазн сдвинуть только &lt;i&gt;XZ&lt;/i&gt; координаты, как показано тут:&lt;br /&gt;&lt;div align=center&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/7_0.png" width=300 height=150 alt='1,64 КБ'&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Но это неправильно. Возмите ручку, поставьте её вертикально на стол и попробуйте наклонить. Заметьте,  что она движется по окружности:&lt;br /&gt;&lt;div align=center&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/7_2.png" width=150 height=150 alt='4,11 КБ'&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Нам нужно поступить аналогично. Делать "честное" смещение по окружности несколько "дороговато",  поэтому обойдёмся упрощённой моделью. Уменьшим высоту на ту же величину, на сколько сдвинули её  ветром.&lt;br /&gt;&lt;div align=center&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/7_1.png" width=300 height=150 alt='1,61 КБ'&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Вот что у нас получилось в итоге&lt;br /&gt;&lt;div align=center&gt;&lt;object width="425" height="350"&gt; &lt;param name="movie" value="http://www.youtube.com/v/Jmn1Id4XFUc"&gt; &lt;/param&gt; &lt;embed src="http://www.youtube.com/v/Jmn1Id4XFUc" type="application/x-shockwave-flash" width="425" height="350"&gt; &lt;/embed&gt; &lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;На этом я, пожалуй, закончу с растительностью. В планах есть некоторые идеи по поводу освещения,  более реалистичной физической модели. некоторых спец. эффектах и т.д. Но всё это в перспективе.&lt;br /&gt;&lt;br /&gt;Пора двигаться дальше.&lt;br /&gt;&lt;br /&gt;&lt;font size=1&gt;p.s. Если честно, я не очень доволен получившимся ветром. Был потрачен не один день, и всё равно, вышло немного не то что хотелось. Но слишком затягивать тоже не дело, ибо пресловутый "синдром улучшения" может растянуть процесс на неопределённый срок. Может ещё вернусь к этой теме.&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1166717357843559011-7665219649336227188?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/1_T5bPBl6no" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/7665219649336227188/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=7665219649336227188" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/7665219649336227188?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/7665219649336227188?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/1_T5bPBl6no/3.html" title="Растительность. Часть 3( заключительная ). Ветер" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2008/01/3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YDRHk9fyp7ImA9WxZTFUw.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-6407644770352972295</id><published>2008-01-17T01:23:00.000+05:00</published><updated>2008-01-17T01:26:15.767+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-17T01:26:15.767+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><category scheme="http://www.blogger.com/atom/ns#" term="vegetation" /><category scheme="http://www.blogger.com/atom/ns#" term="outdoor" /><title>Растительность. Часть 2_1( отступление). В поисках идеальной фигуры</title><content type="html">&lt;b&gt;Оригами из полигонов&lt;/b&gt;&lt;br /&gt;В качестве модели пучка травы я использовал т.н. "звёздочку" - 4 плоскости, повёрнутые вокруг оси Y.  Но у это фигуры есть очень серъёзный недостаток. Если направить камеру строго вниз - будет видна вся  плоская сущность "кустика", что здорово аноит.&lt;br /&gt;&lt;br /&gt;Пример:&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6a_2.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6a_2.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Я экспериментировал с разными формами, пока не нашёл приемлемую. Перебрать пришлось довольно  много.&lt;br /&gt;&lt;br /&gt;Вот немногое из того что было опробовано( это примерно 1/5 часть из общего количества ):&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/6a_0.jpg" width=400 height=211 alt='27,53 КБ'&gt;&lt;br /&gt;&lt;br /&gt;В результате выбор был остановлен на этой фигуре:&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/6a_1.jpg" width=400 height=300 alt='22,80 КБ'&gt;&lt;br /&gt;&lt;br /&gt;Моделирование той же ситуации( камера направлена вниз ) с новой геометрией&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6a_3.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6a_3.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Как видно, растительность приобрела ещё немного "объемности", а досадный артефакт исчез.&lt;br /&gt;&lt;br /&gt;Новая геометрия добавила немного "природного хаоса", что положительно сказалось на общей картине&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6a_4.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6a_4.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1166717357843559011-6407644770352972295?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/x_wYaJ7rmYE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/6407644770352972295/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=6407644770352972295" title="Комментарии: 7" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/6407644770352972295?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/6407644770352972295?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/x_wYaJ7rmYE/21.html" title="Растительность. Часть 2_1( отступление). В поисках идеальной фигуры" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>7</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2008/01/21.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMER3g5fCp7ImA9WxZTGEg.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-8694296622665665661</id><published>2008-01-14T02:30:00.001+05:00</published><updated>2008-01-21T00:46:46.624+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-21T00:46:46.624+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><category scheme="http://www.blogger.com/atom/ns#" term="landscape" /><category scheme="http://www.blogger.com/atom/ns#" term="vegetation" /><category scheme="http://www.blogger.com/atom/ns#" term="outdoor" /><title>Растительность. Часть 2. Отрисовка</title><content type="html">&lt;img src="http://www.ljplus.ru/img4/t/i/timai/6_t.jpg" width=300 height=225 alt='46,91 КБ'&gt;&lt;br /&gt;&lt;br /&gt;После того как мы сгенерировали матрицы [&lt;a href="http://timai-ru.blogspot.com/2008/01/1.html"&gt;link&lt;/a&gt;] пришло время заняться непосредственно рендером.&lt;br /&gt;&lt;br /&gt;Рисовать мы будет пучками. Геометрия - знакомая многим "звёздочка". 4 плоскости или 8 полигонов.&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6_0.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6_0.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Она же после альфа теста:&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6_1.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6_1.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Увеличим плотность засейки. Вблизи смотриться неплохо:&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6_2.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6_2.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Но если отодвинуть камеру то вылезут артефакты.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Артефакт 1. wrap&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6_3.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6_3.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На самой верхушки пучков повылазили артефакты. Их природа довольно проста и лечится всё это дело выставлением clamp'а, вместо wrap в самплере.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Артефакт 2. mipmaps и алиасинг&lt;/b&gt;&lt;br /&gt;Если отодвинуть камеру ещё дальше, то можно заметить что картинка поменялась в худшую сторону.&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6_5.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6_5.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Что произошло? Трава стала менее прозрачной. Почему? Кто работал с альфатестом - знают в чём проблема.&lt;br /&gt;Всё дело в mipmap уровнях( если кто не знает что это - [&lt;a href="http://www.gamedev.ru/terms/MipMap"&gt;link&lt;/a&gt;] )&lt;br /&gt;&lt;br /&gt;Рассмотрим мип-уровни куста( альфа канал ).&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6_4.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6_4.jpg" width=400 height=100 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Как видно, уже на 5-ом уровне альфа канал теряет все детали и превращается в пятно. В результате дальние кусты травы( использующие 4+  мип уровни ) теряют прозрачность и становятся более "монолитными".&lt;br /&gt;&lt;br /&gt;Что первое приходит на ум - отключить сам mipmaping, в результате чего будет использоваться текстура с максимальным разрешением. Но сделав это, мы получим очень неприятный алиасинг.&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6_6.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6_6.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;font size=1&gt;( на превьюшке плохо видно, лучше смотреть полноразмерный скрин )&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Очевидно, что отказаться от мип-уровней мы не можем. Что делать? Можно исхитриться и разбить текстуру 2 части. Первая - диффузная, вторая - альфа маска. Поместив их в разные самплеры и отключив мип уровни только для альфы мы можем побороть алиасинг.&lt;br /&gt;&lt;br /&gt;Но есть способ проще - достаточно грузить только первые 3-4 мип-уровня. Для загрузки текстур я использую функцию D3DXCreateTextureFromFileEx, которая позволяет задавать количество загружаемых мип-уровней.&lt;br /&gt;&lt;br /&gt;Как видно, алиасинг исчез, проблемы с альфа тестом тоже.&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6_7.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6_7.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Instancing&lt;/b&gt;&lt;br /&gt;Очевидно что рисовать один куст за вызов слишком "дорого". К примеру, у меня в кадре может быть более 4000 кустов. Делать 4000 вызовов на отрисовку( dip ) будет слишком накладно. Посему будем использовать shader constant geometry instancing.&lt;br /&gt;&lt;br /&gt;Как оно работает. Известно, что vertex shader 2_0 и выше может работать как минимум с 256 регистрами( каждый регистр - это 4 float ), в которые можно затолкать 64 матрицы 4х4. Оставим 16 регистров для других нужд( видовая матрица, освещение и т.д )  и "забёрём" остальные. Итого 60 матриц в нашем распоряжении.&lt;br /&gt;&lt;br /&gt;Чтобы использовать instancing нужна "особая" геометрия. Если кратко - батчинг с индексом на каждый элемент. Если подробно - каждый куст мы описывает 16-ю вершинами и 24-мя индексами. Нам нужно увеличить вершинный и индексный буффер в 60 раз и заполнить их копиями оригинала. Примерно так:&lt;br /&gt;&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#0000FF"&gt;for&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;unsigned&lt;/font&gt; &lt;font color="#0000FF"&gt;int&lt;/font&gt; &lt;font color="#000000"&gt;j&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#40B440"&gt;1&lt;/font&gt; &lt;font color="#C8003C"&gt;;&lt;/font&gt; &lt;font color="#000000"&gt;j&lt;/font&gt; &lt;font color="#C8003C"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#40B440"&gt;60&lt;/font&gt; &lt;font color="#C8003C"&gt;;&lt;/font&gt; &lt;font color="#000000"&gt;j&lt;/font&gt;&lt;font color="#C8003C"&gt;++&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;for&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;unsigned&lt;/font&gt; &lt;font color="#0000FF"&gt;int&lt;/font&gt; &lt;font color="#000000"&gt;i&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#40B440"&gt;0&lt;/font&gt; &lt;font color="#C8003C"&gt;;&lt;/font&gt; &lt;font color="#000000"&gt;i&lt;/font&gt; &lt;font color="#C8003C"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#40B440"&gt;16&lt;/font&gt; &lt;font color="#C8003C"&gt;;&lt;/font&gt; &lt;font color="#000000"&gt;i&lt;/font&gt;&lt;font color="#C8003C"&gt;++&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;        &lt;font color="#000000"&gt;vertex&lt;/font&gt;&lt;font color="#C8003C"&gt;[&lt;/font&gt; &lt;font color="#000000"&gt;j&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#40B440"&gt;16&lt;/font&gt; &lt;font color="#C8003C"&gt;+&lt;/font&gt; &lt;font color="#000000"&gt;i&lt;/font&gt; &lt;font color="#C8003C"&gt;]&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;vertex&lt;/font&gt;&lt;font color="#C8003C"&gt;[&lt;/font&gt; &lt;font color="#000000"&gt;i&lt;/font&gt; &lt;font color="#C8003C"&gt;];&lt;/font&gt;&lt;br /&gt;     &lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size = 1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;С индексами нужно поступить аналогично. В дополнение к сделанному нужно расширить формат вершины. Если раньше она содержала только позицию и текстурные координаты, то теперь она дополнилась индексом батча. Т.е. каждая вершина в "пучке" знает к какому индексу она относится.&lt;br /&gt;&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#0000FF"&gt;for&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;unsigned&lt;/font&gt; &lt;font color="#0000FF"&gt;int&lt;/font&gt; &lt;font color="#000000"&gt;j&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#40B440"&gt;0&lt;/font&gt; &lt;font color="#C8003C"&gt;;&lt;/font&gt; &lt;font color="#000000"&gt;j&lt;/font&gt; &lt;font color="#C8003C"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#40B440"&gt;60&lt;/font&gt; &lt;font color="#C8003C"&gt;;&lt;/font&gt; &lt;font color="#000000"&gt;j&lt;/font&gt;&lt;font color="#C8003C"&gt;++&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;for&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;unsigned&lt;/font&gt; &lt;font color="#0000FF"&gt;int&lt;/font&gt; &lt;font color="#000000"&gt;i&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#40B440"&gt;0&lt;/font&gt; &lt;font color="#C8003C"&gt;;&lt;/font&gt; &lt;font color="#000000"&gt;i&lt;/font&gt; &lt;font color="#C8003C"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#40B440"&gt;16&lt;/font&gt; &lt;font color="#C8003C"&gt;;&lt;/font&gt; &lt;font color="#000000"&gt;i&lt;/font&gt;&lt;font color="#C8003C"&gt;++&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;        &lt;font color="#000000"&gt;vertex&lt;/font&gt;&lt;font color="#C8003C"&gt;[&lt;/font&gt; &lt;font color="#000000"&gt;j&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#40B440"&gt;16&lt;/font&gt; &lt;font color="#C8003C"&gt;+&lt;/font&gt; &lt;font color="#000000"&gt;i&lt;/font&gt; &lt;font color="#C8003C"&gt;].&lt;/font&gt;&lt;font color="#000000"&gt;index&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;j&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;     &lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Буфера "забатчены" и проиндексированы. Осталось отрисовать.&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#000000"&gt;float4x4&lt;/font&gt; &lt;font color="#000000"&gt;g_vp&lt;/font&gt;          &lt;font color="#C8003C"&gt;:&lt;/font&gt; &lt;font color="#0000FF"&gt;register&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;c0&lt;/font&gt;  &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;float4x4&lt;/font&gt; &lt;font color="#000000"&gt;g_world&lt;/font&gt;&lt;font color="#C8003C"&gt;[&lt;/font&gt; &lt;font color="#40B440"&gt;60&lt;/font&gt; &lt;font color="#C8003C"&gt;]&lt;/font&gt; &lt;font color="#C8003C"&gt;:&lt;/font&gt; &lt;font color="#0000FF"&gt;register&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;c16&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;void&lt;/font&gt; &lt;font color="#000000"&gt;vs_main&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;inout&lt;/font&gt; &lt;font color="#000000"&gt;float4&lt;/font&gt; &lt;font color="#000000"&gt;pos&lt;/font&gt;   &lt;font color="#C8003C"&gt;:&lt;/font&gt; &lt;font color="#000000"&gt;POSITION&lt;/font&gt;  &lt;font color="#C8003C"&gt;,&lt;/font&gt;&lt;br /&gt;              &lt;font color="#000000"&gt;inout&lt;/font&gt; &lt;font color="#000000"&gt;float2&lt;/font&gt; &lt;font color="#000000"&gt;tex&lt;/font&gt;   &lt;font color="#C8003C"&gt;:&lt;/font&gt; &lt;font color="#000000"&gt;TEXCOORD0&lt;/font&gt; &lt;font color="#C8003C"&gt;,&lt;/font&gt;&lt;br /&gt;              &lt;font color="#000000"&gt;in&lt;/font&gt;    &lt;font color="#0000FF"&gt;float&lt;/font&gt;  &lt;font color="#000000"&gt;index&lt;/font&gt; &lt;font color="#C8003C"&gt;:&lt;/font&gt; &lt;font color="#000000"&gt;TEXCOORD1&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;float4&lt;/font&gt; &lt;font color="#000000"&gt;world_pos&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;mul&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;pos&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;g_world&lt;/font&gt;&lt;font color="#C8003C"&gt;[&lt;/font&gt; &lt;font color="#000000"&gt;index&lt;/font&gt; &lt;font color="#C8003C"&gt;]&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;pos&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;mul&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;world_pos&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;g_vp&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;В итоге количество dip calls сократилось в 60 раз. 100 вызовов вместо 6000. Думаю, разница очевидна. FPS радостно подпрыгнул, что и требовалось.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;BTW: в DirectX 9 SDK есть очень хороший пример с instancing.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Итого&lt;/b&gt;&lt;br /&gt;Комбинируя разные типы растительность можно получить очень приятную картинку&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6_8.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6_8.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/6_9.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_6_9.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&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/1166717357843559011-8694296622665665661?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/S959TxI3_eA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/8694296622665665661/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=8694296622665665661" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/8694296622665665661?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/8694296622665665661?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/S959TxI3_eA/2.html" title="Растительность. Часть 2. Отрисовка" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2008/01/2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8GRX4zcCp7ImA9WxZTEkg.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-8294684998837887232</id><published>2008-01-14T00:18:00.000+05:00</published><updated>2008-01-14T01:07:04.088+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-14T01:07:04.088+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="generation" /><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><category scheme="http://www.blogger.com/atom/ns#" term="landscape" /><category scheme="http://www.blogger.com/atom/ns#" term="vegetation" /><category scheme="http://www.blogger.com/atom/ns#" term="outdoor" /><title>Растительность. Часть 1. Генерация.</title><content type="html">&lt;img src="http://www.ljplus.ru/img4/t/i/timai/5_t.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size = 1&gt;&lt;i&gt;Первоначально планировался один общий текст. Но т.к. получилось "слишком много букв" разбил на 3  части&lt;/i&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Посмотрел я на ландшафт, что у меня получатся, и решил что чего-то не хватает. Было принято решение  добавить немного растительности.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Генерация&lt;/b&gt; &lt;br /&gt;Этап генрация довольно интересен. Ибо просто нагенерить случайные значения нельзя. Объясню почему.&lt;br /&gt;&lt;br /&gt;Предположим, у нас есть регион 3х2 метра, который нужно засеять травой.&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/5_0.png"&gt;&lt;br /&gt;&lt;br /&gt;Если сгенерировать рандомайзом позиции, то могут получиться весьма любопытные результаты.&lt;br /&gt;&lt;br /&gt;Например вот&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/5_2.png"&gt;&lt;br /&gt;&lt;br /&gt;или вот&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/5_3.png"&gt;&lt;br /&gt;&lt;br /&gt;Очевидно, что такая "генерация" неприемлима, ибо абсолютно непредсказуема. Нужен алгоритм, при  котором "засеивание" должно быть относительно равномерным. Как это сделать?&lt;br /&gt;&lt;br /&gt;Для начала надо ввести коэффициент, описывающий плотность засеивания травы. Обозначим его как  &lt;i&gt;d&lt;/i&gt;( от density ).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;d - количество объектов, расположенных на 1кв.м. поверхности&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Очевидно что увеличивая &lt;i&gt;d&lt;/i&gt;, увеличивается плотность засеивания. Получаем довольно "прозрачное"  управление.&lt;br /&gt;&lt;br /&gt;Нужно ввести ещё одно понятие - регион. Это область, содержащая 1 объект( куст ). С его помощью  можно будет добиться равномерного засеивания.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;u = 1 / ( sqrt( d ) )&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;u&lt;/i&gt; - Сторона региона.&lt;br /&gt;&lt;br /&gt;Получаем:&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/5_4.png"&gt;&lt;br /&gt;&lt;br /&gt;Осталось только добавить немного "хаоса" =) Рандомно генерируем точку в пределах каждого региона.&lt;br /&gt;&lt;br /&gt;Получаем:&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/5_5.png"&gt;&lt;br /&gt;&lt;br /&gt;Как раз то что и было нужно. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Рассаживаем на ландшафте&lt;/b&gt;&lt;br /&gt;Область мы сгенерировали. Но этого мало, нужно ещё "рассадить" всё это дело на ландшафте. Тут, на  самом деле, всё просто. Всё что нужно - это определить высоту( &lt;i&gt;"y"&lt;/i&gt; координату ) точки  ландшафта, где будет располагаться куст. Интереса ради я попробовал решить это проблему "в лоб".  "Пробивал" лучом каждый треугольник патчей при помощи функции D3DXIntersectTri. Получилось  ну &lt;b&gt;очень&lt;/b&gt; медленно. Код был спешно стёрт и предан забвению.&lt;br /&gt;&lt;br /&gt;Есть более оптимальный вариант. Ландшафт у нас строиться из карты высот? Да. Значит сетка  регулярная? Да. Значит зная &lt;i&gt;x&lt;/i&gt; и &lt;i&gt;z&lt;/i&gt; координату( то что мы сгенерировали ) можно  высчитать смещение и точно определить нужный треугольник? Да. Ну а 2 треугольника( квад ) проверить  на пересечение побыстрее будет, чем несколько тысяч.&lt;br /&gt;&lt;br /&gt;Если интересно как сделано у меня - посмотреть можно здесь [&lt;a href="http://www.everfall.com/paste/id.php?m37ex3rodh6c"&gt;link&lt;/a&gt;] или здесь [&lt;a href="http://rafb.net/p/4tBGyM16.html"&gt;link&lt;/a&gt;].&lt;br /&gt;&lt;br /&gt;Вот что у нас получилось в итоге:&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/5_6.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_5_6.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Маска&lt;/b&gt; &lt;br /&gt;Маска нужна - это очевидно. Ибо квадратная область засеяной травы смотриться несколько... странно. Я  использовал TGA формат( 8 бит на пиксель, без компрессии ) для этих целей. Какой точке на маске  соответствует "травинка" считаем:&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#000000"&gt;mask_offset_x&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt;&lt;br /&gt;    &lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;grass_pos&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;x&lt;/font&gt; &lt;font color="#C8003C"&gt;-&lt;/font&gt; &lt;font color="#000000"&gt;grass_region_bbox&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;min&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;x&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;/&lt;/font&gt;&lt;br /&gt;      &lt;font color="#000000"&gt;grass_region_bbox_width&lt;/font&gt;  &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;mask_width&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;mask_offset_y&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;br /&gt;    &lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;grass_pos&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;z&lt;/font&gt; &lt;font color="#C8003C"&gt;-&lt;/font&gt; &lt;font color="#000000"&gt;grass_region_bbox&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;min&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;z&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;/&lt;/font&gt;&lt;br /&gt;      &lt;font color="#000000"&gt;grass_region_bbox_height&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;mask_height&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Дальше я считал так - если цвет пикселя менее 64, то сажать в этом месте мы ничего не будем. Если же  значение &gt; 64, то цвет будет использовать для масштабирования. Считаем как&lt;br /&gt;&lt;br /&gt;&lt;i&gt;scale_factor = ( mask_pixel - 64 ) / ( 255 - 64 );&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Итого&lt;/b&gt;&lt;br /&gt;После всех этих сложных телодвижения можно наконец-то построить матрицу каждой травинки. Для  "естественности" добавим немного рандомайза в финальные вычисления. Итого мы получаем:&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#000000"&gt;scale&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;lerp&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;scale_min&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;scale_max&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;rand&lt;/font&gt;&lt;font color="#C8003C"&gt;()&lt;/font&gt; &lt;font color="#C8003C"&gt;/&lt;/font&gt; &lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;RAND_MAX&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;scale&lt;/font&gt; &lt;font color="#C8003C"&gt;*=&lt;/font&gt; &lt;font color="#000000"&gt;scale_factor&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;matrix&lt;/font&gt; &lt;font color="#000000"&gt;mat_tr&lt;/font&gt;  &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;matrix_translation&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;mat_tr&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;pos&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;matrix&lt;/font&gt; &lt;font color="#000000"&gt;mat_sc&lt;/font&gt;  &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;matrix_scaling&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;mat_sc&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;vec3&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#40B440"&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#40B440"&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#40B440"&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;scale&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;matrix&lt;/font&gt; &lt;font color="#000000"&gt;mat_rot&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;matrix_rotation_y&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;mat_rot&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;rand&lt;/font&gt;&lt;font color="#C8003C"&gt;()&lt;/font&gt; &lt;font color="#C8003C"&gt;/&lt;/font&gt; &lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;float&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;font color="#000000"&gt;RAND_MAX&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;matrix&lt;/font&gt; &lt;font color="#000000"&gt;mat_res&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt;  &lt;font color="#000000"&gt;mat_sc&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;mat_rot&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;mat_tr&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt; &lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&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/1166717357843559011-8294684998837887232?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/m-1LKnDIgCY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/8294684998837887232/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=8294684998837887232" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/8294684998837887232?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/8294684998837887232?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/m-1LKnDIgCY/1.html" title="Растительность. Часть 1. Генерация." /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2008/01/1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMDRX48eSp7ImA9WB9aF04.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-5845433957601790106</id><published>2008-01-07T14:58:00.000+05:00</published><updated>2008-01-08T00:17:54.071+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-08T00:17:54.071+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><category scheme="http://www.blogger.com/atom/ns#" term="landscape" /><category scheme="http://www.blogger.com/atom/ns#" term="outdoor" /><title>О масках</title><content type="html">&lt;div style="float:left; width:300px; height:197px; position: relative;top:5px; margin-right: 10px;"&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/4_t.jpg" width=300 height=197 alt='30,87 КБ'&gt;&lt;/div&gt;Визуализация открытых пространств - штука весьма интересная. Сгенерировать/загрузить саму геометрию ландашфта - это не так сложно. А вот грамотно и красиво его "разукрасить" - это уже поинтереснее.&lt;br /&gt;&lt;br /&gt;В настоящий момент б&lt;STRONG&gt;о&lt;/STRONG&gt;льшая часть игр, действие которых происходит на открытых пространствах используют маски + затайленные текстуры. Если кто не совсем понял о чем речь - поясню. Нарисовать и использовать одну текстуру для всего ланшафта - слишком "дорого" для железа. Ибо при обычном подходе( есть ещё "необычный", об этом ниже ) такая текстурка просто отжрёт всю видеопамять( если вообще сможет загрузиться ). Поэтому используют маски. Маска - это обыная ч/б текстура. Диффузный цвет пикселя считается как ( &lt;EM&gt;diffuse_texture_0 * mask_0 + diffuse_texture_1 * mask_1&lt;/EM&gt; ... и т.д. ). Думаю, мысль ясна.&lt;br /&gt;&lt;br /&gt;Существуют две основные техники рисования масками( их на самом деле больше, я остановлюсь на самых популярных )&lt;br /&gt;1) Маска в геометрии ландшафта. Как сделано в &lt;EM&gt;Oblivion&lt;/EM&gt;. Каждая вершина содержит 4-х байтный цвет, который раскладывается на 4 маски. Основной минус - увеличить детализацию можно только увеличив плотность сетки.&lt;br /&gt;2) Маски в текстуре. Одна на всю локацию. Как сделано в &lt;EM&gt;Neverwinter Nights 2&lt;/EM&gt;. На самом деле, в одной текстуре 4 маски, просто они лежат в разных RGB каналах. Как видно - предел 4 маски ( 4-ая счиатется как 1.0 - R - G - B ). Основной минус - невозможно увеличить детализацию какой-либо области. Только всю текстуру целиком.&lt;br /&gt;&lt;br /&gt;Есть ещё относительно новый подход - "Мегатекстура" от дядюшки Кармака. Вот тут очень популярно о ней написно [&lt;a href="http://www.gamedev.ru/code/articles/Megatexture"&gt;link&lt;/a&gt;]. Техника довольно проста в реализации. Основной труд - написание инструментария для хранения и генерации этой "мегатекстуры". Я ещё коснусь этой темы в конце поста.&lt;br /&gt;&lt;br /&gt;В своё время я реализовывал 1-ый вариант. Причём очень хитрый и заковыристый. С разбивкой на субматериалы, с неограниченным количеством масок и т.д. Но главной проблемы избежать так и не удалось - без увеличения плотности сетки нельзя было увеличить делализацию маски. К примеру - есть ландшафт. На нём хочеться нарисовать тропинку. Нарисовать-то мы её нарисуем, но в итоге увидим что края этой дорожки сильно размыты. Почему? Предположим, шаг сетки у нас 1 метр. В одной веришине значение маски 1.0 в другой 0.0. Что случиться? Правильно, инторполяция. В итоге имеем метровый градиент, дающий малопривлекательную "размытость". Регионы травы, песка и камней рисовать пойдёт, но не более.&lt;br /&gt;&lt;br /&gt;Нужен другой подход, сочетающий в себе произвольную точность и низкую ресурсоёмкость. Как этого можно добиться? Нужно "освободить" маски. Чтобы они не были привязаны ни к геометрии, ни размеру текстуры. Как? Разбивать на произвольные регионы. Сейчас объясню как.&lt;br /&gt;&lt;br /&gt;Определям регион маски. Вот он - красный aabbox в центре.&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/4_3.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_4_3.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Теперь нам нужно в этом месте нарисовать маску. Что для этого нужно сделать? Правильно, пересчитать текстурные координаты.&lt;br /&gt;&lt;br /&gt;&lt;TABLE width="100%" bgColor=#f2f2f2&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;float2&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;float2&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_max&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;-&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_min&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_max&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;-&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_min&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;);&lt;br /&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;float2&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_size&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;float2&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_max&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;-&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_min&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_max&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;-&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_min&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;);&lt;br /&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;tex&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;-=&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_min&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;/&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;br /&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;tex&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;*=&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;/&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;br /&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;tex&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;-=&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;-&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_max&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;)&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;/&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;br /&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;tex&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;*=&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;/&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;br /&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD align=right&gt;&lt;B&gt;&lt;I&gt;&lt;A href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;FONT color=#727272 size=1&gt;_Winnie C++ Colorizer&lt;/FONT&gt;&lt;/A&gt;&lt;/I&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;где&lt;br /&gt;world_min, world_max - aabbox ландшафта&lt;br /&gt;local_min, local_max - aabbox области&lt;br /&gt;&lt;br /&gt;Чтобы не считать всё это в шейдере, посчитаем "снаружи" и передадим в качестве матрицы.&lt;br /&gt;&lt;TABLE width="100%" bgColor=#f2f2f2&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;PRE&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt; &lt;FONT color=#000000&gt;vec2&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_bbox&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;width&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(),&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_bbox&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;depth&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;()&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;);&lt;/FONT&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;const&lt;/FONT&gt; &lt;FONT color=#000000&gt;vec2&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_bbox&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;width&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(),&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_bbox&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;depth&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;()&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;);&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#000000&gt;tex_mat_tr&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;math&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;::&lt;/FONT&gt;&lt;FONT color=#000000&gt;matrix_translation&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt;&lt;br /&gt;    &lt;FONT color=#000000&gt;tex_mat_tr&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt;&lt;br /&gt;    &lt;FONT color=#c8003c&gt;-&lt;/FONT&gt;&lt;FONT color=#000000&gt;vec3&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt;&lt;br /&gt;        &lt;FONT color=#000000&gt;local_bbox&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;min&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;/&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt;&lt;br /&gt;        &lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;-&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_bbox&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;max&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;z&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;)&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;/&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt;&lt;br /&gt;        &lt;FONT color=#40b440&gt;0.&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#40b440&gt;f&lt;/FONT&gt;&lt;/B&gt; &lt;FONT color=#c8003c&gt;)&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;);&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#000000&gt;tex_mat_sc&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;math&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;::&lt;/FONT&gt;&lt;FONT color=#000000&gt;matrix_scaling&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt;&lt;br /&gt;    &lt;FONT color=#000000&gt;tex_mat_sc&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt;&lt;br /&gt;    &lt;FONT color=#000000&gt;vec3&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;/&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;world_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;/&lt;/FONT&gt; &lt;FONT color=#000000&gt;local_size&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#40b440&gt;0.&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#40b440&gt;f&lt;/FONT&gt;&lt;/B&gt; &lt;FONT color=#c8003c&gt;)&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;);&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#000000&gt;tex_mat&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex_mat_tr&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;*&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex_mat_sc&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD align=right&gt;&lt;B&gt;&lt;I&gt;&lt;A href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;FONT color=#727272 size=1&gt;_Winnie C++ Colorizer&lt;/FONT&gt;&lt;/A&gt;&lt;/I&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;&lt;br /&gt;Кидаем tex_mat в вершинный шейдер, а там считаем новые текстурыне координаты как&lt;br /&gt;&lt;br /&gt;&lt;TABLE width="100%" bgColor=#f2f2f2&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;tex&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;mul&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;float4&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;x&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;.&lt;/FONT&gt;&lt;FONT color=#000000&gt;y&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#40b440&gt;1.&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#40b440&gt;f&lt;/FONT&gt;&lt;/B&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#40b440&gt;1.&lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#40b440&gt;f&lt;/FONT&gt;&lt;/B&gt; &lt;FONT color=#c8003c&gt;),&lt;/FONT&gt; &lt;FONT color=#000000&gt;g_tex_mat&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;).&lt;/FONT&gt;&lt;FONT color=#000000&gt;xy&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD align=right&gt;&lt;B&gt;&lt;I&gt;&lt;A href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;FONT color=#727272 size=1&gt;_Winnie C++ Colorizer&lt;/FONT&gt;&lt;/A&gt;&lt;/I&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;И вот, мы получили маску в нужном нам месте.&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/4_2.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_4_2.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Важное замечание: нужно обязательното включить "clamp" для текстуры маски. Иначе она пойдёт тайлиться на соседние области, что недопустимо. Тайлиться он перестал, но этого мало, нужно чтобы она ( маска ) не затронула соседние регионы. Есть 2 решения.&lt;br /&gt;1) При рисовании маски закрашивать пиксели на границе в черный цвет.&lt;br /&gt;2) Использовать clip planes. 4 штуки по сторонам бокса материала.&lt;br /&gt;&lt;br /&gt;Маска отображается корректно? Самое время добавить диффузную текстуру.&lt;br /&gt;&lt;TABLE width="100%" bgColor=#f2f2f2&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;PRE&gt;&lt;FONT color=#0000ff&gt;float&lt;/FONT&gt; &lt;FONT color=#000000&gt;mask&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex2D&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;s_mask&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex_default&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;).&lt;/FONT&gt;&lt;FONT color=#000000&gt;r&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;;&lt;br /&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;float3&lt;/FONT&gt; &lt;FONT color=#000000&gt;diffuse&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;=&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex2D&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;s_diffuse&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;tex_scale&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;);&lt;br /&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;return&lt;/FONT&gt; &lt;FONT color=#000000&gt;float4&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;(&lt;/FONT&gt; &lt;FONT color=#000000&gt;diffuse&lt;/FONT&gt;&lt;FONT color=#c8003c&gt;,&lt;/FONT&gt; &lt;FONT color=#000000&gt;mask&lt;/FONT&gt; &lt;FONT color=#c8003c&gt;);&lt;/FONT&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD align=right&gt;&lt;B&gt;&lt;I&gt;&lt;A href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;FONT color=#727272 size=1&gt;_Winnie C++ Colorizer&lt;/FONT&gt;&lt;/A&gt;&lt;/I&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;Получаем:&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/4_4.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_4_4.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Как нетрудно заметить, маску мы ложим в альфу. Посему предварительно нужно включить alphablending( src_blend - blend_src_alpha, dest_blend - blend_inv_src_alpha ).&lt;br /&gt;&lt;br /&gt;При желании диффузную текстуру можно затайлить, домножив трансформированные текстурные координаты на scale factor.&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/4_5.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_4_5.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;И всё =)&lt;br /&gt;В итоге, варьируя регионы маски и её разрешение можно получить абсолютно любую точность.&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/4_6.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_4_6.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Этот подход удобен тем, что предоставляет возможность получать высокую детализацию там где необходимо, и экономить видеопамять там, где точность не критична.&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/4_7.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_4_7.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;Про оптимизацию&lt;/STRONG&gt;&lt;br /&gt;Ландшафт у меня разбит на патчи. В среденем на 1 патч приходиться 2-3 материала. Рисовать каждую маску за отдельный проход - конечно же, неоптимально. Но лечиться это очень просто. Можно( и нужно ) рисовать несколько масок за раз. Подход такой же, как и при отрисовки одного объекта сразу с несколькоми источниками света. Создаётся 3 шейдера на каждый тип материала( отрисовка одной маски, 2-х и 3-х ). На этапе загрузки определяем сколько материалов на патче, биндим соответсвующий шейдер и всё. Если на патче более 3-х масок, рисуем в несколько проходов.&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;Про мегатекстуру&lt;/STRONG&gt;&lt;br /&gt;Данный подход можно использовать совместно с "мегатекстурой". Для её генерации конечно же, а не отрисовки =) Мысль довольно интересная, может я её разовью в дальнейшем.&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;Итого&lt;/STRONG&gt;&lt;br /&gt;Получилась очень хорошая техника. По крайней мере, мне нравится как она работает.&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/4_0.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_4_0.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/4_1.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_4_1.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1166717357843559011-5845433957601790106?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/dt8hZqhuDTI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/5845433957601790106/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=5845433957601790106" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/5845433957601790106?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/5845433957601790106?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/dt8hZqhuDTI/blog-post_07.html" title="О масках" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2008/01/blog-post_07.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8DRXkyfyp7ImA9WB9aEkU.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-6957702369609639631</id><published>2008-01-02T00:37:00.000+05:00</published><updated>2008-01-02T19:24:34.797+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-02T19:24:34.797+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><category scheme="http://www.blogger.com/atom/ns#" term="useful" /><category scheme="http://www.blogger.com/atom/ns#" term="boost" /><title>О ссылающихся друг на друга объектах</title><content type="html">Очень часто возникает ситуация, при которой объект, объявленный раньше, должен вызывать метод объекта, объявленного позже. Но поменять объявления местами не представляется возможным, ибо "нижестоящий" по коду ссылается на "вышестоящего".&lt;br /&gt;&lt;br /&gt;Пример:&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#0000FF"&gt;class&lt;/font&gt; &lt;font color="#000000"&gt;foo&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;public&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;void&lt;/font&gt; &lt;font color="#000000"&gt;test&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;bar&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;b&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;{&lt;/font&gt; &lt;font color="#000000"&gt;b&lt;/font&gt;&lt;font color="#C8003C"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;print&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#006400"&gt;"foo"&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt; &lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;class&lt;/font&gt; &lt;font color="#000000"&gt;bar&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;public&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;void&lt;/font&gt; &lt;font color="#000000"&gt;print&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;const&lt;/font&gt; &lt;font color="#0000FF"&gt;char&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;txt&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;{&lt;/font&gt; &lt;font color="#000000"&gt;printf_s&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#006400"&gt;"%s&lt;/font&gt;&lt;b&gt;&lt;font color="#00C8C8"&gt;\n&lt;/font&gt;&lt;/b&gt;&lt;font color="#006400"&gt;"&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;txt&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt; &lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;private&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;foo&lt;/font&gt; &lt;font color="#000000"&gt;m_obj&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;};&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;При попытки скомпилировать это, компилятор пошлёт к такой-то матери. Ну и понятно, ведь на момент компиляции &lt;span&gt;foo&lt;/span&gt;, нет никакой информации о &lt;span&gt;bar&lt;/span&gt;. Это же не позволяет использовать обычные указатели на методы класса.&lt;br/&gt;&lt;br/&gt;Можно попытаться выкрутиться, используя интерфейсы:&lt;br/&gt;&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#0000FF"&gt;struct&lt;/font&gt; &lt;font color="#000000"&gt;i_bar&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;virtual&lt;/font&gt; &lt;font color="#0000FF"&gt;void&lt;/font&gt; &lt;font color="#000000"&gt;print&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;const&lt;/font&gt; &lt;font color="#0000FF"&gt;char&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;txt&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#40B440"&gt;0&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;class&lt;/font&gt; &lt;font color="#000000"&gt;foo&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;public&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;void&lt;/font&gt; &lt;font color="#000000"&gt;test&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;i_bar&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;b&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;{&lt;/font&gt; &lt;font color="#000000"&gt;b&lt;/font&gt;&lt;font color="#C8003C"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;print&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#006400"&gt;"foo"&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt; &lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;class&lt;/font&gt; &lt;font color="#000000"&gt;bar&lt;/font&gt; &lt;font color="#C8003C"&gt;:&lt;/font&gt; &lt;font color="#0000FF"&gt;public&lt;/font&gt; &lt;font color="#000000"&gt;i_bar&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;public&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;void&lt;/font&gt; &lt;font color="#000000"&gt;print&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;const&lt;/font&gt; &lt;font color="#0000FF"&gt;char&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;txt&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;{&lt;/font&gt; &lt;font color="#000000"&gt;printf_s&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#006400"&gt;"%s&lt;/font&gt;&lt;b&gt;&lt;font color="#00C8C8"&gt;\n&lt;/font&gt;&lt;/b&gt;&lt;font color="#006400"&gt;"&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;txt&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt; &lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;private&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;foo&lt;/font&gt; &lt;font color="#000000"&gt;m_obj&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;};&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Данный код скомпилиться и будет работать. Но этот подход требует создание "костылей", что не радует глаз. К тому же нарушается иерархия. &lt;span&gt;foo&lt;/span&gt; приходиться знать о &lt;span&gt;bar&lt;/span&gt;, хотя знать о нём он не обязан. Всё что нужно - это вызов некой "абстрактной" функции/метода. А чья она - это уже не важно.&lt;br/&gt;&lt;br/&gt;Можно "разнести" объявление и реализацию классов:&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;i&gt;&lt;font color="#808080"&gt;// bar.h&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#0000C8"&gt;#include&lt;/font&gt; &lt;font color="#006400"&gt;"foo.h"&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;class&lt;/font&gt; &lt;font color="#000000"&gt;bar&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;public&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;void&lt;/font&gt; &lt;font color="#000000"&gt;print&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;const&lt;/font&gt; &lt;font color="#0000FF"&gt;char&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;txt&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;{&lt;/font&gt; &lt;font color="#000000"&gt;printf_s&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#006400"&gt;"%s&lt;/font&gt;&lt;b&gt;&lt;font color="#00C8C8"&gt;\n&lt;/font&gt;&lt;/b&gt;&lt;font color="#006400"&gt;"&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;txt&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt; &lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;private&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;foo&lt;/font&gt; &lt;font color="#000000"&gt;m_obj&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#808080"&gt;// foo.h&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;class&lt;/font&gt; &lt;font color="#000000"&gt;bar&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;class&lt;/font&gt; &lt;font color="#000000"&gt;foo&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;public&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;void&lt;/font&gt; &lt;font color="#000000"&gt;test&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;bar&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;b&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#808080"&gt;// foo.cpp&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#0000C8"&gt;#include&lt;/font&gt; &lt;font color="#006400"&gt;"foo.h"&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000C8"&gt;#include&lt;/font&gt; &lt;font color="#006400"&gt;"bar.h"&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;void&lt;/font&gt; &lt;font color="#000000"&gt;foo&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;test&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;bar&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;b&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;b&lt;/font&gt;&lt;font color="#C8003C"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;print&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#006400"&gt;"foo"&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Но раскидывать код по файлам не всегда бывает удобно. К тому же снова идёт нарушении иерархии, как в предидущем пункте. Но как бы то ни было, этот метод очень распространён. И я пользовался им до недавнего времени.&lt;br/&gt;&lt;br/&gt;Пока не начала курить boost =)&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#0000FF"&gt;typedef&lt;/font&gt; &lt;font color="#000000"&gt;boost&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;function&lt;/font&gt;&lt;font color="#C8003C"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#0000FF"&gt;void&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;const&lt;/font&gt; &lt;font color="#0000FF"&gt;char&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#000000"&gt;boost_func&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;class&lt;/font&gt; &lt;font color="#000000"&gt;foo&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;public&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;void&lt;/font&gt; &lt;font color="#000000"&gt;test&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;boost_func&lt;/font&gt; &lt;font color="#C8003C"&gt;&amp;amp;&lt;/font&gt; &lt;font color="#000000"&gt;func&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;{&lt;/font&gt; &lt;font color="#000000"&gt;func&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#006400"&gt;"foo"&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt; &lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;class&lt;/font&gt; &lt;font color="#000000"&gt;bar&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;public&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;void&lt;/font&gt; &lt;font color="#000000"&gt;print&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;const&lt;/font&gt; &lt;font color="#0000FF"&gt;char&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#000000"&gt;txt&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;{&lt;/font&gt; &lt;font color="#000000"&gt;printf_s&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#006400"&gt;"%s&lt;/font&gt;&lt;b&gt;&lt;font color="#00C8C8"&gt;\n&lt;/font&gt;&lt;/b&gt;&lt;font color="#006400"&gt;"&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;txt&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt; &lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;private&lt;/font&gt;&lt;font color="#C8003C"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;foo&lt;/font&gt; &lt;font color="#000000"&gt;m_obj&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF"&gt;int&lt;/font&gt; &lt;font color="#000000"&gt;_tmain&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#0000FF"&gt;int&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#0000FF"&gt;char&lt;/font&gt; &lt;font color="#C8003C"&gt;*&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;foo&lt;/font&gt; &lt;font color="#000000"&gt;f&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;bar&lt;/font&gt; &lt;font color="#000000"&gt;b&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;f&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;test&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;boost_func&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;boost&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;bind&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#C8003C"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#000000"&gt;bar&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;print&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#C8003C"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#000000"&gt;b&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;_1&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;return&lt;/font&gt; &lt;font color="#40B440"&gt;0&lt;/font&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Вуаля! &lt;span&gt;boost&lt;/span&gt;::&lt;span&gt;bind&lt;/span&gt; + &lt;span&gt;boost&lt;/span&gt;::&lt;span&gt;function&lt;/span&gt; решает все проблемы. Раскидывать ничего не надо. К томуже &lt;span&gt;foo&lt;/span&gt; не приходиться ничего знает о &lt;span&gt;bar&lt;/span&gt;. Одни плюсы =)&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/1166717357843559011-6957702369609639631?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/sOGyNhXGh88" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/6957702369609639631/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=6957702369609639631" title="Комментарии: 10" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/6957702369609639631?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/6957702369609639631?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/sOGyNhXGh88/blog-post.html" title="О ссылающихся друг на друга объектах" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>10</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2008/01/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUFSHw9eSp7ImA9WB9aEkw.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-6346741707141530221</id><published>2007-12-31T01:39:00.000+05:00</published><updated>2008-01-02T00:36:59.261+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-02T00:36:59.261+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><title>MS's magic</title><content type="html">Частые глюки компилятора MS порождают такие комментарии в коде:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;FONT face="Courier New" color=#000000 size=2&gt;...;&lt;FONT color=#006600&gt;// std::vector/deque or boost::ptr_vector/ptr_deque&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// generate a mysterious spell - "MS's compiller error".&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Seems like std::list have a resistance from that magic&lt;/FONT&gt;&lt;/FONT&gt;&lt;/blockquote&gt;&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/1166717357843559011-6346741707141530221?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/9yOskjwtnqo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/6346741707141530221/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=6346741707141530221" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/6346741707141530221?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/6346741707141530221?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/9yOskjwtnqo/mss-magic.html" title="MS's magic" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2007/12/mss-magic.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQDQHg7eyp7ImA9WxZRGEk.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-1105645534864428377</id><published>2007-12-29T00:42:00.002+05:00</published><updated>2008-02-13T00:26:11.603+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-13T00:26:11.603+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="lod" /><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><category scheme="http://www.blogger.com/atom/ns#" term="landscape" /><category scheme="http://www.blogger.com/atom/ns#" term="lighting" /><category scheme="http://www.blogger.com/atom/ns#" term="outdoor" /><title>Про нормали</title><content type="html">Лод на то и лод, чтобы быть простым и быстрым. Но ведь хочеться чтобы, вдобавок, было и красиво.&lt;br /&gt;&lt;br /&gt;Что мы имеем изначально:&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/3_4.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_3_4.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/3_1.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_3_1.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Освещение не очень, правда? Как можно это исправить? Правильно, картой нормалей. Откуда её взять? Ну уж не рисовать самому конечно =) У нас же есть высокодетализированная геометрия ландшафа( патчи ).&lt;br /&gt;&lt;br /&gt;Выствляем матрицы:&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#000000"&gt;view&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;matrix_look_at_lh&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt;&lt;br /&gt;     &lt;font color="#000000"&gt;view&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt;&lt;br /&gt;     &lt;font color="#000000"&gt;vec3&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;land_bbox&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;max&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;y&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color="#C8003C"&gt;),&lt;/font&gt;&lt;br /&gt;     &lt;font color="#000000"&gt;vec3&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color="#C8003C"&gt;),&lt;/font&gt;&lt;br /&gt;     &lt;font color="#000000"&gt;vec3&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#40B440"&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;proj&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;math&lt;/font&gt;&lt;font color="#C8003C"&gt;::&lt;/font&gt;&lt;font color="#000000"&gt;matrix_ortho_off_center_lh&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt;&lt;br /&gt;     &lt;font color="#000000"&gt;proj&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt;&lt;br /&gt;     &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt;&lt;br /&gt;     &lt;font color="#000000"&gt;land_bbox&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;width&lt;/font&gt;&lt;font color="#C8003C"&gt;(),&lt;/font&gt;&lt;br /&gt;     &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt;&lt;br /&gt;     &lt;font color="#000000"&gt;land_bbox&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;depth&lt;/font&gt;&lt;font color="#C8003C"&gt;(),&lt;/font&gt;&lt;br /&gt;     &lt;font color="#40B440"&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt;&lt;br /&gt;     &lt;font color="#000000"&gt;land_bbox&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;height&lt;/font&gt;&lt;font color="#C8003C"&gt;()&lt;/font&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;В шейдере не стоит забывать, что просто взять и записать в текстуру нормаль нельзя. Ибо она может содержать отрицательные значения. Посему пишем так:&lt;br /&gt;&lt;table width = "100%" bgcolor="#F2F2F2"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="#000000"&gt;float4&lt;/font&gt; &lt;font color="#000000"&gt;ps_main&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;in&lt;/font&gt; &lt;font color="#000000"&gt;float3&lt;/font&gt; &lt;font color="#000000"&gt;norm&lt;/font&gt; &lt;font color="#C8003C"&gt;:&lt;/font&gt; &lt;font color="#000000"&gt;TEXCOORD0&lt;/font&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;:&lt;/font&gt; &lt;font color="#000000"&gt;COLOR&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;normal&lt;/font&gt; &lt;font color="#C8003C"&gt;=&lt;/font&gt; &lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;normal&lt;/font&gt; &lt;font color="#C8003C"&gt;+&lt;/font&gt; &lt;font color="#40B440"&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color="#C8003C"&gt;)&lt;/font&gt; &lt;font color="#C8003C"&gt;/&lt;/font&gt; &lt;font color="#40B440"&gt;2.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color="#C8003C"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#0000FF"&gt;return&lt;/font&gt; &lt;font color="#000000"&gt;float4&lt;/font&gt;&lt;font color="#C8003C"&gt;(&lt;/font&gt; &lt;font color="#000000"&gt;norm&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;x&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;norm&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;z&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;norm&lt;/font&gt;&lt;font color="#C8003C"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;y&lt;/font&gt;&lt;font color="#C8003C"&gt;,&lt;/font&gt; &lt;font color="#40B440"&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color="#40B440"&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color="#C8003C"&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#C8003C"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://dobrokot.nm.ru/WinnieColorizer.html"&gt;&lt;font color="#727272" size=1&gt;_Winnie C++ Colorizer&lt;/font&gt;&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Заодно я поменял y и z координаты, чтобы в дальнейшем не было путанницы ( привет, нелюбимая система координат 3dmax ).&lt;br /&gt;&lt;br /&gt;В результате иммем:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/3_2.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_3_2.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Осветить всё это дело проблем уже не составляет.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ljplus.ru/img4/t/i/timai/3_3.jpg" target=_blank&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/th_3_3.jpg" width=400 height=300 border=0&gt;&lt;/a&gt;&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/1166717357843559011-1105645534864428377?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/iua1rGUD7QI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/1105645534864428377/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=1105645534864428377" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/1105645534864428377?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/1105645534864428377?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/iua1rGUD7QI/blog-post_8242.html" title="Про нормали" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2007/12/blog-post_8242.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAEQXc7fyp7ImA9WB9bGEo.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-4889375955001598899</id><published>2007-12-29T00:24:00.000+05:00</published><updated>2007-12-29T00:38:20.907+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-29T00:38:20.907+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="thoughts" /><title>мысли вслух</title><content type="html">Иногда так хочеться написать:&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;std&lt;FONT color=#000000&gt;::&lt;/FONT&gt;vector&lt;/FONT&gt;&amp;lt; &lt;FONT color=#0000ff&gt;const some_type&lt;/FONT&gt; &amp;amp; &amp;gt; &lt;FONT color=#808080&gt;foo&lt;/FONT&gt;&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/1166717357843559011-4889375955001598899?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/rD6J1T3e1T4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/4889375955001598899/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=4889375955001598899" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/4889375955001598899?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/4889375955001598899?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/rD6J1T3e1T4/blog-post_29.html" title="мысли вслух" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2007/12/blog-post_29.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ICRn4yfSp7ImA9WB9bGEg.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-8388967435938880423</id><published>2007-12-28T19:16:00.000+05:00</published><updated>2007-12-28T19:19:27.095+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-28T19:19:27.095+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><category scheme="http://www.blogger.com/atom/ns#" term="landscape" /><category scheme="http://www.blogger.com/atom/ns#" term="outdoor" /><title>Пару слов про ландшафт</title><content type="html">Ландшафт будем строить по уже сложившейся схеме. Лод + патчи.&lt;br /&gt;Лод для ландшафта генериться на этапе загрузки. Делается это очень просто, поэтому описание я опущу.&lt;br /&gt;Размер лода и патчей берутся из настроек карты. Чтобы твикать было удобнее.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/2_1.jpg"&gt;&lt;br /&gt;&lt;br /&gt;Рисум так - сначала лод, после - патчи вокруг камеры. Радиус видимости патчей так же берём из настроек.&lt;br /&gt;Маленькая хитрость - очищать Zbuffer после отрисовки лода. Ибо могут вылезти артефакты. Так же иногда лод нужно немного опустить вниз по Y. Тоже для борьбы с артефактами. Тоже берётся из настроек карты.&lt;br /&gt;&lt;br /&gt;Разница между сеткой лода и патчами:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/2_2.jpg"&gt;&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/1166717357843559011-8388967435938880423?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/5nq8c4K8p0k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/8388967435938880423/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=8388967435938880423" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/8388967435938880423?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/8388967435938880423?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/5nq8c4K8p0k/blog-post_28.html" title="Пару слов про ландшафт" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2007/12/blog-post_28.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EMQXs7fSp7ImA9WB9bGEg.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-4154650673127283955</id><published>2007-12-28T00:37:00.000+05:00</published><updated>2007-12-28T19:21:20.505+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-28T19:21:20.505+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><category scheme="http://www.blogger.com/atom/ns#" term="landscape" /><category scheme="http://www.blogger.com/atom/ns#" term="outdoor" /><title>О карте высот и пользе размытия</title><content type="html">Техника построения ланшафта по карте высот далеко не нова. К тому же это настолько просто, что реализовать её может практически любой школьник, хоть немного разбирающийся в программировани.&lt;br /&gt;&lt;br /&gt;Но иногда вылазят мелкие пакости, которые портят жизнь.&lt;br /&gt;&lt;br /&gt;Рассмотрим вариант, где количество вершин соответсвует количеству пикселей в карте высот. А высота вершины считается как lerp( min_height, max_height, pixel / 255 )&lt;br /&gt;&lt;br /&gt;При незначительном перепаде высот всё будет выглядеть хорошо. Но стоит нам его увеличить как вылезут артефакты:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/1.jpg"&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/2.jpg"&gt;&lt;br /&gt;&lt;br /&gt;Появляется некая "ступенчатость". Почему? Дело в том что при использованнии карты высот с разрешением 8 бит на пиксель, мы имеем рабочий диапазон значений 0-255. При перепаде высот, скажем, в 100 метров, минимальный шаг между высотами оказывается: 100 / 256 ~ 0.39м. &lt;br /&gt;Именно это низкое разрешение и является причиной "ступенчатости"&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/3.jpg"&gt;&lt;br /&gt;&lt;br /&gt;Как это побороть? Самый простой способ - увеличить рабочий диапазон. К примеру, до 16 бит, вместо 8ми. Тогда диапазон значений 0-65535. Что даст нам шаг в 100 / 65536 ~ 0.001м. Неплохо, да?&lt;br /&gt;&lt;br /&gt;Но это повлечёт за собой увелечение размера карты высот в 2 раза. Что, зачастую, нежелательно.&lt;br /&gt;&lt;br /&gt;Есть ещё один путь, требующий небольшого количества телодвижений. Размытие. Или, если будет угодно "усреднение значений".&lt;br /&gt;Блурим в 2 прохода( горизонтальный + вертикальный ) результирующие высоты с небольшим радиусом и получаем приятную картинку =)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/6.jpg"&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/7.jpg"&gt;&lt;br /&gt;&lt;br /&gt;Артефакты пропали. Разница очевидна.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/4.jpg"&gt;&lt;img src="http://www.ljplus.ru/img4/t/i/timai/5.jpg"&gt;&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/1166717357843559011-4154650673127283955?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/-xfV5JlX2VE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/4154650673127283955/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=4154650673127283955" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/4154650673127283955?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/4154650673127283955?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/-xfV5JlX2VE/blog-post.html" title="О карте высот и пользе размытия" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2007/12/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQFQHY_eSp7ImA9WB9bF0U.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-6712290860008856108</id><published>2007-12-27T13:24:00.000+05:00</published><updated>2007-12-28T01:45:11.841+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-28T01:45:11.841+05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><title>Demo</title><content type="html">Работа в геймдеве временно приостановлена. И неизвестно, как скоро я туда вернусь. А навыки терять не хочеться =)&lt;br /&gt;&lt;br /&gt;Буду делать небольшие демки и объединять всё в один домашний проект. Получится эдакое портфолио.&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/1166717357843559011-6712290860008856108?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/D_slvYKNumk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/6712290860008856108/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=6712290860008856108" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/6712290860008856108?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/6712290860008856108?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/D_slvYKNumk/demo.html" title="Demo" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2007/12/demo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08BQ3c5eip7ImA9WB9bGEg.&quot;"><id>tag:blogger.com,1999:blog-1166717357843559011.post-3006100430158264430</id><published>2007-12-22T18:36:00.000+05:00</published><updated>2007-12-28T19:24:12.922+05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-28T19:24:12.922+05:00</app:edited><title>Hellow world!</title><content type="html">Дабы отделить &lt;s&gt;зерна от плевел&lt;/s&gt; личное от рабочего буду писать тут на около и рабочую тематику. Привет.&lt;br /&gt;&lt;br /&gt;p.s. Для всего остального - &lt;a href="http://timai.livejournal.com"&gt;моя жжешечка&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1166717357843559011-3006100430158264430?l=timai-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/timai/~4/fX06GezgzSM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://timai-ru.blogspot.com/feeds/3006100430158264430/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1166717357843559011&amp;postID=3006100430158264430" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/3006100430158264430?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1166717357843559011/posts/default/3006100430158264430?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/timai/~3/fX06GezgzSM/hellow-world.html" title="Hellow world!" /><author><name>Timai</name><uri>http://www.blogger.com/profile/05078793428247812883</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="31" src="http://3.bp.blogspot.com/_NDG3qQEwxOc/SZiC1b5TVvI/AAAAAAAAAKk/3_9DWt-kczI/S220/furikuri_4_1024.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://timai-ru.blogspot.com/2007/12/hellow-world.html</feedburner:origLink></entry></feed>

