<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>null_ptr</title>
  <link>http://null-ptr.livejournal.com/</link>
  <description>null_ptr - LiveJournal.com</description>
  <lastBuildDate>Sat, 17 Jan 2009 16:29:14 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>null_ptr</lj:journal>
  <lj:journalid>6696447</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/93620488/6696447</url>
    <title>null_ptr</title>
    <link>http://null-ptr.livejournal.com/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/5658.html</guid>
  <pubDate>Sat, 17 Jan 2009 16:29:14 GMT</pubDate>
  <title>Deferred Shading, AA, alpha blending. (demo, DX9)</title>
  <link>http://null-ptr.livejournal.com/5658.html</link>
  <description>&lt;span class=&apos;ljuser  ljuser-name_zeux&apos; lj:user=&apos;zeux&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://zeux.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://zeux.livejournal.com/&apos;&gt;&lt;b&gt;zeux&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; потребовал переписать &lt;a href=&quot;http://null-ptr.livejournal.com/5446.html&quot;&gt;демку&lt;/a&gt; на ДХ9, и подкинул идею для реализации.&lt;br /&gt;&lt;br /&gt;Итак, в ДХ9 отдельные семплы из буфера читать нельзя, и поэтому пришлось сделать SSAA.&lt;br /&gt;G-Buffer увеличен в 4 раза, а для того чтобы рисовать полупрозрачные поверхности в отдельные семплы используется буфер трафарета.&lt;br /&gt;С помощью альфа теста и шейдера, который рисует сеточку следующего вида на уровне отдельных пикселей:&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/GridPS.png&quot; alt=&quot;grid shader&quot; /&gt;&lt;br /&gt;буфер трафарета заполняется значениями 1 2 4 и 8. Заполнение происходит всего один раз.&lt;br /&gt;&lt;br /&gt;Теперь, задавая stencil ref и mask, можно рисовать поверхности в выбранные семплы G-buffer&apos;a.&lt;br /&gt;&lt;br /&gt;Объёмное освещение убрал, а то слишком тяжелый шейдер.&lt;br /&gt;&lt;br /&gt;В качестве оптимизации используется stencil early-out или early-z (переключается клавишой &apos;O&apos;).&lt;br /&gt;Перед отрисовкой полноэкранного квада с расчётом освещения, исполняется шейдер, который совместно с альфа-тестом маскирует те пиксели, которым нужен расчёт освещения для каждого семпла из блока 2х2.&lt;br /&gt;Такую же оптимизацию добавил в ДХ10 демку.&lt;br /&gt;&lt;br /&gt;На картах, где не работает stencil early-out (GF6, GF7) нужно переключится на early-z.&lt;br /&gt;Для запуска необходима карта GeForce6***+ или RadeonX***+.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.egoengine.com/Files/DSalphaDX9.rar&quot;&gt;Архивчик с исходниками&lt;/a&gt;, 341kb&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://trash.egoengine.com/DSalphaDX9-1.jpg&quot;&gt;&lt;img src=&quot;http://trash.egoengine.com/DSalphaDX9-1m.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://trash.egoengine.com/DSalphaDX9-2.jpg&quot;&gt;&lt;img src=&quot;http://trash.egoengine.com/DSalphaDX9-2m.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Некоторые результаты:&lt;br /&gt;7600 GS, GT: 2-4fps&lt;br /&gt;8600 GT: 2-55 fps&lt;br /&gt;9600 GT: 10-200 fps&lt;br /&gt;&lt;br /&gt;HD 2600: 25-70 fps&lt;br /&gt;HD 4850: 110-232 fps&lt;br /&gt;&lt;br /&gt;На НВ шейдер с per-sample frequency расчётом выполняется намного дольше, хотя он всего в 4 раза тяжелее. Весьма печально.&lt;br /&gt;&lt;br /&gt;Клавиша &apos;P&apos; - вкл\выкл оптимизацию с early stencil test\early-z.&lt;br /&gt;Клавиша &apos;G&apos; - вкл\выкл отрисовку стёкл, оставив только DS+AA.&lt;br /&gt;Клавиша &apos;O&apos; - переключатся между early-z и early-stencil тестами. (минимальный фпс это никак не повышает)</description>
  <comments>http://null-ptr.livejournal.com/5658.html</comments>
  <lj:music>God Is An Astronaut - Zodiac</lj:music>
  <media:title type="plain">God Is An Astronaut - Zodiac</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/5446.html</guid>
  <pubDate>Tue, 13 Jan 2009 18:05:35 GMT</pubDate>
  <title>Deferred Shading, AA, alpha blending. (demo, DX10)</title>
  <link>http://null-ptr.livejournal.com/5446.html</link>
  <description>Играл в GTA4, и не мог не заметить повсеместного использования функции Alpha To Coverage. В последнее время её использовали для создания AA на треугольниках с альфа-тестом&lt;sup&gt;1&lt;/sup&gt;, но в игре никакого сглаживания нету, а фича используется для «плавного» возникновения объектов.&lt;br /&gt;&lt;br /&gt;И тут в голову пришла идея сделать deferred shading c полупрозрачными поверхностями и полноэкранным сглаживанием без разложения по слоям, как например в depth peeling&lt;sup&gt;2&lt;/sup&gt;.&lt;br /&gt;Для реализации нужно уметь получать значения отдельных семплов multisampled буфера, поэтому, вооружившись DX help и туториалами 01, 02 начал писать демку под DX10.&lt;br /&gt;&lt;br /&gt;Первоначальная идея заключалось в том, что заполняя G-buffer, для полупрозрачных поверхностей будем задавать маску (SampleMask) с количеством активных семплов таким, чтобы оно по отношению к общему количеству было приблизительно равно значению прозрачности (для ААх8 возможны 8 значений прозрачности). Сразу возникли проблемы с прозрачными элементами в несколько слоёв. Пришлось руками задавать разные маски семплов. И следить за качеством результата.&lt;br /&gt;&lt;br /&gt;В шейдере освещения для каждого семпла считается двустороннее диффузное освещение, блики и добавляется упрощённое объёмное освещение&lt;sup&gt;3&lt;/sup&gt;. Вес каждого семпла – 1/количество. Понял, что можно присваивать каждому семплу разные веса, а именно – рисовать полупрозрачный объект только в один семпл при заполнении G-buffer’а и по особой формуле преобразовывать прозрачность в весовой коэффициент. Проблему order-independent transparency это не решило, но теперь полупрозрачная поверхность могла занять выделенное ей место. Ну и прозрачность больше не ограничена 8 значениями.&lt;br /&gt;В результате, владельцам видеокарт с поддержкой DX10 и установленной Vista\Win7 предоставляется демка с исходниками:&lt;br /&gt;&lt;a href=&quot;http://www.egoengine.com/Files/DSalpha.rar&quot;&gt;Архив&lt;/a&gt;, 335кб&lt;br /&gt;&lt;br /&gt;Кадры:&lt;br /&gt;&lt;a href=&quot;http://trash.egoengine.com/DSalpha-A.jpg&quot;&gt;&lt;img src=&quot;http://trash.egoengine.com/DSalpha-Am.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://trash.egoengine.com/DSalpha-B.jpg&quot;&gt;&lt;img src=&quot;http://trash.egoengine.com/DSalpha-Bm.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://trash.egoengine.com/DSalpha-C.jpg&quot;&gt;&lt;img src=&quot;http://trash.egoengine.com/DSalpha-Cm.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Демка just for fun и на серьёзный метод не претендует. Памяти на G-buffer огромное количество, нагрузка на GPU отгромная.&lt;br /&gt;Проверена на HD 2600 (20fps) и HD 4850 (100fps), NV не удалось достать.&lt;br /&gt;Если производительности хватает, в шейдере LightPS можно поставить до 32 источников света.&lt;br /&gt;&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;a href=&quot;http://developer.download.nvidia.com/SDK/9.5/Samples/samples.html#AntiAliasingWithTransparency&quot;&gt;http://developer.download.nvidia.com/SDK/9.5/Samples/samples.html#AntiAliasingWithTransparency&lt;/a&gt;&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; &lt;a href=&quot;http://developer.download.nvidia.com/SDK/10.5/direct3d/samples.html#StencilRoutedKBuffer&quot;&gt;http://developer.download.nvidia.com/SDK/10.5/direct3d/samples.html#StencilRoutedKBuffer&lt;/a&gt;&lt;br /&gt;&lt;sup&gt;3&lt;/sup&gt; &lt;a href=&quot;http://humus.name/index.php?page=Comments&amp;ID=44&amp;start=16&quot;&gt;http://humus.name/index.php?page=Comments&amp;ID=44&amp;start=16&lt;/a&gt;</description>
  <comments>http://null-ptr.livejournal.com/5446.html</comments>
  <lj:music>Ours To Alibi - From The Depths, I Cry Out</lj:music>
  <media:title type="plain">Ours To Alibi - From The Depths, I Cry Out</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/5165.html</guid>
  <pubDate>Tue, 07 Oct 2008 18:12:08 GMT</pubDate>
  <title>Путешествую - Санкт-Петербург</title>
  <link>http://null-ptr.livejournal.com/5165.html</link>
  <description>На выходные, начиная с пятницы, приехал в этот замечательный город.&lt;br /&gt;&lt;br /&gt;В первые два дня посетил различные интересные места в центре города. Обойти всё за такое время, очевидно, невозможно, но это не первая моя поездка, и конечно, не последняя.&lt;br /&gt;В воскресенье встретился с &lt;span class=&apos;ljuser  ljuser-name_zeux&apos; lj:user=&apos;zeux&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://zeux.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://zeux.livejournal.com/&apos;&gt;&lt;b&gt;zeux&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&apos;ом, с которым поехали в Петергоф и зачётно провели весь день. А вечером зашли домой, где отведали кролика с картошкой, которого он сам и приготовил (&lt;a href=&quot;http://www.egoengine.com/trash/fp/img07102008213718.jpg&quot;&gt;до&amp;nbsp;(предположительно)&lt;/a&gt;, &lt;a href=&quot;http://www.egoengine.com/trash/fp/img07102008213917.jpg&quot;&gt;после&lt;/a&gt;).&lt;br /&gt;Осталось несколько поводов приехать туда ещё раз.&lt;br /&gt;&lt;br /&gt;Фотографии как-то не охото выкладывать, но может быть, добавлю позже.</description>
  <comments>http://null-ptr.livejournal.com/5165.html</comments>
  <lj:music>The Music - The Walls Get Smaller</lj:music>
  <media:title type="plain">The Music - The Walls Get Smaller</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>11</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/4898.html</guid>
  <pubDate>Thu, 11 Sep 2008 22:39:47 GMT</pubDate>
  <title>Хардварная тесселяция, пример использования.</title>
  <link>http://null-ptr.livejournal.com/4898.html</link>
  <description>Про доступность хардварной тесселяции с использованием ДХ9 в картах АТИ, начиная с 2*** я уже писал.&lt;br /&gt;И тут заходит ко мне в &lt;a href=&quot;http://null-ptr.blogspot.com/&quot;&gt;блог&lt;/a&gt; человек, и спрашивает не просто описание, а рабочий пример. Ну, свободного времени было достаточно, так что написал простейший семпл.&lt;br /&gt;Рисуются четыре квада, с анимацией вершин в шейдере.&lt;br /&gt;Если интересно (и имеется нужное железо), то &lt;a href=&quot;http://www.egoengine.com/Files/TesselationATI.rar&quot;&gt;скачиваем архив&lt;/a&gt; размером 15кб и смотрим.&lt;br /&gt;зажмите &apos;W&apos; чтобы включить wireframe.&lt;br /&gt;зажмите &apos;N&apos; чтобы уменьшить уровень тесселяции до минимального (это не отключает тесселяцию полностью, треугольники разбиваются на 6 штук).&lt;br /&gt;&lt;br /&gt;Результат в определённый момент может выглядеть так:&lt;br /&gt;&lt;a href=&quot;http://trash.egoengine.com/tessscreen.jpg&quot;&gt;http://trash.egoengine.com/tessscreen.jpg&lt;/a&gt;&lt;br /&gt;Картинка по размеру вышла больше архива.&lt;br /&gt;&lt;br /&gt;D3DX не нужен, но требуется msvcrt80</description>
  <comments>http://null-ptr.livejournal.com/4898.html</comments>
  <lj:music>Akira Yamaoka - You&apos;re Not Here</lj:music>
  <media:title type="plain">Akira Yamaoka - You&apos;re Not Here</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/4682.html</guid>
  <pubDate>Wed, 13 Aug 2008 22:36:30 GMT</pubDate>
  <title>Fully Ramblomatic</title>
  <link>http://null-ptr.livejournal.com/4682.html</link>
  <description>Решил поделиться с общественностью играми с &lt;a href=&quot;http://www.fullyramblomatic.com/games.htm&quot;&gt;данного сайта&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Обращаю особое внимание на квест с интересным сюжетом и геймплеем, состоящим из чётырёх частей:&lt;br /&gt;1) &lt;a href=&quot;http://www.fullyramblomatic.com/5days&quot;&gt;5 Days A Stranger&lt;/a&gt; - домушник вламывается в, казалось бы, покинутое здание, но обнаруживает себя заключённым в доме неведомой силой совместно с четырьмя незнакомцами.&lt;br /&gt;2) &lt;a href=&quot;http://www.fullyramblomatic.com/7days&quot;&gt;7 Days A Skeptic&lt;/a&gt; - спустя 400 лет, разведывательный  космический корабль Мефистофель обнаруживает в космосе кое-что, что следовало оставить в покое.&lt;br /&gt;3) &lt;a href=&quot;http://www.fullyramblomatic.com/notes&quot;&gt;Trilby&apos;s Notes&lt;/a&gt; - соединяет сюжетные линии двух предыдущих частей.&lt;br /&gt;4) &lt;a href=&quot;http://www.fullyramblomatic.com/6days&quot;&gt;6 Days A Sacrifice&lt;/a&gt; - инспектор Теодор Декабе отправляется в штаб-квартиру религиозного культа, и впоследствии обнаруживает себя впутанным в махинации судьбы.&lt;br /&gt;&lt;br /&gt;Игры сложные (в третьей части действия производятся путём набора команд на клавиатуре), но пройти их несомненно стоит. Если зашли в тупик, можно поискать солюшен.&lt;br /&gt;&lt;br /&gt;Также следует отметить пару аркадных игр (но не без сюжета!):&lt;br /&gt;&lt;a href=&quot;http://www.escapistmagazine.com/content/games/yahtzee/artoftheft&quot;&gt;Trilby: The Art Of Theft&lt;/a&gt; - играем за того самого вора из квадрологии квестов. Ураганный геймплей :)&lt;br /&gt;&lt;a href=&quot;http://www.fullyramblomatic.com/1213&quot;&gt;1213&lt;/a&gt; - состоит из трёх эпизодов.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;PS. А ещё автор создаёт прикольные &lt;a href=&quot;http://www.fullyramblomatic.com/reviews/&quot;&gt;видео-ревью&lt;/a&gt; &lt;a href=&quot;http://www.escapistmagazine.com/videos/view/zero-punctuation&quot;&gt;различных игр&lt;/a&gt;.&lt;/i&gt;</description>
  <comments>http://null-ptr.livejournal.com/4682.html</comments>
  <lj:music>God Is an Astronaut - Far From Refuge</lj:music>
  <media:title type="plain">God Is an Astronaut - Far From Refuge</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/4385.html</guid>
  <pubDate>Tue, 12 Aug 2008 20:18:02 GMT</pubDate>
  <title>OpenGL 3.0 - Fail?</title>
  <link>http://null-ptr.livejournal.com/4385.html</link>
  <description>11 августа на всеобщее обозрение выложили &lt;a href=&quot;http://www.opengl.org/registry/doc/glspec30.20080811.pdf&quot;&gt;спецификацию&lt;/a&gt; долгожданного OpenGL 3.0, и разочаровали почти всё сообщество пользователей GL.&lt;br /&gt;&lt;br /&gt;Всякие мечты о новом API, объектной модели, компиляции шейдеров в бинарный код и переработанном GLSL оказались разбиты. В общем, повторилась ситуация, знакомая нам по OpenGL 2.0.&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Вместо всего этого, в очередной раз несколько расширений было добавлено в core, обновлён GLSL (&lt;a href=&quot;http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.30.08.pdf&quot;&gt;до версии 1.3&lt;/a&gt;), поменяли некоторые токены. Новый раздел в спецификации – &lt;strong&gt;deprecation model&lt;/strong&gt;. Многие вещи были объявлены устаревшими, и с помощью расширения &lt;strong&gt;ARB_create_context&lt;/strong&gt; можно создать контекст, в котором они не будут работать, и будут выдавать ошибки. Список урезанного функционала:&lt;ul&gt;&lt;li&gt;Режим индексного цвета (палитра), включая форматы текстур.&lt;/li&gt;&lt;li&gt;Отрисовка с помощью glBegin/glEnd и из массивов, расположенных в системной памяти.&lt;/li&gt;&lt;li&gt;Все встроенные вершинные атрибуты и функции по их установке. Теперь поддерживаются только пользовательские аттрибуты.&lt;/li&gt;&lt;li&gt;Весь GL state кроме gl_DepthRange и стек матриц трансформаций, а также функции для настройки FFP.&lt;/li&gt;&lt;li&gt;Смена толщины линий.&lt;/li&gt;&lt;li&gt;Примитивы QUAD, QUAD_STRIP и POLYGON.&lt;/li&gt;&lt;li&gt;Режим отображения задних и передних граней не может быть разным.&lt;/li&gt;&lt;li&gt;Запись пикселей и растровые операции.&lt;/li&gt;&lt;li&gt;Форматы ALPHA LUMINANCE, LUMINANCE ALPHA, и INTENSITY заменены R и RG текстурами.&lt;/li&gt;&lt;li&gt;Альфатест.&lt;/li&gt;&lt;li&gt;Буфер аккумулятора.&lt;/li&gt;&lt;li&gt;Evaluators.&lt;/li&gt;&lt;li&gt;Режим выбора.&lt;/li&gt;&lt;li&gt;Списки отображения.&lt;/li&gt;&lt;li&gt;Стек атрибутов.&lt;/li&gt;&lt;/ul&gt;Это многое из того, что убрали. А добавили в core следующие расширения:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EXT_gpu_shader4&lt;/strong&gt; – возможности Shader Model 4.0. Нативная поддержка int и uint. Получения размера текстуры, обращение к конкретным текселям текстуры, или по обычным координатам, но с целочисленным сдвигом. gl_VertexID на вход вершинного шейдера. Выбор режима интерполяции varying’ов. Geometry shaders сюда не входят.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;NV_conditional_render&lt;/strong&gt; – выполнения отрисовки в зависимости от результата query, который не нужно получать от видеокарты.&lt;br /&gt;&lt;br /&gt;Точное управление регионов для мапинга буферов в клиентскую память.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ARB_color_buffer_float&lt;/strong&gt;, &lt;strong&gt;NV_depth_buffer_float&lt;/strong&gt;, &lt;strong&gt;ARB_texture_float&lt;/strong&gt;, &lt;strong&gt;EXT_packed_float&lt;/strong&gt; и &lt;strong&gt;EXT_texture_shared_exponent&lt;/strong&gt; – различные float форматы текстур, а также 32-битный float буфер глубины.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EXT_framebuffer_object&lt;/strong&gt; – сколько лет прошло, и его одобрили.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EXT_framebuffer_multisample&lt;/strong&gt; и &lt;strong&gt;EXT_framebuffer_blit&lt;/strong&gt; – в поддержку предыдущего, рендер в РТ с мультисемплингом, а также ресолв в обычную текстуру.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;NV_half_float&lt;/strong&gt;, &lt;strong&gt;ARB_half_float_pixel&lt;/strong&gt; – 16-ти битные форматы с плавающей точкой для вершинных атрибутов и фреймбуфера.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EXT_texture_integer &lt;/strong&gt;– целочисленные текстуры.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EXT_texture_array&lt;/strong&gt; – массивы текстур.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EXT_packed_depth_stencil&lt;/strong&gt; – формат render buffer с interleaved глубиной и значением стенциля (читать D24S8)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EXT_draw_buffers2&lt;/strong&gt; – раздельный режим блендинга для разных таргетов при MRT.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EXT_texture_compression_rgtc &lt;/strong&gt;– поддержка сжатых форматов для одноканальных и двухканальных текстур.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EXT_transform_feedback&lt;/strong&gt; – Stream Out из VS.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EXT_framebuffer_sRGB&lt;/strong&gt; -  sRGB текстуры появились в 2.1, а теперь в них можно рисовать.&lt;br /&gt;&lt;br /&gt;В GLSL 1.3 добавили функционал из &lt;strong&gt;EXT_gpu_shader4&lt;/strong&gt;, текстурную выборку с пользовательскими градиентами (наконец-то!), функции для работы с целочисленными текстурами. Функции текстурных выборок переименовали: теперь не нужно писать тип текстуры (1D, 2D, 3D, Cube, *Shadow), просто texture(…) и компилятор сам догадается, какая у нас текстура. Встроенных атрибутов больше нет, как нет и GL state (о чём я писал выше). ftransform() убрали, попросили ставить флажок invariant.&lt;br /&gt;&lt;br /&gt;Поддержка всего этого возможна только на видеокартах уровня ДХ10, но почему-то многие основные возможности этих видеокарт оказались за бортом. Нету GS, нет инстансинга, нет константных буферов, нельзя читать отдельные семплы multi-sampled текстуры в GLSL. Это всё предложено отдельными расширениями от ARB, кроме чтения из MS текстуры, но и оно может быть добавлено расширением GLSL (возможно от АТИ, у них компилятор не имеет ничего против типа msSampler2D). Вот только ждать этих расширений от некоторых вендоров возможно придётся довольно долго.&lt;br /&gt;&lt;br /&gt;В итоге, вся надежда на коренные изменения опять переложена на следующую версию. Пока о ней сказано лишь то, что deprecated функции каким-то образом будут убраны полностью.&lt;br /&gt;&lt;br /&gt;Интересно, почему не решились выполнить обещанного. Казалось бы, два года разработки и неразглашение информации готовило что-то большое. Комьюнити ожидало достойный ответ ДХ10 как игровому АПИ, но получило лишь очередной апдейт.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Crossposted from &lt;a href=&quot;http://blog.gamedeff.com&quot;&gt;blog.gamedeff.com&lt;/a&gt;&lt;/i&gt;</description>
  <comments>http://null-ptr.livejournal.com/4385.html</comments>
  <lj:music>Fatboy Slim - Right Here, Right Now</lj:music>
  <media:title type="plain">Fatboy Slim - Right Here, Right Now</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>10</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/4342.html</guid>
  <pubDate>Sun, 03 Aug 2008 23:58:10 GMT</pubDate>
  <title>Путешествую - Хорватия и Италия</title>
  <link>http://null-ptr.livejournal.com/4342.html</link>
  <description>Второго августа возвратился домой после недельного отдыха в Хорватии.&lt;br /&gt;Большую часть времени находился в курортном городе Рабац, но также посетил города Пореч, Риека, Пула и Ровинь, остров Црес и на один день съездил в Венецию.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;К своему сожалению, забыл взять нормальный фотоаппарат, поэтому делал снимки на мобильный телефон с соответствующим качеством.&lt;br /&gt;&lt;br /&gt;При вылете, самолёт задержали на час из-за плохой погоды. Но после ожидания вылета и двух часов полёта, мы прибыли в аэропорт Риека и погода была очень даже ничего.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/airportrijeka.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Снаружи стоит старый, поломанный самолёт.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/plane.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Сели в автобус, и всех пассажиров развозили по разным городам и отелям. Цель нашего пути - город Рабац. Фото из салона автобуса.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/toRabac1.jpg&quot; /&gt;&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/toRabac2.jpg&quot; /&gt;&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/toRabac3.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Приехали к месту назначения довольно поздно. Успели поужинать, разложить вещи в номере и немного прогуляться около берега. Оценили воду, которая оказалась тёплой и очень солёной по сравнению с нашим Балтийским морем и Рижским заливом. Подход к воде грубый, из камней и гальки, а у нас дома мягкий песочек :)&lt;br /&gt;&lt;br /&gt;На следующий день вновь прогулялись до берега, и провели на пляже пару часов.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/rabacSea.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Затем пошли в центр города.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/rabac2.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;По основным улочкам.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/rabac1.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;И по безлюдным тропинкам между домами.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/rabacPath.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Фотографировать мусорные баки, это привилегия Артемия, но увидев возможный символ Сочи-2012, я не смог удержаться. Такие должны поставить на каждом углу.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/sochi2012.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Уже к вечеру вернулись обратно, и пошли по берегу в сторону от центра города и отеля, посмотреть, где закачивается туристическая зона.&lt;br /&gt;&lt;br /&gt;По дороге всюду деревья, которые не могут держаться прямо.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/treesFall.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;После знака, указывающего на пляж нудистов, начинается дикая природа. &lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/endOfRoad.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Возвращаясь, встретили закат двух солнц (потому там так жарко)&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/twoSuns.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Следующий день, и мы отправляемся на прогулку по морю, с остановкой на отдалённом пляже и на острове Црес.&lt;br /&gt;&lt;br /&gt;В начале пути всем предложили выпить какого-то самогона.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/fishtripSamogon.jpg&quot; /&gt;&lt;br /&gt;Судя по лицам людей, принявших зелье - страшная гадость.&lt;br /&gt;&lt;br /&gt;Приближаемся к пляжу.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/fishtripLagoon.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Народ идёт на пляж.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/fishtripPeople.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;А я пойду вверх по склону.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/fishtripHill.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Благо, кто-то проложил тропинки из камней.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/fishtripPath.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;На острове Црес на продажу - каждый люк. Написано 150kn==750руб.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/fp/img03082008194003.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Следующий день, и рано с утра мы сели в автобус и направились в Пореч, откуда поплывём на пароме в Венецию.&lt;br /&gt;&lt;br /&gt;А там уже очередь. Пограничный контроль ограничился простым взглядом на фото.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/toVenezia.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Вот и Венеция.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/veneziaRiver2.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Один из мостов над самым широким каналом.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/veneziaBridge.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Замечен интересный способ охлаждения напитков. Такой смекалке позавидовал бы Задорнов.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/veneziaFireExt.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Один из небольших каналов, по которым плавают многочисленные гондолы.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/veneziaRiver1.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Дошли до главной достопримечательности Венеции - площади Святого Марка. Сказали, что в день до 100 тысяч туристов посещает это место. Похоже на правду.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/veneziaMain.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Гуляли дальше по разным улочкам, заглядывая в дворики.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/veneziaCourt.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;И посматривая на прочие туристические объекты.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/veneziaTower.jpg&quot; /&gt;&lt;br /&gt;Почему-то мозг никак не хотел принимать башню, наклонённую под небольшим углом.&lt;br /&gt;&lt;br /&gt;Попиксельное освещение не впечатлило. Какая-то банальная мутная лайтмапа.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/veneziaPPL.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Наступило время возвращаться в порт, вот только определить время отправления оказалось затруднительно.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/veneziaWhenDoWeLeave.jpg&quot; /&gt;&lt;br /&gt;в 45:67 чтоли?&lt;br /&gt;&lt;br /&gt;Следующий день, прогулки по городу и отдых на пляже.&lt;br /&gt;&lt;br /&gt;Не стоит смотреть на надпись Popcorn, тут за 50руб продают обычную варёную кукурузу.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/freshCorn.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Скидка - сэкономь 5 копеек! (1kn==5руб) Только сегодня, не проходите мимо! :D&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/thatsADiscount.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Неожиданно наступил предпоследний день. Нужно посетить сразу три города: Пулу, Ровинь и Пореч.&lt;br /&gt;&lt;br /&gt;С утра на автобус и в первую очередь едем в Пулу.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/onTheRoad.jpg&quot; /&gt;&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/onTheRoad2.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;В Пуле обнаруживается амфитеатр.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/amfiteather1.jpg&quot; /&gt;&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/amfiteather2.jpg&quot; /&gt;&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/amfiteather3.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Карта города с фонтанчиком.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/townMap.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Танцующие индейцы. Прячутся в тени от палящего солнца.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/iris2indinans.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;И ещё один, большой фонтанчик.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/iris1Waterfall.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;После этого едем обедать. Все голодные, автобус спешит. От его скорости гнутся дорожные знаки.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/signIsFalling.jpg&quot; /&gt;&lt;br /&gt;Дело конечно в скорости считывания строк телефоном.&lt;br /&gt;&lt;br /&gt;Прибываем в Ровинь. Башня - главная цель посещения этого города.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/istraTour.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Идти долго и всё время в гору. Кто-то сдаётся в середине пути.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/timeToRest.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Но мы не такие и поднимаемся к церкви, не зная отдыха.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/churchFinal.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Теперь можно идти обратно к автобусу. По пути встречается автозаправка. Прямо около дороги, у нас таких нет.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/petrolStation.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Окно в мир. Кто-то пробил стену, не обращая внимания на рекламу. :)&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/officeIsHere.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Дальше по дороге в Пореч.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/roadTrip.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Проезжая мимо реки Раша (Russia?)&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/riverRussia.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;В городе посетили церковь, интересных фотографий не замечено.&lt;br /&gt;&lt;br /&gt;Суббота, и время ехать в аэропорт для возвращения в Ригу.&lt;br /&gt;&lt;br /&gt;Много склонов с опасностью обвала. Во многих местах дороги повешены сетки с грузом снизу. Чтобы на дорогу не сыпалось.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/slopeSafety.jpg&quot; /&gt;&lt;br /&gt;Дороги надо сказать, просто отличные. Даже нам стало завидно, что уж говорить о России. :)&lt;br /&gt;&lt;br /&gt;Иногда они немного вылезают в сторону. Проезжать там на большой скорости весело.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/airRoad.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Но зря спешили, в аэропорту задержка в пару часов. Ждём.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/airportDelay.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Но наконец, самолёт готов лететь. Идём на посадку.&lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/trash/fp/img04082008024048.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;И прощаемся.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/croatia/goingHome.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Вроде, неплохо провёл время.&lt;br /&gt;</description>
  <comments>http://null-ptr.livejournal.com/4342.html</comments>
  <lj:music>Hands Upon Black Earth - Ashes (feat. Irina Mikhailova)</lj:music>
  <media:title type="plain">Hands Upon Black Earth - Ashes (feat. Irina Mikhailova)</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/4083.html</guid>
  <pubDate>Sat, 19 Jul 2008 23:49:51 GMT</pubDate>
  <title>DXSDK</title>
  <link>http://null-ptr.livejournal.com/4083.html</link>
  <description>&lt;img src=&quot;http://trash.egoengine.com/DXinstancing.jpg&quot;&gt;</description>
  <comments>http://null-ptr.livejournal.com/4083.html</comments>
  <lj:music>Eksi Ekso - The Choir Will Always Sing</lj:music>
  <media:title type="plain">Eksi Ekso - The Choir Will Always Sing</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/3716.html</guid>
  <pubDate>Tue, 15 Jul 2008 10:05:11 GMT</pubDate>
  <title>Использование хардварной тесселяции карт АТИ в DX9</title>
  <link>http://null-ptr.livejournal.com/3716.html</link>
  <description>Возможно вы слышали, что в ДХ10 видеокартах АТИ, начиная с серии 2*** имеется хардварный тесселятор геометрии. Кто-то, возможно, видел его работу в GPU Mesh Mapper или Render Monkey 1.81. Но до сих пор я не видел информации ни от АМД ни от кого другого по поводу того, как его использовать. Но вчера мне наконец удалось заставить его работать в своём приложении.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Для начала, его следует включить и настроить парой простых комманд:&lt;br /&gt;&lt;i&gt;dev-&amp;gt;SetRenderState(D3DRS_POINTSIZE, 0x7FA03001); //включаем&lt;br /&gt;dev-&amp;gt;SetRenderState(D3DRS_MAXTESSELLATIONLEVEL, *(DWORD*)(&amp;floatTesselationFactor)); //настраиваем. Значения от 1.0f до 15.0f&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Есть одна небольшая проблема. Если у вас меняется тип выводимой геометрии (например, выводили треугольники, а дальше пойдут стрипы), то необходимо &quot;перезагрузить&quot; тесселятор. Для этого, отключаем его:&lt;br /&gt;&lt;i&gt;dev-&amp;gt;SetRenderState(D3DRS_POINTSIZE, 0x7FA03000); //другие значения могут сделать тоже самое&lt;br /&gt;dev-&amp;gt;SetRenderState(D3DRS_ENABLEADAPTIVETESSELLATION, 0); //никогда, никогда не ставьте тут 1 при включенном тесселяторе!&lt;/i&gt;&lt;br /&gt;После этого, сразу включаем и настраиваем кодом выше.&lt;br /&gt;&lt;br /&gt;Но это ещё не всё! Нам нужно поменять вершинный шейдер. Теперь на его входе мы будем получать не просто информацию об одной вершине, но информацию сразу о трёх вершинах текущего треугольника, а также барицентрические координаты текущего положения в нём.&lt;br /&gt;&lt;br /&gt;Поэтому, если у вас на входе например, вот такая структура:&lt;br /&gt;&lt;i&gt;struct VS_INPUT&lt;br /&gt;{&lt;br /&gt;float4 position: POSITION0,&lt;br /&gt;float2 texcoord: TEXCOORD0&lt;br /&gt;};&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;То её следует поменять на такую:&lt;br /&gt;&lt;i&gt;struct VS_INPUT&lt;br /&gt;{&lt;br /&gt;float3 barycentric: BLENDWEIGHT0,&lt;br /&gt;&lt;br /&gt;//First vertex&lt;br /&gt;float4 position1: POSITION0,&lt;br /&gt;float2 texcoord1: TEXCOORD0,&lt;br /&gt;&lt;br /&gt;//Second vertex&lt;br /&gt;float4 position2: POSITION4,&lt;br /&gt;float2 texcoord2: TEXCOORD4,&lt;br /&gt;&lt;br /&gt;//Third vertex&lt;br /&gt;float4 position3: POSITION8,&lt;br /&gt;float2 texcoord3: TEXCOORD8&lt;br /&gt;};&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Теперь, чтобы найти параметры вершины для текущего положения следует использовать такой код:&lt;br /&gt;&lt;i&gt;float4 position = position1 * barycentric.x + position2 * barycentric.y + position3 * barycentric.z;&lt;br /&gt;float2 texcoord = texcoord1 * barycentric.x + texcoord2 * barycentric.y + texcoord3 * barycentric.z;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Удачи в экспериментах!&lt;br /&gt;</description>
  <comments>http://null-ptr.livejournal.com/3716.html</comments>
  <lj:music>Motek - Maybe I&apos;ll Go Home</lj:music>
  <media:title type="plain">Motek - Maybe I&apos;ll Go Home</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/3467.html</guid>
  <pubDate>Mon, 14 Jul 2008 21:51:13 GMT</pubDate>
  <title>Температура ATI 4850</title>
  <link>http://null-ptr.livejournal.com/3467.html</link>
  <description>В посте про покупку этой карты, жаловался на её температуру.&lt;br /&gt;&lt;br /&gt;К счастью, решение нашлось.&lt;br /&gt;В &lt;b&gt;Catalyst Control Center&lt;/b&gt; снимаем блокировку с &lt;b&gt;ATI OverDrive&lt;/b&gt;. Заходим в менеджер профилей, где создаём новый, включаем в одном из табов создание шортката для включения профиля, сохраняем. В &lt;i&gt;папка_пользователя\AppData\Local\ATI\ACE\&lt;/i&gt; находим XML файл с именем нашего профиля. Открываем его в &lt;b&gt;Notepad&lt;/b&gt;, ставим&lt;br /&gt;&lt;b&gt;FanSpeedAlgorithm&lt;/b&gt; - Manual&lt;br /&gt;&lt;b&gt;FanSpeedPercentTarget_0&lt;/b&gt; - желаемая скорость от максимальной.&lt;br /&gt;Шорткат пихаем с рабочего стола в стартап.&lt;br /&gt;&lt;br /&gt;Сперва попробовал 100%, сразу послышалось, как включился и заработал реактивный двигатель. Так что в прошлом сообщении я немного соврал про бесшумность, просто он никогда до 100% не доходил (может до 50% только).&lt;br /&gt;Поставил 60%, шумок небольшой есть, но мне всёравно, я за компом в наушниках.&lt;br /&gt;Зато температура в Idle упала с 78 до 51, а при долгой нагрузке на максимум, поднимается до 75 вместо прежних 86.&lt;br /&gt;&lt;br /&gt;Чувствую себя теперь спокойней :)</description>
  <comments>http://null-ptr.livejournal.com/3467.html</comments>
  <lj:music>Rome - Querkraft</lj:music>
  <media:title type="plain">Rome - Querkraft</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/3176.html</guid>
  <pubDate>Sat, 12 Jul 2008 21:05:24 GMT</pubDate>
  <title>Рендер в демке теней от полупрозрачных объектов.</title>
  <link>http://null-ptr.livejournal.com/3176.html</link>
  <description>Несколько человек пожелало, чтобы я написал, как всё сделано в этой демке. Свободное время есть, так что решил их порадовать. И так, &lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;пнём дохлую лошадь ещё раз.&lt;br /&gt;&lt;br /&gt;Хотелось сделать как лучше, и чтобы все эффекты работали на картах с поддержкой &lt;b&gt;SM2.0&lt;/b&gt;. В основном, разработка производилась на ноутбуке с интегрированной видеокартой &lt;b&gt;ATI M200&lt;/b&gt;, которая в процессе жарила мне колени.&lt;br /&gt;&lt;br /&gt;Для начала, отдельно о разных эффектах.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;HDR&lt;/b&gt;&lt;/u&gt; решил сделать фейковый, с использованием &lt;b&gt;RGBA8&lt;/b&gt; текстур. Недостаток один – потеря качества, но вот плюсов оказалось больше: быстрее отрисовка, меньше занимаемой памяти, поддержка альфаблендинга и &lt;b&gt;АА&lt;/b&gt; на всём спектре железа, и отсутствие хардварного бага на R3** (&lt;i&gt;discard&lt;/i&gt;() при рендере в fp текстуры не отменяет запись в буфер глубины).&lt;br /&gt;&lt;br /&gt;Средняя яркость картинки для адаптации рассчитывается опытным путём. В рендер таргет размером 256х256 рисуется финальная картинка. При этом включен шейдер, который отбрасывает фрагменты, яркость в которых ниже определённой величины. Во время этого рендера используется occlusion query для нахождения количества фрагментов, которые прошли тест. После того, как результат &lt;b&gt;OQ&lt;/b&gt; готов и может быть получен, разрешается провести данный рендер с другой тестовой величиной. Имеется два значения для сравнения: 1/3 и 2/3. Таким образом находятся процентная величина для разных диапазонов яркости: [0; 1/3], [1/3; 2/3] и [2/3; 1]. Исходя из преобладания того или иного диапазона, меняется параметр средней яркости изображения. Если много фрагментов с яркостью выше 2/3, средняя яркость увеличивается, если много фрагментов с яркостью ниже 1/3, средняя яркость уменьшается.&lt;br /&gt;&lt;br /&gt;Значение средней яркости передаётся в вертексный шейдер, где оно изменяет цвет источника света. Результат схож с тем, который можно получить пост-процессом над fp текстурой, но так как я использую &lt;b&gt;RGBA8&lt;/b&gt;, то делать это нужно в процессе расчёта цвета фрагмента.&lt;br /&gt;&lt;br /&gt;Также имеется &lt;b&gt;Bloom&lt;/b&gt;. Для начала производится &lt;b&gt;Bright Pass&lt;/b&gt;. Рендер в текстуру 256х256 с шейдером, который уберёт цвета с яркостью ниже определённой (я выбрал значение 0.8). После первого прохода производиться downsampling в текстуры размером 128х128 и 64х64. Каждая текстура методом Гаусса размывается по горизонтали, а затем по вертикали. Размер результирующего размытия - 26х26.&lt;br /&gt;Исходное изображение: &lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSscene.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Размытая текстура 256х256 с результатом &lt;b&gt;Bright Pass&lt;/b&gt;, а также размытые текстуры 128х128 и 64х64:&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSbloom256.jpg&quot;&gt; &lt;img src=&quot;http://trash.egoengine.com/TSbloom128.jpg&quot;&gt; &lt;img src=&quot;http://trash.egoengine.com/TSbloom64.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Сумма этих текстур:&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSbloomCombined.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Значение из этих текстур будет прибавлено к финальному изображению:&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSsceneWithBloom.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Объёмное освещение&lt;/b&gt;&lt;/u&gt; (&lt;b&gt;Volumetric Lightning&lt;/b&gt;, &lt;b&gt;Light Shafts&lt;/b&gt;). Красивый эффект, возникающий от того, что воздух не везде чистый, но местами содержит мелкие частицы, отражающие свет.&lt;br /&gt;&lt;a href=&quot;http://www.egoengine.com/Images/EGOGlass2.jpg&quot;&gt;&lt;img src=&quot;http://www.egoengine.com/Images/EGOGlass2Mini.jpg&quot;&gt;&lt;br /&gt;Кликабельно.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Для реализации необходимо подготовить геометрию в виде набора квадов (у меня 32), заполняющих единичный куб. В дальнейшем, этот набор будет рисоваться в позиции источника света, с матрицей трансформации, которая увеличит единичный куб до радиуса источника света, а также повернёт его к камере, как &lt;b&gt;Billboard&lt;/b&gt;.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSvolumeGreen.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;Используя шейдер, который рассчитает упрощённое освещение для каждого фрагмента с учётом теней, получим нужный результат. Используется два варианта шейдера:&lt;br /&gt;Первый вариант для точки в тени возвращает чёрный цвет, а для освещённой - цвет источника света с учётом ослабления от расстояния и умноженный на константу, значение которой чуть больше чем 1.0/quadCount.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSvolumeCorner.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Второй вариант возвращает результат отличный от 0.0 для точек, которые находятся за плоскостью стекла, если, конечно, они не находятся в тени от непрозрачных объектов.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSvolumeNorth.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;С учётом блендинга рисовать это сразу в кадр очень затратно. Также, результат следует размыть, чтобы скрыть ограниченное количество плоскостей. Поэтому отрисовка происходит в отдельную текстуру небольшого размера (256х256). Потом эта текстура в два прохода размывается по горизонтали и по вертикали. Размытие такое же, как описано выше в тексте про &lt;b&gt;Bloom&lt;/b&gt;. После этого получаем более мягкий результат: &lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSvolumeCornerBlur.jpg&quot;&gt; &lt;img src=&quot;http://trash.egoengine.com/TSvolumeNorthBlur.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Эта текстура добавляется вместе с &lt;b&gt;Bloom&lt;/b&gt;’ом к финальному изображению.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Объёмный туман&lt;/u&gt;&lt;/b&gt;. Хотелось добавить туман, который бы стелился по полу, сгущаясь в углах и у плинтуса. Простой метод, где величина тумана зависит от расстояния до камеры тут уже не подходит. В моём случае, объём, где находится туман, задан произвольным мешем, сделанным вручную. Чтобы получить величину тумана в точке, необходимо узнать, глубину, которую проходит луч от геометрии уровня через объём тумана. Для этого понадобиться узнать глубину сцены, и задних фейсов объёма тумана.&lt;br /&gt;&lt;br /&gt;Линейная глубина сцены (float) пакуется в три канала &lt;b&gt;RGBA&lt;/b&gt; текстуры:&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSfogDepth.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Во время отрисовки передних граней тумана, глубина распаковывается, и рассчитывается разница между расстоянием до фрагмента тумана и расстоянием из текстуры. В зависимости от расстояния производится переход от цвета сцены к цвету тумана.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSfog.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;При такой реализации, при отрисовке невыпуклых объёмов можно получить небольшие ошибки, в случаях, когда луч пересекает меш в двух разных местах, а также туман пропадает, когда камера находиться внутри объёма. Эти проблемы поправимы, первая довольно тяжёлым методом, а вторая довольно просто: можно например, рисовать задние грани объёма тумана с другим шейдером, который вместо разницы в расстояниях возьмёт само расстояние до задней грани.&lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/trash/fp/img09072008003003.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;Преломление изображения у стекла. Полных и честных отражений окружения у меня нет, только блик от источника света. Поэтому эффект реализуется простым пост-процессом. Берётся текстура с содержимым кадра, и проецируется на стекло с небольшим сдвигом по .xy компонентам нормали. Также цвет из текстуры кадра перемножается на цвет стекла.&lt;br /&gt;&lt;br /&gt;Огонь сделан системой частиц. В качестве текстуры использована анимация взрыва, упакованная в volume texture. Частицы анимируются в вершинном шейдере. Для этого у вершины имеется начальная позиция в плоскости &lt;b&gt;XZ&lt;/b&gt; (у меня &lt;b&gt;Y&lt;/b&gt; – вверх), время жизни (&lt;i&gt;rand&lt;/i&gt;()) и дополнительное случайное число (ещё раз &lt;i&gt;rand&lt;/i&gt;()). Частицы рисуются в отдельный рендер таргет с аддитивным блендингом. Чтобы не было резких пересечений с геометрией уровня, цвет частицы плавно интерполируется к чёрному, когда разница между глубиной фрагмента и глубиной геометрии уровня приближается к нулю. В общем, один из обычных подходов для реализации &lt;b&gt;Soft Particles&lt;/b&gt;.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSfireOffscreen.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;В финальном проходе, где совмещается &lt;b&gt;Bloom&lt;/b&gt;, &lt;b&gt;Volumetric Light&lt;/b&gt; и содержимое кадра, также добавляется цвет из текстуры с частицами. Для того чтобы добавить преломление от тепла (&lt;b&gt;Heat Haze&lt;/b&gt;), находится яркость текущего текселя текстуры огня, а также двух текселей справа и снизу от него. Используя разницу в яркостях, находиться сдвиг текстуры кадра. Ниже представлено абсолютное значение сдвига, увеличенное в несколько раз для видимости.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSfireShift.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Тени&lt;/b&gt;&lt;/u&gt; – &lt;b&gt;Shadow Mapping&lt;/b&gt;. Для разных источников в зависимости от окружения применяются разные методы расчёта и фильтрации теней.&lt;br /&gt;&lt;br /&gt;Самое интересное, это тени от полупрозрачных объектов. Для реализации используется две текстуры. В первую рисуются все непрозрачные объекты:&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSdepth1.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Вторая текстура очищается значением &lt;b&gt;RGBA&lt;/b&gt;(0, 0, 0, 1). Затем в неё рисуются все полупрозрачные объекты. В каналы &lt;b&gt;RGB&lt;/b&gt; записывается цвет из текстуры полупрозрачного объекта (при желании, его можно интерполировать к белому и чёрному в зависимости от значения в альфа канале).&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TScolor.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;В альфа канал пишем глубину полупрозрачной геометрии.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSdepth2.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;В шейдере расчёта освещения проводим следующие действия:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;//По умолчанию фрагмент освещён&lt;br /&gt;float3 shadow = float3(1, 1, 1); &lt;br /&gt;//если фрагмент дальше непрозрачного объекта, сбрасываем освещённость до нуля&lt;br /&gt;shadow = fDepth &amp;gt; solidObjDepth ? (0.0).xxx : (1.0).xxx;&lt;br /&gt;//если фрагмент дальше прозрачного объекта, умножаем освещённость на цвет&lt;br /&gt;shadow = shadow * (fDepth &amp;gt; transObjDepth ? transObjColor : (1.0).xxx);&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Вот и всё. Красивая картинко:&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSshexpl.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Для точечных источников света метод такой же, только различаются текстуры глубины. Для сохранения глубины непрозрачных объектов используется виртуальная кубическая текстура. Она представляет собой обычную 2D текстуру, в которую помещаются все 6 сторон куба. Выглядеть она может, к примеру, так: &lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSdepthC1.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Для доступа к ней по 3D вектору используется кубическая карта переадресации (в формате &lt;b&gt;R16G16&lt;/b&gt; для высокой точности), которая генерируется в коде процедурно. Показывать её не буду, её содержимое не интересно, ну и лень делать раскладку для рендера кубмапы на экран.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;//перевод 3D вектора в 2D&lt;br /&gt;float2 texCoord = texCUBE(indirectionMap, 3DVector).xy;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Для второй текстуры с непрозрачными объектами и их глубиной используется уже обычная кубмапа. Сделано так потому, что фильтрация теней, о которой будет сказано далее, делается только для теней от непрозрачных объектов.&lt;br /&gt;&lt;br /&gt;Кто-то, возможно, заметил цветные разводы на карте глубины. Да, на ней можно увидеть цветные разводы. Произошло это потому, что текстура глубины четырехканальная. На новых картах &lt;b&gt;ATI&lt;/b&gt; есть возможность под названием &lt;b&gt;Fetch4&lt;/b&gt;, которая позволяет получить сразу 4 текселя из одноканальной текстуры в разные компоненты вектора. На моей видеокарте этой возможности не было, а она позволяла оптимизировать фрагментный шейдер как по количеству текстурных выборок, так и по арифметическим инструкциям (можно делать проверку &lt;i&gt;fDepth &amp;gt; solidObjDepth&lt;/i&gt; одновременно для четырёх значений). Поэтому решил сделать эмуляцию этой возможности, и запихал в соседние каналы текселя значения его соседей следующим образом:&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSpackSamples.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Первоначальная задумка была в том, чтобы при выполнении билинейной фильтрации сделать &lt;i&gt;lerp&lt;/i&gt; от &lt;i&gt;value.xy&lt;/i&gt; к &lt;i&gt;value.wz&lt;/i&gt;, а затем между полученными значениями без нестандартных для &lt;b&gt;ps_2_0&lt;/b&gt; свизлов. Вот только потом оказалось, что выгоднее билинейную фильтрацию проводить следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;//поместим веса каждой компоненты в вектор&lt;br /&gt;float4 weights = float4((1.0-subUV.x)*(1.0- subUV.y), subUV.x*(1.0- subUV.y), subUV.x* subUV.y, (1.0- subUV.x)* subUV.y);&lt;br /&gt;//умножаем каждую компоненту на её вес и складываем всё вместе&lt;br /&gt;float result = dot(weights, components);&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;При включении мягких теней для точечных омни источников производятся четыре выборки &lt;b&gt;PCF2x2&lt;/b&gt;, для каждой проводиться фильтрация, как сказано выше и потом результаты усредняются.&lt;br /&gt;&lt;br /&gt;Для точечных источников с 2D тенями производиться фильтрация &lt;b&gt;PCF3x3&lt;/b&gt; с билинейной фильтрацией каждого семпла, но для этого требуется только шесть текстурных выборок (можно даже сделать четыре, но тогда усложняется арифметика). Почему только шесть выборок? Всё довольно просто. Делаем две выборки, но не двух соседних текселей, а пропуская один:&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/ABtex.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;Видно, что данные центрального текселя можно получить из &lt;i&gt;A.yz&lt;/i&gt; и &lt;i&gt;B.xw&lt;/i&gt;. Но можно даже не собирать новый вектор для последующих операций. Вместо этого, поменяем веса для компонент векторов A и B таким образом, дополнительно учитывался вес компонентов для центрального текселя.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Aweights.xw остаются прежними.&lt;br /&gt;Aweights.y += (1.0-subUV.x)*(1.0- subUV.y);&lt;br /&gt;Aweights.z += (1.0- subUV.x)* subUV.y;&lt;br /&gt;&lt;br /&gt;Bweights.yz остаются прежними.&lt;br /&gt;Bweights.x += subUV.x*(1.0- subUV.y);&lt;br /&gt;Bweights.w += subUV.x* subUV.y;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Если это сократить, то получим:&lt;br /&gt;&lt;i&gt;float4 Aweights = float4((1.0-subUV.x)*(1.0- subUV.y), (1.0-subUV.y), subUV.y, (1.0- subUV.x)* subUV.y);&lt;br /&gt;float4 Bweights = float4((1.0- subUV.y), subUV.x*(1.0- subUV.y), subUV.x* subUV.y, subUV.y);&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Три «левых» семпла скалярно умножаются на &lt;i&gt;Aweights&lt;/i&gt;, три «правых» на &lt;i&gt;Bweights&lt;/i&gt;. 6 результатов складываются вместе и умножаются на 1/9. &lt;b&gt;PCF3x3&lt;/b&gt; готов.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Немного о мелочах&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;Шрифт текстурный. Текстура сгенерена тулзой &lt;a href=&quot;http://blogs.msdn.com/garykac/articles/732007.aspx&quot;&gt;BMFontGen&lt;/a&gt;. Создаётся вершинный и индексный буфера для большого количества символов (например, 8192). В процессе рендера текста, вершинный буфер &lt;i&gt;Lock&lt;/i&gt;’ается и обновляется. Затем делается &lt;i&gt;Unlock&lt;/i&gt;, и все буквы рисуются за один &lt;b&gt;DIP&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Интерфейс реализован методом &lt;b&gt;IMGUI&lt;/b&gt;. Не создаётся никаких классов и прочего. Есть функции для отрисовки элементов, которые иногда возвращают состояние элемента (например, кнопка была нажата). Все элементы интерфейса собраны в одну текстуру-атлас.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/TSinterface.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;По аналогии с текстом, есть буфер для квадов с изображениями элементов интерфейса. Весь интерфейс рисуется за один DIP. Активно используется Z компонента вершины как для изображений интерфейса, так и для текста на нём, чтобы обеспечить правильный порядок отрисовки.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Осталось собрать это всё вместе&lt;/u&gt;.&lt;br /&gt;0. В начале первого кадра рендерятся текстуры глубины и полупрозрачных предметов для всех источников света, большинство из которых далее будут использоваться без обновления.&lt;br /&gt;1. Каждые 100мс обновляется положение, цвет и &lt;b&gt;RT&lt;/b&gt; источника света, представляющего огонь. Если включена анимация источника света, то обновляется позиция и RT ещё одного источника.&lt;br /&gt;2. Получается текстура глубины сцены полноэкранного размера.&lt;br /&gt;3. Начинается отрисовка сцены с освещением. Возможен &lt;b&gt;АА&lt;/b&gt;.&lt;br /&gt;-А. Первым проходом рисуется сцена с фоновым освещением.&lt;br /&gt;-Б. Затем по проходу на каждый видимый источник света с выбором подходящего шейдера.&lt;br /&gt;4. В текстуру огня с использованием depth/stencil из пункта 2 рисуются частицы.&lt;br /&gt;5. Рисуется объёмный свет&lt;br /&gt;-А. Заполняется буфер глубины (размер не полноэкранный, поэтому старые не использовать)&lt;br /&gt;-Б. Рисуются наборы плоскостей&lt;br /&gt;-В. Текстура размывается&lt;br /&gt;6. Текстура с содержимым кадра, ресолвится (&lt;i&gt;StretchRect&lt;/i&gt;) если надо, и рисуется в другую полноэкранную текстуру.&lt;br /&gt;7. В новую текстуру также рисуются стёкла с шейдером преломления.&lt;br /&gt;8. Туда же рисую туман.&lt;br /&gt;9. Если нету &lt;b&gt;Occlusion Query&lt;/b&gt; в процессе, запускаю проверку нового диапазона для &lt;b&gt;HDR&lt;/b&gt;.&lt;br /&gt;10. &lt;b&gt;Bright Pass&lt;/b&gt; кадра, &lt;b&gt;Downsample&lt;/b&gt;, размытие получившихся текстур для &lt;b&gt;Bloom&lt;/b&gt;.&lt;br /&gt;11. Финальный объединяющий проход. (смешивание кадра, текстур для &lt;b&gt;Bloom&lt;/b&gt;, объёмного света и огня)&lt;br /&gt;12. Рендер текста.&lt;br /&gt;&lt;br /&gt;На этом сказке конец, а тем, кто слушал –&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/pirozhok.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;По просьбе &lt;span class=&apos;ljuser  ljuser-name__winnie&apos; lj:user=&apos;_winnie&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://users.livejournal.com/_winnie/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://users.livejournal.com/_winnie/&apos;&gt;&lt;b&gt;_winnie&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;, &lt;a href=&quot;http://www.egoengine.com/Files/TSdemoSrc.rar&quot;&gt;демка, исходники и либы&lt;/a&gt; на 4.2Мб.&lt;br /&gt;Собрать удасться только в Release, и, скорее всего, только в MSVS 2005. Для сборки нужен DXSDK, а .exe в комплекте имеет наглость просить d3dx9_37.dll. В общем - на свой страх и риск :)&lt;br /&gt;Работать может не так, как &lt;a href=&quot;http://www.egoengine.com/downloads&quot;&gt;прошлогодняя версия&lt;/a&gt; без исходников на 3.63Мб, которой d3dx вообще не нужен.&lt;br /&gt;</description>
  <comments>http://null-ptr.livejournal.com/3176.html</comments>
  <lj:music>The Engine Room - A Perfect Lie (Theme Song) (Gabriel &amp; Dresden Remix)</lj:music>
  <media:title type="plain">The Engine Room - A Perfect Lie (Theme Song) (Gabriel &amp; Dresden Remix)</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>12</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/2954.html</guid>
  <pubDate>Sat, 12 Jul 2008 00:25:26 GMT</pubDate>
  <title>Интересности в OpenGL драйвере АТИ.</title>
  <link>http://null-ptr.livejournal.com/2954.html</link>
  <description>Иногда инетересно просто просмотреть, какие строки текста встречаются среди машинного кода в драйвере. Можно найти разные интересные вещи.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;Например в последних драйверах появились расширения &lt;br /&gt;&lt;b&gt;GL_AMD_performance_monitor&lt;/b&gt;&lt;br /&gt;&lt;b&gt;GL_AMDX_vertex_shader_tessellator&lt;/b&gt;&lt;br /&gt;&lt;b&gt;GL_ATI_meminfo&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Для первого фанаты ревёрс-инженеринга с opengl.org нашли следующие функции: &lt;a href=&quot;http://www.everfall.com/paste/id.php?ncbde8ev6yoh&quot;&gt;http://www.everfall.com/paste/id.php?ncbde8ev6yoh&lt;/a&gt; Странно, что нету официального описания, для профилирования было бы интересно поюзать низкоуровневые счётчики.&lt;br /&gt;&lt;br /&gt;Для второго нашёл функции:&lt;br /&gt;&lt;i&gt;int glTessellationModeAMDX(GLenum mode = {36870, 36871});&lt;/i&gt;&lt;br /&gt;&lt;i&gt;void glTessellationFactorAMDX(GLfloat factor);&lt;/i&gt;&lt;br /&gt;Готовых имён констант под эти режимы к сожалению нету. Но попробовать включить можно. Только не ясно, как результат этого дела принимать в вертексном шейдере. В DX9 их хак передаёт в VS данные трёх вершин треугольника (через семантики с номерами 0, 4 и 8) и барицентрические координаты через BLENDWEIGHT.&lt;br /&gt;В GL драйвере нашлись следующие претенденты: &lt;b&gt;vec3 gl_BarycentricCoord;&lt;/b&gt;, &lt;b&gt;ivec3 gl_VertexIndex;&lt;/b&gt; и функции&lt;br /&gt;&lt;i&gt;vec4 vertexFetchAMDX(__samplerVertexAMDX s, int index);&lt;br /&gt;ivec4 vertexFetchAMDX(__isamplerVertexAMDX s, int index);&lt;br /&gt;//uvec4 есть, __usamplerVertexAMDX есть, а функции нету.&lt;/i&gt;&lt;br /&gt;Заинтересовал этим &lt;a href=&quot;http://www.gamedev.ru/users/?id=28464&quot;&gt;Blew_zc&lt;/a&gt;, может у него что-то получится.&lt;br /&gt;&lt;br /&gt;Для &lt;b&gt;GL_ATI_meminfo&lt;/b&gt; ничего не нашлось :(&lt;br /&gt;&lt;br /&gt;Много функций для &lt;a href=&quot;http://www.everfall.com/paste/id.php?6x4t0zkfhz0a&quot;&gt;текстурных выборок с градиентами&lt;/a&gt;. Все их уже можно использовать на картах АТИ.&lt;br /&gt;&lt;br /&gt;Но пойдём дальше, и обнаружим следующие функции и константы:&lt;br /&gt;&lt;b&gt;gl_PrimitiveID&lt;/b&gt;, &lt;b&gt;gl_VertexID&lt;/b&gt;, &lt;i&gt;texelFetch***&lt;/i&gt;() и &lt;i&gt;texelFetchBuffer&lt;/i&gt;()&lt;br /&gt;прямиком из &lt;a href=&quot;http://developer.download.nvidia.com/opengl/specs/GL_EXT_geometry_shader4.txt&quot;&gt;EXT_geometry_shader4&lt;/a&gt; и &lt;a href=&quot;http://developer.download.nvidia.com/opengl/specs/GL_EXT_gpu_shader4.txt&quot;&gt;EXT_gpu_shader4&lt;/a&gt;.&lt;br /&gt;Правда, упоминаний &lt;i&gt;EmitVertex&lt;/i&gt;() и &lt;i&gt;EndPrimitive&lt;/i&gt;() нету, но дайте парням время, они трудятся!&lt;br /&gt;&lt;br /&gt;Также в одном месте пачкой идут функции:&lt;br /&gt;&lt;i&gt;itof&lt;/i&gt;, &lt;i&gt;ftoi&lt;/i&gt;, &lt;i&gt;skipPixels&lt;/i&gt;, &lt;i&gt;readInput&lt;/i&gt;, &lt;i&gt;writePixel&lt;/i&gt;, &lt;i&gt;bitmapLSB&lt;/i&gt;, &lt;i&gt;bitmapMSB&lt;/i&gt;, &lt;i&gt;writeOutput&lt;/i&gt;, &lt;i&gt;readPixel&lt;/i&gt;&lt;br /&gt;Единственное упоминание о которых я нашёл в польской статье про &lt;a href=&quot;http://translate.google.com/translate?u=http%3A%2F%2Fwww.pckurier.pl%2Farchiwum%2Fart0.asp%3FID%3D5517&amp;amp;hl=en&amp;amp;ie=UTF8&amp;amp;sl=pl&amp;amp;tl=en&quot;&gt;будующее GL2.0&lt;/a&gt; (&lt;a href=&quot;http://translate.google.com/translate?u=http%3A%2F%2F64.233.183.104%2Fsearch%3Fq%3Dcache%3AwmhLASUnmZIJ%3Awww.pckurier.pl%2Farchiwum%2Fart0.asp%253FID%253D5517%2BbitmapLSB%26hl%3Den%26ct%3Dclnk%26cd%3D4%26client%3Dopera&amp;amp;hl=en&amp;amp;ie=UTF8&amp;amp;sl=pl&amp;amp;tl=en&quot;&gt;mirror&lt;/a&gt;). В ней говориться про то, что к фрагментному и вершинному шейдерам планировалось добавить загадочный в терминологии GL пиксельный шейдер. Примеры в статье пока не привели меня к осознанию функциональности.&lt;br /&gt;&lt;br /&gt;Нашлась пара переменных и функций, упоминания о которых нигде нет, но о половины можно догадаться:&lt;br /&gt;&lt;i&gt;loadBuffer&lt;/i&gt;, VertexTexture1D, &lt;i&gt;textureCK&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Впрочем, полностью судить о функциональности по одним только строчкам в драйвере нельзя, и время покажет, что на самом деле работает.</description>
  <comments>http://null-ptr.livejournal.com/2954.html</comments>
  <lj:music>Corleone - This Is the Walk You Must Walk</lj:music>
  <media:title type="plain">Corleone - This Is the Walk You Must Walk</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/2601.html</guid>
  <pubDate>Wed, 25 Jun 2008 16:23:33 GMT</pubDate>
  <title>ATI Radeon 4850</title>
  <link>http://null-ptr.livejournal.com/2601.html</link>
  <description>Решил порадовать себя, и сегодня приобрёл недопродукт (с) &lt;span class=&apos;ljuser  ljuser-name_shtirlic404&apos; lj:user=&apos;shtirlic404&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://shtirlic404.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://shtirlic404.livejournal.com/&apos;&gt;&lt;b&gt;shtirlic404&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; &lt;a href=&quot;http://trash.egoengine.com/HD4850a.jpg&quot;&gt;ATI HD4850&lt;/a&gt;.&lt;br /&gt;Просто нормальные продукты от NVidia стоят в пару-тройку раз дороже, а тратить такие средства очень не хочется.&lt;br /&gt;&lt;br /&gt;Видюха стоила 220$, что совсем немного превысило рекомендованную цену. Она несколько &lt;a href=&quot;http://trash.egoengine.com/HD4850vs2600.jpg&quot;&gt;длиннее&lt;/a&gt; моей, теперь уже старой ATI 2600XT. Пришлось снять кулер с оперативной памяти, благо он там висел скорее для красоты (закрытой чёрной крышкой :), чем для исполнения основной функции.&lt;br /&gt;Волновался, что мой БП на 500W не потянет данную карту, но в мануале нашёл, что требуется всего 450W, что сразу разрядило нервную обстановку.&lt;br /&gt;&lt;br /&gt;Неприятно удивила температура чипа. 75 градусов в 2Д, это как-то больше 45 у 2600ХТ. Пишут что это нормально. Ещё пишут, что это для того, чтобы кулер не шумел. Я бы с радостью выставил руками максимальные обороты, на которых кулер всё равно не слышно, а видеокарта не так греется, но в Control Center такого контроля не дают.&lt;br /&gt;Утилиты вроде RivaTuner&apos;a и ATI Tray Tools пока не поддерживают новое семейство. Так что минус.&lt;br /&gt;&lt;br /&gt;Работает видеокарта быстро. Особенно в сравнении с 2600XT :). В общем, отношение цена/качество отличное.</description>
  <comments>http://null-ptr.livejournal.com/2601.html</comments>
  <lj:music>Silent Hill 4 OST - Wounded Warsong</lj:music>
  <media:title type="plain">Silent Hill 4 OST - Wounded Warsong</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/2493.html</guid>
  <pubDate>Mon, 23 Jun 2008 21:20:57 GMT</pubDate>
  <title>++age;</title>
  <link>http://null-ptr.livejournal.com/2493.html</link>
  <description>Собственно :)</description>
  <comments>http://null-ptr.livejournal.com/2493.html</comments>
  <lj:music>Vanessa Mae - Tribal Gathering</lj:music>
  <media:title type="plain">Vanessa Mae - Tribal Gathering</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/2168.html</guid>
  <pubDate>Sat, 21 Jun 2008 19:28:01 GMT</pubDate>
  <title>Интересности текстурной выборки на картах АТИ.</title>
  <link>http://null-ptr.livejournal.com/2168.html</link>
  <description>Довольно давно делал ручную билинейную фильтрацию в шейдере (можно использовать для сглаживания теней). Но в результате получил довольно страшную картину на своей видеокарте ATI 2600XT.&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/trash/fp/img21062008220445.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Подумал сперва, что что-то не так сделал, начал вставлять какие-то сдвиги, но ничего не помогало. Переключил рендеринг в REF Device, идеально!&lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/trash/fp/img21062008220406.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Тут уже появились некоторые сомнения о глюке в самой видеокарте. Начал тестировать на других картах:&lt;br /&gt;3***, 2***, X*** плохо&lt;br /&gt;9*** микроскопические редкие ошибки. &lt;a href=&quot;http://www.egoengine.com/Trash/biliR300.jpg&quot;&gt;http://www.egoengine.com/Trash/biliR300.jpg&lt;/a&gt;&lt;br /&gt;X1*** чётко&lt;br /&gt;NVidia – чётко&lt;br /&gt;&lt;br /&gt;По просьбе &lt;span class=&apos;ljuser  ljuser-name_zeux&apos; lj:user=&apos;zeux&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://zeux.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://zeux.livejournal.com/&apos;&gt;&lt;b&gt;zeux&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&apos;a проверил в DX10 (выше было в ДХ9, а ДХ10 в добавок более строг к тому, как производится растеризация).&lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/trash/ATIDX10bili.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Прошло некоторое время с момента написания поста, а обнаружилось интересное.&lt;br /&gt;Запустил в DX10 REF Device. И что происходит? &quot;Погрешности&quot;, теперь уже в кавычках, на месте. What a twist! Выходит что АТИ рисует так как надо, а вот НВ рисует не правильно, хотя результаты её, лично меня, устраивают больше.&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Стало интересно, кто виноват? Неточность чисел, погрешности функции frac() или ещё что-то.&lt;br /&gt;Попробовал наложить на квад текстуру 4х4 с point фильтрацией. Слева ATI R6**, спарва REF или NV:&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/ATIvsREF.gif&quot;&gt;&lt;br /&gt;&lt;br /&gt;Явно ошибки текстурной выборки, хотя отличаются и позиции вершин на экране (какой кошмар! :D).&lt;br /&gt;Мало того что такие погрешности мешают при 3д рендере (может из-за этого плохо работает семпл &lt;a href=&quot;http://www.egoengine.com/trash/fp/img21062008215930.jpg&quot;&gt;ATI – R2VB Animation&lt;/a&gt;? Картинка 100kb). Такие погрешности видно даже при просмотре видео! Некоторые свалили на кодек, но виновата, похоже, видеокарта (линии сверху и снизу).&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/ATIadr.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;Но и это ещё не всё. Взял текстуру 1024х2 с цветом от чёрного к белому. Адресовал её таким образом:&lt;br /&gt;&lt;i&gt;tex2Dgrad(base2, float2(0.0, 0.0), dx, dy);&lt;/i&gt;&lt;br /&gt;где dx и dy получены с помощью ddx и ddy от текстурных координат.&lt;br /&gt;MINFILTER – LINEAR&lt;br /&gt;MAGFILTER – POINT&lt;br /&gt;&lt;br /&gt;Получаем интересный способ отрисовки wireframe.&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/ATIfiltErr.gif&quot;&gt;&lt;br /&gt;REF Device согласен с NVidia Device и рисуют просто залитый серым шар.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Добавление(12 июля)&lt;/i&gt;: пример этой ошибки в реальном приложении - Parallax Occlusion Mapping от ATI:&lt;br /&gt;&lt;img src=&quot;http://trash.egoengine.com/ATIgradError2.jpg&quot;&gt;&lt;br /&gt;Картинка, показывающая &lt;a href=&quot;http://trash.egoengine.com/ATIgradError.jpg&quot;&gt;выбор мипмапов&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Отписывал это на devrel@ati.com, несколько месяцев молчат, но это вроде типично.&lt;br /&gt;Собираюсь даже купить ATI 4*** и волнуюсь, а исправили ли они там это странное поведение (&lt;i&gt;Добавление(12 июля)&lt;/i&gt;: нет, не исправили).&lt;br /&gt;А может ну их нафиг? :)</description>
  <comments>http://null-ptr.livejournal.com/2168.html</comments>
  <lj:music>Within Temptation - Hand Of Sorrow</lj:music>
  <media:title type="plain">Within Temptation - Hand Of Sorrow</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/1949.html</guid>
  <pubDate>Fri, 20 Jun 2008 13:29:30 GMT</pubDate>
  <title>Выпускной, Ура!</title>
  <link>http://null-ptr.livejournal.com/1949.html</link>
  <description>Наконец-то наступил мой выпускной в школе. 12 лет учёбы в ней теперь позади.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;Утром была торжественная часть вручения наград.&lt;br /&gt;Закончил лучше всех (geek powa!), дали медальку и кучу листочков, среди которой отметилась грамота за &quot;отличную и блестящую учёбу&quot; от премьер-министра Латвии, Ивара Годманиса. Похоже у него нашлась пара секунд, чтоб нарисовать свою подпись на каком-то листике. :)&lt;br /&gt;Но всё-равно приятно.&lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/Images/atzraks.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;Несколько часов сидел в душном зале, но к счастью и это позади.&lt;br /&gt;Скоро будет вторая часть - Выпускной Вечер. Будем праздновать до пяти утра в Юрмале.&lt;br /&gt;&lt;br /&gt;Настроение - позитивное.</description>
  <comments>http://null-ptr.livejournal.com/1949.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/1738.html</guid>
  <pubDate>Wed, 18 Jun 2008 22:40:03 GMT</pubDate>
  <title>Векторное представление шрифтов на GPU - демка.</title>
  <link>http://null-ptr.livejournal.com/1738.html</link>
  <description>По просьбе пары человек написал небольшую демку, показывающую рендер векторного шрифта.&lt;br /&gt;&lt;br /&gt;Архив размером 109кб доступен по &lt;a href=&quot;http://www.egoengine.com/getfile.php?action=get&amp;amp;id=6&quot;&gt;ссылке&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Перемещать плоскость можно перетягивая её или нажимая стрелки на клавиатуре.&lt;br /&gt;Приближаться и удаляться можно колёсиком мыши или кнопками +/-.&lt;br /&gt;Кнопка &quot;A&quot; включает импровизированный суперсемплинг 8х (восьмикратный рендер с субпиксельными смещениями и адитивным блендингом).&lt;br /&gt;На скорость влияет так же существенно, как и на качество:&lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/Images/fontAAcomp.png&quot; alt=&quot;Comparison of simple rendering vs SSAA&quot;&gt;&lt;br /&gt;До кучи в архиве присутствуют исходники, хотя там мало что может заинтересовать.&lt;br /&gt;&lt;br /&gt;D3DX не требуется.&lt;br /&gt;&lt;br /&gt;На ATI 2600XT в начальной позиции получаю 640\92 fps (no SSAA\SSAA). Если не лень, можете написать ситуацию на своём железе.</description>
  <comments>http://null-ptr.livejournal.com/1738.html</comments>
  <lj:music>The Music - The Price (Steve Fitzmaurice Mix)</lj:music>
  <media:title type="plain">The Music - The Price (Steve Fitzmaurice Mix)</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/1355.html</guid>
  <pubDate>Mon, 16 Jun 2008 22:56:43 GMT</pubDate>
  <title>Векторное представление шрифтов на GPU.</title>
  <link>http://null-ptr.livejournal.com/1355.html</link>
  <description>В голове возникла идея написать рендер текстур, которые содержат в себе не обычную информацию о цвете, а информацию о векторах, по которым можно составить изображение, которое можно увеличивать без потери деталей.&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;В силу небольших возможностей шейдеров версии 2.0 решил ограничится ч/б текстурами. Сразу понял, что интересно будет попробовать сделать отрисовку текста. Обычно для его отрисовки используют текстуры, в которых нарисованы изображения глифов. Если хочется рисовать большие буквы, то приходиться увеличивать текстуру со шрифтом или растягивать небольшие изображения.&lt;br /&gt;Для реализации понадобилось написать программу, которая скидывает информацию о контурах, получаемых функцией &lt;i&gt;GetGlyphOutline&lt;/i&gt; в изображение. В ней же был написан софтварный рендер для тестов.&lt;br /&gt;&lt;i&gt;GetGlyphOutline&lt;/i&gt; выдаёт различное представление для различных элементов глифа. Для прямых всё просто – список точек. А вот для загруглений используются квадратичные сплайны. Было решено их переводить в прямые линии, преобразуя сплайн в несколько отрезков. Формулы нашлись в msdn.&lt;br /&gt; &lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/trash/fp/img16062008234843.png&quot; width=&quot;256&quot; height=&quot;256&quot;&gt;&lt;br /&gt;Не сразу понял, как для произвольной точки определить, находится ли она внутри контура или снаружи. Решение вскоре нашлось, возьмём отрезок с началом в текущей точке (x;y) и концом в (+inf;y), и найдём количество его пересечений с контуром глифа. Если число нечётное, то точка внутри.&lt;br /&gt;Но конечно не всё так просто. Нельзя записать список этих отрезков в текстуру и заставить GPU делать сотню (а то и больше) выборок из текстуры в каждом фрагменте. На первых этапах была идея записывать в каждый тексель уравнение прямой, проходящей через него. Но для этого понадобилось довольно высокое разрешение текстуры, особенно для небольших деталей. Поэтому контур буквы делится на кусочки определённого размера:&lt;br /&gt; &lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/trash/fp/img17062008000953.png&quot;&gt;&lt;br /&gt;Пересечения луча с отрезками будет производится для каждого кусочка по отдельности. Но если разделить как показано на картинке, то ничего хорошего не выйдет. К примеру для для центрального квадрата в верхнем ряду не будет найдено пересечений и будет сделан вывод, что точки находятся вне контура. Исправить ситуацию можно, добавив отрезки с правого края клетки:&lt;br /&gt; &lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/trash/fp/img17062008001907.png&quot;&gt;&lt;br /&gt;Выглядит просто, но на деле за это отвечает довольно жуткий код. :) Перед тем как броситься и записать полученные данные в текстуру следует дополнительно уменьшить количество отрезков. Я решил уменьшать до 8, и к счастью довольно мало элементов выходили за эти рамки. Уменьшалось количество отрезков в два этапа. На первом этапе выбрасывались горизонтальные, так как они не вляли на результат. На втором этапе, если это было необходимо, выбрасывались отрезки, начиная с самого короткого, и только при условии, если начальная и конечная точка отрезка являлись, соответственно, конечной и начальной точками двух других. Таким образом их можно было удалять так, чтобы «не было разрывов» (с).&lt;br /&gt;&lt;br /&gt;Отрезок представляется четырьмя координатами. Для первой реализации на GPU решил в один тексель писать информацию об одном отрезке. Данные одного кусочка занимали линейку из 8 пикселей. Если отрезков было меньше восьми, другие становились равны (0;0)-(0;0). Первый шейдер без оптимизаций раскладывался компилятором в 120 ALU инструкций, поэтому для проверки пришлось выбрать профиль ps_3_0. Вот код шейдера:&lt;br /&gt;&lt;a href=&quot;http://www.everfall.com/paste/id.php?s4jhxzuiklne&quot;&gt;http://www.everfall.com/paste/id.php?s4jhxzuiklne&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Тут видно отличный от описанного выше подхода к определению принадлежности точки внутренней части сегмента. По умолчанию мы находимся снаружи (белый цвет, wind = 1.0), и при каждом пересечении делаем wind*=-1.0; тоесть меняем белый цвет на чёрный и наоборот. Это плохое решение, цепочку из восьми зависимых умножений оптимизировать не получится. Просто на момент написания первого шейдера нормальный подход я ещё не придумал :). В начале шейдера видны довольно хитрые преобразования текстурной координаты. Смысл заключается в том, что текстурные координаты попадающие на одну линейку из 8 текселей преобразуются в координаты начала этой линейки. Так же получается вектор, который показывает, где мы находимся в пределах нашего квадратика.&lt;br /&gt;&lt;br /&gt;Кроме того, в этом шейдере упускается бонус от векторных конвееров, и чтобы исправить это, понадобилось менять формат хранения данных в текстуре. Данные пришлось записывать так, чтобы в одном текселе была информация сразу о четырёх отрезках. Отрезок задаётся четрырьмя числами (x1; y1)-(x2; y2). Записывал немного в другом порядке (x1;x2;y1;y2), но это не имеет значения. В качестве небольших оптимизаций, пара расчётов была скинута в вершинный шейдер и в программу создания текстуры. К сожалению, деление не векторизуется, пришлось с этим жить. А жить стало намного легче. Шейдер влез в рамки ps_2_0 и раскладывается в 42 ALU инструкции:&lt;br /&gt;&lt;a href=&quot;http://www.everfall.com/paste/id.php?atdtm1rruzvc&quot;&gt;http://www.everfall.com/paste/id.php?atdtm1rruzvc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Я наверно уже утомил читателей, поэтому самое время обсудить результаты.&lt;br /&gt;Текстура для шрифта Arial получилась размером 512х512 при этом используется только 55% её пространства. Наверно можно упаковать глифы чуть лучше и тогда будет возможно уменьшить размер текстуры. Занимает изображение 1Мб, но сжимается rar’ом до 43кб. В dds векторное изображение сжимать не решился, так как результат заведомо будет ужасным.&lt;br /&gt;Вот рендер полученной текстурки:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/trash/fp/img17062008012410.png&quot;&gt;&lt;br /&gt;И close-up одного глифа:&lt;br /&gt;&lt;img src=&quot;http://www.egoengine.com/trash/fp/img17062008012516.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;В качестве недостатков – отсутствие сглаживания, два цвета, и плохо выглядит при уменьшении. Учитывая предел в 64 инструкции возможно получится добавить некоторое сглаживание, но у меня пока не появилось на свет идей, как это лучше сделать.&lt;br /&gt;&lt;br /&gt;Не знаю, где это можно применить, делал просто потому что было интересно. Как вариант, можно перейти от шрифтов к любым двухцветным векторным изображениям.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В разработке помогли некоторые идеи из доки Texel Programs For Random-Access Antialiased Vector Graphics от Hugues Hoppe, Microsoft Research.</description>
  <comments>http://null-ptr.livejournal.com/1355.html</comments>
  <lj:music>Set The White Flags On Fire Slowly - Among The Burning Spokes Of Sunset Collected Into...</lj:music>
  <media:title type="plain">Set The White Flags On Fire Slowly - Among The Burning Spokes Of Sunset Collected Into...</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/1062.html</guid>
  <pubDate>Mon, 22 Oct 2007 15:52:14 GMT</pubDate>
  <title>Неделя игр</title>
  <link>http://null-ptr.livejournal.com/1062.html</link>
  <description>&amp;nbsp; На компе очень неожиданно начали появляться и отвлекать от домашних проектов новые игры.&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp; Началось всё с бета версии &lt;b&gt;Crysis multi-player&lt;/b&gt; стянутой, если не ошибаюсь, откуда-то с платных аккаунтов fileplanet. Хотя я не являюсь особым любителем онлайн fps игр (последний раз играл наверно года 4 назад), игра понравилась и затянула. Графика радует глаз, но огорчает скоростью – на middle-end карте нового поколения (2600XT) выставить многие красоты не выйдет (режим «всё включено» привёл к GPU recover). Через неделю играть немного надоело из-за однообразности окружения (доступна была только одна локация).&lt;br /&gt;&amp;nbsp; Но тут для спасения ситуации появились &lt;b&gt;Portal&lt;/b&gt; и &lt;b&gt;Half-Life: Episode 2&lt;/b&gt;. Начал с &lt;b&gt;Portal&lt;/b&gt;, но пройдя 8 уровней, стало скучно, и я переключился на &lt;b&gt;HL:E2&lt;/b&gt;. Игра привела в восторг. Графика на максимальных настройках (кроме АА) работает отлично. Игровой процесс не даёт оторваться, музыкальные темы хороши и всегда к месту. К сожалению, заканчивается эпизод быстро (мне потребовалось около  5-ти часов), а продолжения хочется уже сейчас.&lt;br /&gt;&amp;nbsp; Тут за спиной обнаруживаются радостные возгласы брата, играющего в &lt;b&gt;Portal&lt;/b&gt; на следующих уровнях. В срочном порядке начинаю играть, и обнаруживаю, что настоящее веселье в действительности начинается чуть позже. Концовка просто великолепная, и игра проходиться повторно с комментариями от разработчиков. После чего играю в продвинутые уровни и challenges.&lt;br /&gt;&amp;nbsp; Затем настала очередь просмотреть демо &lt;b&gt;Call of Duty 4&lt;/b&gt;. Честно говоря, не впечатлило. Как графика, так и геймплей. Прошёл два раза, надеясь, что упустил что-то в начале, но так и не нашёл.&lt;br /&gt;&amp;nbsp; Но и тут ряд новых игр не закончился. Вышла демо версия мультиплеера &lt;b&gt;UT3&lt;/b&gt;. Игра радует быстрой и неплохой графикой (только куда дели настройку АА?). Геймплей, это нечто безббашенное и нереальное. Из минусов отметил отвратительный интерфейс, странно работающий поиск серверов, и раздражающая синхронизация с сервером, когда положение игрока раз в 10 секунд сдвигают (если пинг низкий, такого вроде не происходит).&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Так и хочеться сказать: Слишком много хороших игр!&lt;br /&gt;</description>
  <comments>http://null-ptr.livejournal.com/1062.html</comments>
  <lj:music>David Vendetta Feat. Akram - Unidos Para La Musica</lj:music>
  <media:title type="plain">David Vendetta Feat. Akram - Unidos Para La Musica</media:title>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/955.html</guid>
  <pubDate>Thu, 31 May 2007 14:28:35 GMT</pubDate>
  <title>Демка теней от полупрозрачных объектов.</title>
  <link>http://null-ptr.livejournal.com/955.html</link>
  <description>По просьбам в чате и из собственного интереса, наконец переписал прошлогоднюю OpenGL демку на DirectX 9. Кроме старых эффектов (HDR, Bloom, Volumetric light, Volumetric fog, Refraction, Particles) добавил ещё несколько: AA, Soft Shadows, Alpha to Coverage и Soft Particles чтобы всё было более мягким и приятным.&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;В результате переписывания демка работает в среднем в 3 раза быстрее, выглядит гораздо лучше, и при этом не испытывает проблем от кривости драйверов.&lt;br /&gt;Работает на большом спектре железа (в основном требуеться поддержка SM2.0, а это NV30+ и R300+)&lt;br /&gt;&lt;br /&gt;Картинки можно найти в &lt;a href=&quot;http://www.egoengine.com/gallery&quot;&gt;Галерее&lt;/a&gt;. Но решил положить тут парочку для подогрева интереса:&lt;br /&gt;&lt;a href=&quot;http://www.egoengine.com/Images/EGOGlass5.jpg&quot;&gt;&lt;img src=&quot;http://www.egoengine.com/Images/EGOGlass5Mini.jpg&quot; /&gt;&lt;/a&gt;124Kb &lt;a href=&quot;http://www.egoengine.com/Images/EGOGlass3.jpg&quot;&gt;&lt;img src=&quot;http://www.egoengine.com/Images/EGOGlass3Mini.jpg&quot; /&gt;&lt;/a&gt;106Kb &lt;a href=&quot;http://www.egoengine.com/Images/EGOGlass8.jpg&quot;&gt;&lt;img src=&quot;http://www.egoengine.com/Images/EGOGlass8Mini.jpg&quot; /&gt;&lt;/a&gt;68Kb&lt;br /&gt;&lt;br /&gt;Саму демку скачиваем &lt;a href=&quot;http://www.egoengine.com/downloads?action=comments&amp;amp;id=5&quot;&gt;от сюда (3.63Мб)&lt;/a&gt;&lt;br /&gt;</description>
  <comments>http://null-ptr.livejournal.com/955.html</comments>
  <category>3d</category>
  <category>demos</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://null-ptr.livejournal.com/325.html</guid>
  <pubDate>Sat, 28 Oct 2006 20:49:08 GMT</pubDate>
  <title>Hello World!</title>
  <link>http://null-ptr.livejournal.com/325.html</link>
  <description>Свой ЖЖ создал ещё очень давно, но не для того, чтобы в нём писать, а для другой, неизвестной мне теперь цели.&lt;br /&gt;Так и пылился бы мой журнал, если бы не постоянно возростающая популярность ЖЖ. Всё больше знакомых и друзей заводили свои журналы, и что-то даже в них писали.&lt;br /&gt;&lt;br /&gt;Вобщем решил узнать ЖЖ по ближе. Говорят, главное, это начать.&lt;br /&gt;&lt;br /&gt;Посмотрим, что у меня из этого выйдет =)</description>
  <comments>http://null-ptr.livejournal.com/325.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
</channel>
</rss>
