<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1166717357843559011</id><updated>2025-09-24T13:47:24.049+05:00</updated><category term="demo"/><category term="outdoor"/><category term="landscape"/><category term="vegetation"/><category term="thoughts"/><category term="boost"/><category term="demo fog"/><category term="fun"/><category term="generation"/><category term="lighting"/><category term="lod"/><category term="useful"/><title type='text'>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='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/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><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="demo fog"/><title type='text'>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=&quot;http://www.gamedev.ru/terms/Fog&quot;&gt;обычного тумана&lt;/A&gt; есть один недостаток - он окутывает всю сцену. Этого обычно достаточно чтобы воссоздать вид &quot;утреннего тумана&quot;, но если мы хотим сделать нечто посложнее, например, туман, стелющийся по земле, то эта техника не подходит.&lt;br /&gt;Нужно придать ему форму. Как? Сейчас это выясним.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/8_01.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_8_01.jpg&quot; 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=&quot;http://ru.wikipedia.org/wiki/Туман&quot;&gt;link&lt;/A&gt;].&lt;br /&gt;Если опустить детали, то туман - это частицы, частично препятствующие видимости. И, соответственно, чем больше этих частиц между наблюдателем и объектом, тем хуже этот объект видно. В компьютерной графике обычно используют 2 формулы для определения степени видимости в точке - &lt;A href=&quot;http://www.gamedev.ru/terms/LinearFog&quot;&gt;линейную&lt;/A&gt; и &lt;A href=&quot;http://www.gamedev.ru/terms/ExpFog&quot;&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=&quot;100%&quot; 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=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&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 = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;depth&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;pos&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;z&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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;Это т.н. &quot;быстрый&quot; расчёт глубины. Для повышения точности рекомендуют использовать формулу:&lt;br /&gt;&lt;br /&gt;&lt;table width = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;depth&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;distance&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;world_pos&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;camera_eye_pos&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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;Но для нашего случая высокая точность не обязательна, поэтому будем использовать &quot;быстрый&quot; вариант.&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=&quot;http://www.ljplus.ru/img4/t/i/timai/8_02.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_8_02.jpg&quot; 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;Как действует туман? Степень видимости объекта зависит от того, через какой количество частиц тумана прошёл луч света от объекта до глаза. Соответственно если мы можем определить &quot;количество&quot; тумана, лежащего между камерой и объектом, мы можем расчитать степень видимости в данной точке. Как это сделать?&lt;br /&gt;&lt;br /&gt;1) Для начала нам нужно создать &lt;i&gt;depth&lt;/i&gt;-текстуру с &quot;задними&quot; полигонами геометрии тумана. Как это делается, я описал выше. Есть 3 &quot;но&quot;:&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; &quot;наоборот&quot;&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;-текстуру для &quot;передних&quot; полигонов тумана. Тут всё как обычно.&lt;br /&gt;&lt;br /&gt;В результате мы имеем 2 текстуры с &quot;началом&quot; и &quot;концом&quot; тумана в каждой точке. Зная это, можно без проблем найти &quot;плотность&quot; тумана для каждого пикселя сцены.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Туманим&lt;/B&gt;&lt;br /&gt;Рисовать будем так - на уже отрендеренную сцену накладываем прямоугольник из 2-х полигонов со специальным шейдером. Как при постпроцессинге, да.&lt;br /&gt;&lt;br /&gt;Степень &quot;затуманенности&quot; каждого пикселя может посчитать по формуле:&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; - расстояние от камеры до &quot;задней&quot; части тумана&lt;br /&gt;&lt;I&gt;&amp;nbsp; fog_front&lt;/I&gt; - расстояние от камеры до &quot;передней&quot; части тумана&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=&quot;text-align: center;&quot;&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&#39;ы в шейдере, то можно написать так:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&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 = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;float4&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;fog_color&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;k&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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=&quot;text-align: center;&quot;&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=&quot;text-align: center;&quot;&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 = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;float4&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;fog_color&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;k&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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=&quot;http://www.ljplus.ru/img4/t/i/timai/8_03.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_8_03.jpg&quot; 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=&quot;100%&quot; 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=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&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=&quot;http://www.ljplus.ru/img4/t/i/timai/8_04.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_8_04.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Да, кстати, камеру можно помещать внутрь тумана, рисоваться будет по прежнему правильно:&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/8_05.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_8_05.jpg&quot; 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) Добавить вершинную анимацию, чтобы туман &quot;заиграл&quot;&lt;br /&gt;4) Вода. Мутная вода. Жидкости в больших сосудах&lt;br /&gt;5) Volumetric light&lt;br /&gt;6) Игровые эффекты. Можно сделать симпатичных &quot;призраков&quot;&lt;br /&gt;7) Добавить анимированную текстуру для выборки альфы - пар или дым&lt;br /&gt;8) Мелькает мысль про использования схожего алгоритма для теней. Должно получиться любопытно, ибо можно сделать очень &quot;мягкие&quot; тени&lt;br /&gt;&lt;br /&gt;Ну и ещё в нагрузку пару картинок&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/8_06.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_8_06.jpg&quot; width=250 height=188 border=0&gt;&lt;/a&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/8_07.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_8_07.jpg&quot; width=250 height=188 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/8_08.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_8_08.jpg&quot; width=250 height=188 border=0&gt;&lt;/a&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/8_09.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_8_09.jpg&quot; width=250 height=188 border=0&gt;&lt;/a&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/fullpage/post/1166717357843559011/8554704416268541904' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/8554704416268541904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/8554704416268541904'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2008/05/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>7</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="demo"/><category scheme="http://www.blogger.com/atom/ns#" term="outdoor"/><category scheme="http://www.blogger.com/atom/ns#" term="vegetation"/><title type='text'>Растительность. Часть 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 = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#0000FF&quot;&gt;static&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;vec2&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;current_offset&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;current_offset_lenght&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;vec_lenght&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;current_offset&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color=&quot;#808080&quot;&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;vec2&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;recovery_dir&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;vec_normalize&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;recovery_dir&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;current_offset&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color=&quot;#808080&quot;&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;deflection_k&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;current_offset_lenght&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;/&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;max_deflection&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_power&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_speed&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;flex&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;time_step&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;recovery_power&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;recovery_speed&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;deflection_k&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;time_step&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color=&quot;#808080&quot;&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;current_offset&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;+=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_dir&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_power&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;recovery_dir&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;recovery_power&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;clamp&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;current_offset&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;x&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;current_offset&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;x&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;max_deflection&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;+&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;max_deflection&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;clamp&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;current_offset&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;y&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;current_offset&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;y&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;max_deflection&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;+&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;max_deflection&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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;Трава у нас стала &quot;подчинятся&quot; ветру, но этого мало. В реальном мире она &quot;колышется&quot;. Этот эффект( в  основном ) достигается за счёт того что ветер никогда не бывает статичным. Он постоянно меняет своё  направление и силу в небольшом диапазоне.&lt;br /&gt;&lt;br /&gt;Реализовать этот эффект можно, к примеру, так:&lt;br /&gt;&lt;table width = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_minmax_k&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.5&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_max_power&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_power&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_min_power&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_power&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_minmax_k&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color=&quot;#808080&quot;&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;static&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_amplitude&lt;/font&gt;       &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;static&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_amplitude_dir&lt;/font&gt;   &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt;  &lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_amplitude_speed&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.5&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color=&quot;#808080&quot;&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;rand_k&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;lerp&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.25&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;rand&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;/&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;RAND_MAX&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color=&quot;#808080&quot;&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;wind_amplitude&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;+=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_amplitude_speed&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_amplitude_dir&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;m_time_step&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;rand_k&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;if&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_amplitude&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#C8003C&quot;&gt;||&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_amplitude&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;wind_amplitude_dir&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;wind_amplitude_dir&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;i&gt;&lt;font color=&quot;#808080&quot;&gt;//&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;saturate&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_amplitude&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_amplitude&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_speed&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;lerp&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_min_power&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_max_power&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wind_amplitude&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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=&quot;http://www.ljplus.ru/img4/t/i/timai/7_0.png&quot; width=300 height=150 alt=&#39;1,64 КБ&#39;&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Но это неправильно. Возмите ручку, поставьте её вертикально на стол и попробуйте наклонить. Заметьте,  что она движется по окружности:&lt;br /&gt;&lt;div align=center&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/7_2.png&quot; width=150 height=150 alt=&#39;4,11 КБ&#39;&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Нам нужно поступить аналогично. Делать &quot;честное&quot; смещение по окружности несколько &quot;дороговато&quot;,  поэтому обойдёмся упрощённой моделью. Уменьшим высоту на ту же величину, на сколько сдвинули её  ветром.&lt;br /&gt;&lt;div align=center&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/7_1.png&quot; width=300 height=150 alt=&#39;1,61 КБ&#39;&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Вот что у нас получилось в итоге&lt;br /&gt;&lt;div align=center&gt;&lt;object width=&quot;425&quot; height=&quot;350&quot;&gt; &lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/Jmn1Id4XFUc&quot;&gt; &lt;/param&gt; &lt;embed src=&quot;http://www.youtube.com/v/Jmn1Id4XFUc&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;425&quot; height=&quot;350&quot;&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. Если честно, я не очень доволен получившимся ветром. Был потрачен не один день, и всё равно, вышло немного не то что хотелось. Но слишком затягивать тоже не дело, ибо пресловутый &quot;синдром улучшения&quot; может растянуть процесс на неопределённый срок. Может ещё вернусь к этой теме.&lt;/font&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/fullpage/post/1166717357843559011/7665219649336227188' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/7665219649336227188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/7665219649336227188'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2008/01/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>3</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="demo"/><category scheme="http://www.blogger.com/atom/ns#" term="outdoor"/><category scheme="http://www.blogger.com/atom/ns#" term="vegetation"/><title type='text'>Растительность. Часть 2_1( отступление). В поисках идеальной фигуры</title><content type='html'>&lt;b&gt;Оригами из полигонов&lt;/b&gt;&lt;br /&gt;В качестве модели пучка травы я использовал т.н. &quot;звёздочку&quot; - 4 плоскости, повёрнутые вокруг оси Y.  Но у это фигуры есть очень серъёзный недостаток. Если направить камеру строго вниз - будет видна вся  плоская сущность &quot;кустика&quot;, что здорово аноит.&lt;br /&gt;&lt;br /&gt;Пример:&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/6a_2.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6a_2.jpg&quot; 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=&quot;http://www.ljplus.ru/img4/t/i/timai/6a_0.jpg&quot; width=400 height=211 alt=&#39;27,53 КБ&#39;&gt;&lt;br /&gt;&lt;br /&gt;В результате выбор был остановлен на этой фигуре:&lt;br /&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/6a_1.jpg&quot; width=400 height=300 alt=&#39;22,80 КБ&#39;&gt;&lt;br /&gt;&lt;br /&gt;Моделирование той же ситуации( камера направлена вниз ) с новой геометрией&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/6a_3.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6a_3.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Как видно, растительность приобрела ещё немного &quot;объемности&quot;, а досадный артефакт исчез.&lt;br /&gt;&lt;br /&gt;Новая геометрия добавила немного &quot;природного хаоса&quot;, что положительно сказалось на общей картине&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/6a_4.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6a_4.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&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/fullpage/post/1166717357843559011/6407644770352972295' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/6407644770352972295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/6407644770352972295'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2008/01/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>7</thr:total></entry><entry><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><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"/><category scheme="http://www.blogger.com/atom/ns#" term="vegetation"/><title type='text'>Растительность. Часть 2. Отрисовка</title><content type='html'>&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/6_t.jpg&quot; width=300 height=225 alt=&#39;46,91 КБ&#39;&gt;&lt;br /&gt;&lt;br /&gt;После того как мы сгенерировали матрицы [&lt;a href=&quot;http://timai-ru.blogspot.com/2008/01/1.html&quot;&gt;link&lt;/a&gt;] пришло время заняться непосредственно рендером.&lt;br /&gt;&lt;br /&gt;Рисовать мы будет пучками. Геометрия - знакомая многим &quot;звёздочка&quot;. 4 плоскости или 8 полигонов.&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/6_0.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6_0.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Она же после альфа теста:&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/6_1.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6_1.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Увеличим плотность засейки. Вблизи смотриться неплохо:&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/6_2.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6_2.jpg&quot; 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=&quot;http://www.ljplus.ru/img4/t/i/timai/6_3.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6_3.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На самой верхушки пучков повылазили артефакты. Их природа довольно проста и лечится всё это дело выставлением clamp&#39;а, вместо wrap в самплере.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Артефакт 2. mipmaps и алиасинг&lt;/b&gt;&lt;br /&gt;Если отодвинуть камеру ещё дальше, то можно заметить что картинка поменялась в худшую сторону.&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/6_5.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6_5.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Что произошло? Трава стала менее прозрачной. Почему? Кто работал с альфатестом - знают в чём проблема.&lt;br /&gt;Всё дело в mipmap уровнях( если кто не знает что это - [&lt;a href=&quot;http://www.gamedev.ru/terms/MipMap&quot;&gt;link&lt;/a&gt;] )&lt;br /&gt;&lt;br /&gt;Рассмотрим мип-уровни куста( альфа канал ).&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/6_4.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6_4.jpg&quot; width=400 height=100 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Как видно, уже на 5-ом уровне альфа канал теряет все детали и превращается в пятно. В результате дальние кусты травы( использующие 4+  мип уровни ) теряют прозрачность и становятся более &quot;монолитными&quot;.&lt;br /&gt;&lt;br /&gt;Что первое приходит на ум - отключить сам mipmaping, в результате чего будет использоваться текстура с максимальным разрешением. Но сделав это, мы получим очень неприятный алиасинг.&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/6_6.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6_6.jpg&quot; 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=&quot;http://www.ljplus.ru/img4/t/i/timai/6_7.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6_7.jpg&quot; 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;Очевидно что рисовать один куст за вызов слишком &quot;дорого&quot;. К примеру, у меня в кадре может быть более 4000 кустов. Делать 4000 вызовов на отрисовку( dip ) будет слишком накладно. Посему будем использовать shader constant geometry instancing.&lt;br /&gt;&lt;br /&gt;Как оно работает. Известно, что vertex shader 2_0 и выше может работать как минимум с 256 регистрами( каждый регистр - это 4 float ), в которые можно затолкать 64 матрицы 4х4. Оставим 16 регистров для других нужд( видовая матрица, освещение и т.д )  и &quot;забёрём&quot; остальные. Итого 60 матриц в нашем распоряжении.&lt;br /&gt;&lt;br /&gt;Чтобы использовать instancing нужна &quot;особая&quot; геометрия. Если кратко - батчинг с индексом на каждый элемент. Если подробно - каждый куст мы описывает 16-ю вершинами и 24-мя индексами. Нам нужно увеличить вершинный и индексный буффер в 60 раз и заполнить их копиями оригинала. Примерно так:&lt;br /&gt;&lt;br /&gt;&lt;table width = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;unsigned&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;j&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;1&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;j&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;60&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;j&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;++&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;unsigned&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;16&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;++&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;vertex&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;[&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;j&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;16&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;vertex&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;[&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;];&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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;С индексами нужно поступить аналогично. В дополнение к сделанному нужно расширить формат вершины. Если раньше она содержала только позицию и текстурные координаты, то теперь она дополнилась индексом батча. Т.е. каждая вершина в &quot;пучке&quot; знает к какому индексу она относится.&lt;br /&gt;&lt;br /&gt;&lt;table width = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;unsigned&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;j&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;j&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;60&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;j&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;++&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;for&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;unsigned&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;16&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;++&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;vertex&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;[&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;j&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;16&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;].&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;index&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;j&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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;Буфера &quot;забатчены&quot; и проиндексированы. Осталось отрисовать.&lt;br /&gt;&lt;table width = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;float4x4&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;g_vp&lt;/font&gt;          &lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;register&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;c0&lt;/font&gt;  &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;float4x4&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;g_world&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;[&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;60&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;register&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;c16&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;vs_main&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;inout&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;float4&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;pos&lt;/font&gt;   &lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;POSITION&lt;/font&gt;  &lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt;&lt;br /&gt;              &lt;font color=&quot;#000000&quot;&gt;inout&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;float2&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;tex&lt;/font&gt;   &lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;TEXCOORD0&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt;&lt;br /&gt;              &lt;font color=&quot;#000000&quot;&gt;in&lt;/font&gt;    &lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt;  &lt;font color=&quot;#000000&quot;&gt;index&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;TEXCOORD1&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;float4&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;world_pos&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mul&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;pos&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;g_world&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;[&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;index&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;pos&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mul&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;world_pos&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;g_vp&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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=&quot;http://www.ljplus.ru/img4/t/i/timai/6_8.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6_8.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/6_9.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_6_9.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&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/fullpage/post/1166717357843559011/8694296622665665661' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/8694296622665665661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/8694296622665665661'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2008/01/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>2</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="demo"/><category scheme="http://www.blogger.com/atom/ns#" term="generation"/><category scheme="http://www.blogger.com/atom/ns#" term="landscape"/><category scheme="http://www.blogger.com/atom/ns#" term="outdoor"/><category scheme="http://www.blogger.com/atom/ns#" term="vegetation"/><title type='text'>Растительность. Часть 1. Генерация.</title><content type='html'>&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/5_t.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size = 1&gt;&lt;i&gt;Первоначально планировался один общий текст. Но т.к. получилось &quot;слишком много букв&quot; разбил на 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=&quot;http://www.ljplus.ru/img4/t/i/timai/5_0.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;Если сгенерировать рандомайзом позиции, то могут получиться весьма любопытные результаты.&lt;br /&gt;&lt;br /&gt;Например вот&lt;br /&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/5_2.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;или вот&lt;br /&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/5_3.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;Очевидно, что такая &quot;генерация&quot; неприемлима, ибо абсолютно непредсказуема. Нужен алгоритм, при  котором &quot;засеивание&quot; должно быть относительно равномерным. Как это сделать?&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;, увеличивается плотность засеивания. Получаем довольно &quot;прозрачное&quot;  управление.&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=&quot;http://www.ljplus.ru/img4/t/i/timai/5_4.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;Осталось только добавить немного &quot;хаоса&quot; =) Рандомно генерируем точку в пределах каждого региона.&lt;br /&gt;&lt;br /&gt;Получаем:&lt;br /&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/5_5.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;Как раз то что и было нужно. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Рассаживаем на ландшафте&lt;/b&gt;&lt;br /&gt;Область мы сгенерировали. Но этого мало, нужно ещё &quot;рассадить&quot; всё это дело на ландшафте. Тут, на  самом деле, всё просто. Всё что нужно - это определить высоту( &lt;i&gt;&quot;y&quot;&lt;/i&gt; координату ) точки  ландшафта, где будет располагаться куст. Интереса ради я попробовал решить это проблему &quot;в лоб&quot;.  &quot;Пробивал&quot; лучом каждый треугольник патчей при помощи функции 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=&quot;http://www.everfall.com/paste/id.php?m37ex3rodh6c&quot;&gt;link&lt;/a&gt;] или здесь [&lt;a href=&quot;http://rafb.net/p/4tBGyM16.html&quot;&gt;link&lt;/a&gt;].&lt;br /&gt;&lt;br /&gt;Вот что у нас получилось в итоге:&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/5_6.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_5_6.jpg&quot; 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 бит на пиксель, без компрессии ) для этих целей. Какой точке на маске  соответствует &quot;травинка&quot; считаем:&lt;br /&gt;&lt;table width = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;mask_offset_x&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;grass_pos&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;x&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;-&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;grass_region_bbox&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;min&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;x&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;/&lt;/font&gt;&lt;br /&gt;      &lt;font color=&quot;#000000&quot;&gt;grass_region_bbox_width&lt;/font&gt;  &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mask_width&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;mask_offset_y&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;br /&gt;    &lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;grass_pos&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;z&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;-&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;grass_region_bbox&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;min&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;z&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;/&lt;/font&gt;&lt;br /&gt;      &lt;font color=&quot;#000000&quot;&gt;grass_region_bbox_height&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mask_height&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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;После всех этих сложных телодвижения можно наконец-то построить матрицу каждой травинки. Для  &quot;естественности&quot; добавим немного рандомайза в финальные вычисления. Итого мы получаем:&lt;br /&gt;&lt;table width = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;scale&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;lerp&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;scale_min&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;scale_max&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;rand&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;/&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;RAND_MAX&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;scale&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;scale_factor&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;matrix&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mat_tr&lt;/font&gt;  &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_translation&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;mat_tr&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;pos&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;matrix&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mat_sc&lt;/font&gt;  &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_scaling&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;mat_sc&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;vec3&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;scale&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;matrix&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mat_rot&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_rotation_y&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;mat_rot&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;rand&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;/&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;float&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;RAND_MAX&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;matrix&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mat_res&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt;  &lt;font color=&quot;#000000&quot;&gt;mat_sc&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mat_rot&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mat_tr&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt; &lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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;Всё, генерация закончена. Следующий этап - отрисовка( будет завтра ).</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/fullpage/post/1166717357843559011/8294684998837887232' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/8294684998837887232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/8294684998837887232'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2008/01/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>4</thr:total></entry><entry><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><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 type='text'>О масках</title><content type='html'>&lt;div style=&quot;float:left; width:300px; height:197px; position: relative;top:5px; margin-right: 10px;&quot;&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/4_t.jpg&quot; width=300 height=197 alt=&#39;30,87 КБ&#39;&gt;&lt;/div&gt;Визуализация открытых пространств - штука весьма интересная. Сгенерировать/загрузить саму геометрию ландашфта - это не так сложно. А вот грамотно и красиво его &quot;разукрасить&quot; - это уже поинтереснее.&lt;br /&gt;&lt;br /&gt;В настоящий момент б&lt;STRONG&gt;о&lt;/STRONG&gt;льшая часть игр, действие которых происходит на открытых пространствах используют маски + затайленные текстуры. Если кто не совсем понял о чем речь - поясню. Нарисовать и использовать одну текстуру для всего ланшафта - слишком &quot;дорого&quot; для железа. Ибо при обычном подходе( есть ещё &quot;необычный&quot;, об этом ниже ) такая текстурка просто отжрёт всю видеопамять( если вообще сможет загрузиться ). Поэтому используют маски. Маска - это обыная ч/б текстура. Диффузный цвет пикселя считается как ( &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;Есть ещё относительно новый подход - &quot;Мегатекстура&quot; от дядюшки Кармака. Вот тут очень популярно о ней написно [&lt;a href=&quot;http://www.gamedev.ru/code/articles/Megatexture&quot;&gt;link&lt;/a&gt;]. Техника довольно проста в реализации. Основной труд - написание инструментария для хранения и генерации этой &quot;мегатекстуры&quot;. Я ещё коснусь этой темы в конце поста.&lt;br /&gt;&lt;br /&gt;В своё время я реализовывал 1-ый вариант. Причём очень хитрый и заковыристый. С разбивкой на субматериалы, с неограниченным количеством масок и т.д. Но главной проблемы избежать так и не удалось - без увеличения плотности сетки нельзя было увеличить делализацию маски. К примеру - есть ландшафт. На нём хочеться нарисовать тропинку. Нарисовать-то мы её нарисуем, но в итоге увидим что края этой дорожки сильно размыты. Почему? Предположим, шаг сетки у нас 1 метр. В одной веришине значение маски 1.0 в другой 0.0. Что случиться? Правильно, инторполяция. В итоге имеем метровый градиент, дающий малопривлекательную &quot;размытость&quot;. Регионы травы, песка и камней рисовать пойдёт, но не более.&lt;br /&gt;&lt;br /&gt;Нужен другой подход, сочетающий в себе произвольную точность и низкую ресурсоёмкость. Как этого можно добиться? Нужно &quot;освободить&quot; маски. Чтобы они не были привязаны ни к геометрии, ни размеру текстуры. Как? Разбивать на произвольные регионы. Сейчас объясню как.&lt;br /&gt;&lt;br /&gt;Определям регион маски. Вот он - красный aabbox в центре.&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/4_3.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_4_3.jpg&quot; 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=&quot;100%&quot; 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=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&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;Чтобы не считать всё это в шейдере, посчитаем &quot;снаружи&quot; и передадим в качестве матрицы.&lt;br /&gt;&lt;TABLE width=&quot;100%&quot; 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=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&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=&quot;100%&quot; 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=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&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=&quot;http://www.ljplus.ru/img4/t/i/timai/4_2.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_4_2.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Важное замечание: нужно обязательното включить &quot;clamp&quot; для текстуры маски. Иначе она пойдёт тайлиться на соседние области, что недопустимо. Тайлиться он перестал, но этого мало, нужно чтобы она ( маска ) не затронула соседние регионы. Есть 2 решения.&lt;br /&gt;1) При рисовании маски закрашивать пиксели на границе в черный цвет.&lt;br /&gt;2) Использовать clip planes. 4 штуки по сторонам бокса материала.&lt;br /&gt;&lt;br /&gt;Маска отображается корректно? Самое время добавить диффузную текстуру.&lt;br /&gt;&lt;TABLE width=&quot;100%&quot; 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=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&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=&quot;http://www.ljplus.ru/img4/t/i/timai/4_4.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_4_4.jpg&quot; 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=&quot;http://www.ljplus.ru/img4/t/i/timai/4_5.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_4_5.jpg&quot; 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=&quot;http://www.ljplus.ru/img4/t/i/timai/4_6.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_4_6.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Этот подход удобен тем, что предоставляет возможность получать высокую детализацию там где необходимо, и экономить видеопамять там, где точность не критична.&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/4_7.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_4_7.jpg&quot; 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;Данный подход можно использовать совместно с &quot;мегатекстурой&quot;. Для её генерации конечно же, а не отрисовки =) Мысль довольно интересная, может я её разовью в дальнейшем.&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;Итого&lt;/STRONG&gt;&lt;br /&gt;Получилась очень хорошая техника. По крайней мере, мне нравится как она работает.&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/4_0.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_4_0.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/4_1.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_4_1.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&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/fullpage/post/1166717357843559011/5845433957601790106' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/5845433957601790106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/5845433957601790106'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2008/01/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>4</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="boost"/><category scheme="http://www.blogger.com/atom/ns#" term="thoughts"/><category scheme="http://www.blogger.com/atom/ns#" term="useful"/><title type='text'>О ссылающихся друг на друга объектах</title><content type='html'>Очень часто возникает ситуация, при которой объект, объявленный раньше, должен вызывать метод объекта, объявленного позже. Но поменять объявления местами не представляется возможным, ибо &quot;нижестоящий&quot; по коду ссылается на &quot;вышестоящего&quot;.&lt;br /&gt;&lt;br /&gt;Пример:&lt;br /&gt;&lt;table width = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;foo&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;test&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;bar&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;b&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;b&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#006400&quot;&gt;&quot;foo&quot;&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;bar&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;char&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;txt&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;printf_s&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#006400&quot;&gt;&quot;%s&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#00C8C8&quot;&gt;\n&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#006400&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;txt&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;private&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;foo&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;m_obj&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;};&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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 = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#0000FF&quot;&gt;struct&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i_bar&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;virtual&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;char&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;txt&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;foo&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;test&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i_bar&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;b&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;b&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#006400&quot;&gt;&quot;foo&quot;&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;bar&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i_bar&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;char&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;txt&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;printf_s&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#006400&quot;&gt;&quot;%s&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#00C8C8&quot;&gt;\n&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#006400&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;txt&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;private&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;foo&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;m_obj&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;};&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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;Данный код скомпилиться и будет работать. Но этот подход требует создание &quot;костылей&quot;, что не радует глаз. К тому же нарушается иерархия. &lt;span&gt;foo&lt;/span&gt; приходиться знать о &lt;span&gt;bar&lt;/span&gt;, хотя знать о нём он не обязан. Всё что нужно - это вызов некой &quot;абстрактной&quot; функции/метода. А чья она - это уже не важно.&lt;br/&gt;&lt;br/&gt;Можно &quot;разнести&quot; объявление и реализацию классов:&lt;br /&gt;&lt;table width = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;i&gt;&lt;font color=&quot;#808080&quot;&gt;// bar.h&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color=&quot;#0000C8&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#006400&quot;&gt;&quot;foo.h&quot;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;bar&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;char&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;txt&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;printf_s&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#006400&quot;&gt;&quot;%s&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#00C8C8&quot;&gt;\n&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#006400&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;txt&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;private&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;foo&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;m_obj&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;font color=&quot;#808080&quot;&gt;// foo.h&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;bar&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;foo&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;test&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;bar&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;b&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;font color=&quot;#808080&quot;&gt;// foo.cpp&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color=&quot;#0000C8&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#006400&quot;&gt;&quot;foo.h&quot;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000C8&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#006400&quot;&gt;&quot;bar.h&quot;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;foo&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;test&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;bar&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;b&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;b&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;-&amp;gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#006400&quot;&gt;&quot;foo&quot;&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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 = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#0000FF&quot;&gt;typedef&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;boost&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;function&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;&amp;lt;&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;char&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;boost_func&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;foo&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;test&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;boost_func&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;&amp;amp;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;func&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;func&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#006400&quot;&gt;&quot;foo&quot;&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;class&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;bar&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;public&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;void&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;char&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;txt&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;printf_s&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#006400&quot;&gt;&quot;%s&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#00C8C8&quot;&gt;\n&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#006400&quot;&gt;&quot;&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;txt&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;private&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;foo&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;m_obj&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;_tmain&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;int&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#0000FF&quot;&gt;char&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;*&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;foo&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;f&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;bar&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;b&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;f&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;test&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;boost_func&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;boost&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;bind&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;&amp;amp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;bar&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;print&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;&amp;amp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;b&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;_1&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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;Вот только я ещё не до конца понял, как это штука работает. Но работает - факт.</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/fullpage/post/1166717357843559011/6957702369609639631' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/6957702369609639631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/6957702369609639631'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2008/01/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>10</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="fun"/><title type='text'>MS&#39;s magic</title><content type='html'>Частые глюки компилятора MS порождают такие комментарии в коде:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;FONT face=&quot;Courier New&quot; 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 - &quot;MS&#39;s compiller error&quot;.&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;Так и живём.</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/fullpage/post/1166717357843559011/6346741707141530221' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/6346741707141530221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/6346741707141530221'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2007/12/mss-magic.html' title='MS&#39;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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>0</thr:total></entry><entry><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><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="lod"/><category scheme="http://www.blogger.com/atom/ns#" term="outdoor"/><title type='text'>Про нормали</title><content type='html'>Лод на то и лод, чтобы быть простым и быстрым. Но ведь хочеться чтобы, вдобавок, было и красиво.&lt;br /&gt;&lt;br /&gt;Что мы имеем изначально:&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/3_4.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_3_4.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ljplus.ru/img4/t/i/timai/3_1.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_3_1.jpg&quot; 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 = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;view&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_look_at_lh&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#000000&quot;&gt;view&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#000000&quot;&gt;vec3&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;land_bbox&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;max&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;y&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#C8003C&quot;&gt;),&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#000000&quot;&gt;vec3&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#C8003C&quot;&gt;),&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#000000&quot;&gt;vec3&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;proj&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;math&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;::&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;matrix_ortho_off_center_lh&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#000000&quot;&gt;proj&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#000000&quot;&gt;land_bbox&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;width&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(),&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#000000&quot;&gt;land_bbox&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;depth&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(),&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#40B440&quot;&gt;0.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt;&lt;br /&gt;     &lt;font color=&quot;#000000&quot;&gt;land_bbox&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;height&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;()&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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 = &quot;100%&quot; bgcolor=&quot;#F2F2F2&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;float4&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;ps_main&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;in&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;float3&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;norm&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;TEXCOORD0&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;COLOR&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;normal&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;normal&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#C8003C&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#C8003C&quot;&gt;/&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;2.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt;&lt;font color=&quot;#C8003C&quot;&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000FF&quot;&gt;return&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;float4&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;norm&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;x&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;norm&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;z&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;norm&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;y&lt;/font&gt;&lt;font color=&quot;#C8003C&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#40B440&quot;&gt;1.&lt;/font&gt;&lt;b&gt;&lt;font color=&quot;#40B440&quot;&gt;f&lt;/font&gt;&lt;/b&gt; &lt;font color=&quot;#C8003C&quot;&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#C8003C&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://dobrokot.nm.ru/WinnieColorizer.html&quot;&gt;&lt;font color=&quot;#727272&quot; 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=&quot;http://www.ljplus.ru/img4/t/i/timai/3_2.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_3_2.jpg&quot; 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=&quot;http://www.ljplus.ru/img4/t/i/timai/3_3.jpg&quot; target=_blank&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/th_3_3.jpg&quot; width=400 height=300 border=0&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&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/fullpage/post/1166717357843559011/1105645534864428377' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/1105645534864428377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/1105645534864428377'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2007/12/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>2</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="thoughts"/><title type='text'>мысли вслух</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;А низя =(</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/fullpage/post/1166717357843559011/4889375955001598899' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/4889375955001598899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/4889375955001598899'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2007/12/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>0</thr:total></entry><entry><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><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 type='text'>Пару слов про ландшафт</title><content type='html'>Ландшафт будем строить по уже сложившейся схеме. Лод + патчи.&lt;br /&gt;Лод для ландшафта генериться на этапе загрузки. Делается это очень просто, поэтому описание я опущу.&lt;br /&gt;Размер лода и патчей берутся из настроек карты. Чтобы твикать было удобнее.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/2_1.jpg&quot;&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=&quot;http://www.ljplus.ru/img4/t/i/timai/2_2.jpg&quot;&gt;&lt;br /&gt;&lt;br /&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/fullpage/post/1166717357843559011/8388967435938880423' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/8388967435938880423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/8388967435938880423'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2007/12/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>1</thr:total></entry><entry><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><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 type='text'>О карте высот и пользе размытия</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=&quot;http://www.ljplus.ru/img4/t/i/timai/1.jpg&quot;&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/2.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Появляется некая &quot;ступенчатость&quot;. Почему? Дело в том что при использованнии карты высот с разрешением 8 бит на пиксель, мы имеем рабочий диапазон значений 0-255. При перепаде высот, скажем, в 100 метров, минимальный шаг между высотами оказывается: 100 / 256 ~ 0.39м. &lt;br /&gt;Именно это низкое разрешение и является причиной &quot;ступенчатости&quot;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/3.jpg&quot;&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;Есть ещё один путь, требующий небольшого количества телодвижений. Размытие. Или, если будет угодно &quot;усреднение значений&quot;.&lt;br /&gt;Блурим в 2 прохода( горизонтальный + вертикальный ) результирующие высоты с небольшим радиусом и получаем приятную картинку =)&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/6.jpg&quot;&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/7.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Артефакты пропали. Разница очевидна.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/4.jpg&quot;&gt;&lt;img src=&quot;http://www.ljplus.ru/img4/t/i/timai/5.jpg&quot;&gt;&lt;br /&gt;&lt;br /&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/fullpage/post/1166717357843559011/4154650673127283955' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/4154650673127283955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/4154650673127283955'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2007/12/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>2</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="demo"/><title type='text'>Demo</title><content type='html'>Работа в геймдеве временно приостановлена. И неизвестно, как скоро я туда вернусь. А навыки терять не хочеться =)&lt;br /&gt;&lt;br /&gt;Буду делать небольшие демки и объединять всё в один домашний проект. Получится эдакое портфолио.&lt;br /&gt;&lt;br /&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/fullpage/post/1166717357843559011/6712290860008856108' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/6712290860008856108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/6712290860008856108'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2007/12/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>1</thr:total></entry><entry><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><title type='text'>Hellow world!</title><content type='html'>Дабы отделить &lt;s&gt;зерна от плевел&lt;/s&gt; личное от рабочего буду писать тут на около и рабочую тематику. Привет.&lt;br /&gt;&lt;br /&gt;p.s. Для всего остального - &lt;a href=&quot;http://timai.livejournal.com&quot;&gt;моя жжешечка&lt;/a&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/fullpage/post/1166717357843559011/3006100430158264430' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/3006100430158264430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1166717357843559011/posts/default/3006100430158264430'/><link rel='alternate' type='text/html' href='http://timai-ru.blogspot.com/2007/12/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='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju_6nGrHN73eudwm-Ad5S10LNobdQPnaEp5ndhdWB7KdaGIWKBWvQIfYOaIMjidjI80lcvqRDdewnpAJAflDkXoYfi3E6OCw5k4JqpO_CVu4Y8znL_fdUsY79TIjnP7A/s220/furikuri_4_1024.jpg'/></author><thr:total>2</thr:total></entry></feed>