<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated on Fri, 10 Feb 2012 02:41:02 -0800 -->
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <atom:link href="http://software.intel.com/ru-ru/articles/graphics/type/code/feed/" rel="self" type="application/rss+xml" />
    <title>Intel Software Network articles фид</title>
    <link>http://software.intel.com/ru-ru/articles/graphics/type/code/</link>
    <description></description>
    <language>ru-ru</language>
    <item>
      <title>Onloaded Shadows</title>
      <description><![CDATA[ <link rel="stylesheet" type="text/css" href="http://software.intel.com/media/gamedev/css/3302_Intel_VC_01.css?v=11" media="screen" />
<link rel="stylesheet" type="text/css" href="http://software.intel.com/file/23729" media="screen" />
<table border="0" cellspacing="0" cellpadding="0" width="100">
<tbody>
<tr>
<td valign="top">
<div id="left_container">
<div id="header_content"><a title="Visual Computing Developer Community" href="http://software.intel.com/en-us/visual-computing/"><img border="0" src="http://software.intel.com/file/20493/" width="727" height="96" /></a></div>
<div id="left_content_container2"><!-- START left content -->
<div id="showcase_01">
<div >
<h2 >Onloaded Shadows</h2>
<p >Метод Onloaded Shadows позволяет перенести асинхронную обработку теневых карт с графического на центральный процессор. Использование в данной технике каскадной модели обработки позволяет обновлять находящиеся рядом с точкой обзора тени объектов в каждом кадре, проводя все вычисления на GPU, а тени более удаленных объектов – реже, используя ресурсы центрального процессора.</p>
<br />
<div class="coolButton"><a title="Onloaded Shadows article" href="http://software.intel.com/ru-ru/articles/onloaded-shadows-moving-shadow-map-generation-from-the-gpu-to-the-cpu/">Читать статью</a></div>
<div class="coolButton"><a title="Onloaded Shadows Source" href="http://software.intel.com/file/33179">Скачать исходный код</a></div>
<div class="coolButton"><a title="Onloaded Shadows Installer" href="http://software.intel.com/file/33178">Скачать исполняемые файлы</a></div>
<br /></div>
<div >
<p>
<object height="203" width="360" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" id="v_2672_1759" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000">
<param name="id" value="v_2672_1759" />
<param name="name" value="v_2672_1759" />
<param name="flashvars" value="file=http://software.intel.com/media/videos/b/a/1/b/3/e/b/avxcloth.mp4&amp;autostart=false&amp;bufferlength=5&amp;allowfullscreen=true&amp;plugins=http://software.intel.com/common/swf/listen&amp;title=AVX+Cloth+-+Developer+Video" />
<param name="allowfullscreen" value="true" />
<param name="src" value="http://software.intel.com/common/swf/mediaplayer.swf" /><embed height="203" width="360" src="http://software.intel.com/common/swf/mediaplayer.swf" allowfullscreen="true" flashvars="file=http://software.intel.com/media/videos/b/a/1/b/3/e/b/avxcloth.mp4&amp;autostart=false&amp;bufferlength=5&amp;allowfullscreen=true&amp;plugins=http://software.intel.com/common/swf/listen&amp;title=AVX+Cloth+-+Developer+Video" name="v_2672_1759" id="v_2672_1759" type="application/x-shockwave-flash"></embed>
</object>
</p>
<p align="center"><a href="http://software.intel.com/en-us/videos/avx-cloth-developer-video/">Демонстрация возможностей Onloaded Shadows </a></p>
<p>Более подробно о примере можно прочитать в статье<br />"<a title="статья Onloaded Shadows" href="http://software.intel.com/ru-ru/articles/onloaded-shadows-moving-shadow-map-generation-from-the-gpu-to-the-cpu/">Onloaded Shadows: перенос обработки теневых карт с графического на центральный процессор</a>"</p>
<p> </p>
</div>
<br clear="all" />
<div>
<table border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff">
<tbody>
<tr>
<td><img src="http://software.intel.com/file/25372" width="531" height="37" /></td>
<td></td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="6" bordercolor="#ffffff" cellpadding="0" bgcolor="#ffffff">
<tbody>
<tr>
<td valign="top" width="214">
<div ><a title="onloaded1_web.jpg" href="http://software.intel.com/file/39582" alt="onloaded1_web.jpg"><img title="onloaded1_web_small.jpg" alt="onloaded1_web_small.jpg" src="http://software.intel.com/file/39579" /></a></div>
</td>
<td valign="top" width="234">
<div ><a title="onloaded2_web.jpg" href="http://software.intel.com/file/39583" alt="onloaded2_web.jpg"><img title="onloaded2_web_small.jpg" alt="onloaded2_web_small.jpg" src="http://software.intel.com/file/39580" /> </a></div>
</td>
<td valign="top" width="256">
<div ><a title="onloaded3_web.jpg" href="http://software.intel.com/file/39584" alt="onloaded3_web.jpg"><img title="onloaded3_web_small.jpg" alt="onloaded3_web_small.jpg" src="http://software.intel.com/file/39585" /></a></div>
</td>
</tr>
<tr>
<td >
<p><i> Экран приложения, в котором реализован метод Onloaded Shadows</i></p>
</td>
<td >
<p><i> Вид из источника света; <br />цветами выделены каскады</i></p>
</td>
<td >
<p><i> Тени дальних объектов рассчитаны <br />асинхронно на CPU</i></p>
</td>
</tr>
</tbody>
</table>
</div>
<br /><br /><!-- start of 3 column table --> 
<table border="0" cellspacing="0" cellpadding="0" width="695">
<tbody>
<tr>
<td valign="top" rowspan="2" width="695">
<table border="0" cellspacing="0" cellpadding="0" width="695">
<tbody>
<tr>
<td valign="top"><img src="http://software.intel.com/file/22889" width="697" height="8" /></td>
</tr>
<tr>
<td class="panel_bg_02" valign="top">
<table border="0" cellspacing="0" cellpadding="0" width="695">
<tbody>
<tr>
<td rowspan="2" width="12"><img src="http://software.intel.com/media/gamedev/_images/blank.gif" width="12" height="8" /></td>
<td height="4" valign="top"><img src="http://software.intel.com/media/gamedev/_images/blank.gif" width="8" height="8" /></td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td></td>
<td valign="top">
<table border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td  class="arrow" height="19" valign="top" width="65%"><span ><b>Минимальные системные требования</b></span></td>
<td  class="arrow" height="19" valign="top" width="35%"><span ><b><a href="http://software.intel.com/en-us/articles/code/">Другие примеры кода</a></b></span></td>
</tr>
<tr>
<td  class="arrow" height="19" valign="top" width="33%"></td>
<td  class="arrow" height="19" valign="top" width="33%"></td>
</tr>
<tr>
<td  height="19" valign="top" width="33%"><ol type="1">
<li>CPU: Dual-Core (Intel® Core™ i5 или аналогичные предложения)</li>
<li>GFX: аппаратная поддержка DX9с</li>
<li>OS: Microsoft Windows Vista* or Microsoft Windows 7*</li>
<li>MEM: 2 GB RAM или больше</li>
<li>Программное обеспечение: <ol type="1">
<li>DirectX SDK (версия от Июня 2010 или более поздняя)</li>
<li>Microsoft Visual Studio 2008* w/SP1 или Microsoft Visual Studio 2010*</li>
</ol></li>
</ol>
<p>* Другие наименования и торговые марки могут являться собственностью третьих лиц</p>
</td>
<td  height="19" valign="top" width="33%">
<ul>
<li><a title="Sandy Bridge Samples" href="http://software.intel.com/en-us/articles/sandy-bridge-samples/">Sandy Bridge Samples</a></li>
<li><a title="AVX Cloth" href="http://software.intel.com/ru-ru/articles/avx-cloth/">AVX Cloth</a></li>
<li><a title="TickerTape" href="http://software.intel.com/en-us/articles/tickertape/">TickerTape Demo</a></li>
<li><a title="Smoke" href="http://software.intel.com/ru-ru/articles/smoke-technology-demo/">Smoke Game Technology </a></li>
<li><a href="http://software.intel.com/en-us/articles/ocean-fog-using-direct3d-10/">OceanFog Using Directed3D 10 </a></li>
</ul>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
<!--bottom border for large box--> 
<tr>
<td valign="top"><img src="http://software.intel.com/media/gamedev/_images/footer-bg-01.gif" width="697" height="8" /></td>
</tr>
<!--end border-->
</tbody>
</table>
</td>
<td rowspan="2" width="10"><img src="http://software.intel.com/media/gamedev/_images/blank.gif" width="10" height="10" /></td>
</tr>
<tr>
<td></td>
<!--raghava-->
</tr>
<tr>
<td valign="top" width="344"></td>
</tr>
</tbody>
</table>
<!-- end of 3 column table --><br /><br /></div>
</div>
</div>
</td>
<td  valign="top"><!-- RHC --> 
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td  width="215">
<table  border="0" cellspacing="0" cellpadding="0" width="223">
<tbody>
<tr>
<td height="4"><img src="http://software.intel.com/file/20516" width="232" height="4" /></td>
</tr>
<tr>
<td>
<table  border="0" cellspacing="0" cellpadding="0" width="223">
<tbody>
<tr>
<td  valign="top"><a href="http://www.intelsoftwaregraphics.com/?lid=5ceakfXf8Ho=&amp;siteid=cqMoF5H/37o="><img title="Intel Visual Adrenaline" border="0" alt="Intel Visual Adrenaline" src="http://software.intel.com/file/20512" width="223" height="71" /></a></td>
</tr>
<tr>
<td  valign="top">
<table  border="0" cellspacing="0" cellpadding="0" width="223">
<tbody>
<tr>
<td height="8" width="11"></td>
<td  width="10"><img src="http://software.intel.com/file/20514" width="5" height="5" /></td>
<td ><a  title="Intel Adrenaline Developer Community" href="http://software.intel.com/en-us/visual-computing/">Сообщество разработчиков</a></td>
<td width="10"></td>
</tr>
<tr>
<td height="8"></td>
<td ><img src="http://software.intel.com/file/20514" width="5" height="5" /></td>
<td ><a  title="Intel Adrenaline Software Partner Program" href="http://software.intel.com/partner/home?locale=ru-RU">Intel® Software Partner Program</a></td>
<td></td>
</tr>
<tr>
<td height="8"></td>
<td ><img src="http://software.intel.com/file/20514" width="5" height="5" /></td>
<td ><a  title="Intel Adrenaline Game On" href="http://www.intel.com/Consumer/Game/index.htm">Game On</a></td>
<td></td>
</tr>
<tr>
<td height="8"></td>
<td ><img src="http://software.intel.com/file/20514" width="5" height="5" /></td>
<td ><a  title="Intel Adrenaline Showcase" href="http://www.intelsoftwaregraphics.com/?lid=5ceakfXf8Ho=&amp;siteid=cqMoF5H/37o=">Демонстрация</a></td>
<td></td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td height="7" valign="top"><img src="http://software.intel.com/file/20515" width="223" height="7" /></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td height="4" valign="top"><img src="http://software.intel.com/file/20494" width="6" height="6" /></td>
</tr>
<tr>
<td></td>
</tr>
</tbody>
</table>
<br /><center> 
<table id="nav_table" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<table border="0" cellspacing="0" cellpadding="0" width="190">
<tbody>
<tr>
<td width="9"></td>
<td>
<div ><b>Visual Adrenaline</b><br /><a href="http://software.intel.com/sites/billboard/"><img border="0" alt="Download PDF" src="http://software.intel.com/file/25369" /></a><br /><br /><b>Преимущества SIMD</b><br /><a href="http://software.intel.com/en-us/articles/tickertape-part-2/"><img border="0" alt="Download PDF" src="http://software.intel.com/file/25665/" /></a><br /></div>
</td>
<td></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</center><br /><center> 
<table id="nav_table" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<table border="0" cellspacing="0" cellpadding="0" width="190">
<tbody>
<tr>
<td class="right_container_hdr2" width="9"></td>
<td class="right_container_hdr2"><b>Intel Tools for Unreal Developers <br /><a href="http://software.intel.com/en-us/articles/epic-licenses-tbb-for-ue-licensees/">TBB for Unreal Engine</a></b></td>
<td class="right_container_hdr2"></td>
</tr>
<tr>
<td height="4" valign="top" colspan="3"><img src="http://software.intel.com/file/20494" width="4" height="4" /></td>
</tr>
<tr>
<td class="right_container_hdr" width="9"></td>
<td class="right_container_hdr">
<h4>Related Links</h4>
</td>
<td class="right_container_hdr"></td>
</tr>
<tr>
<td height="4" valign="top" colspan="3"><img src="http://software.intel.com/file/20494" width="4" height="4" /></td>
</tr>
<tr>
<td height="15"></td>
<td valign="middle"><a title="Intel Visual Computing Home" href="http://www.intel.com/software/graphics">Visual Computing Home</a></td>
<td></td>
</tr>
<tr>
<td></td>
<td>
<h3>Intel<sup>®</sup> Technologies</h3>
</td>
<td></td>
</tr>
<tr>
<td></td>
<td valign="top"><a href="http://www.intel.com/software/sandybridge">Sandy Bridge</a><br /><a title="Intel Visual Computing Technologies Integrated Graphics" href="http://software.intel.com/en-us/articles/integrated-graphics/">Graphics</a><br /><a title="Intel Visual Computing Technologies Parallel Programming" href="http://software.intel.com/en-us/articles/parallel-programming-vc/">Parallel Programming</a></td>
<td></td>
</tr>
<tr>
<td height="4" valign="top" colspan="3"><img src="http://software.intel.com/file/20494" width="4" height="4" /></td>
</tr>
<tr>
<td></td>
<td>
<h3>Focus Areas</h3>
</td>
<td></td>
</tr>
<tr>
<td></td>
<td valign="top"><a title="Intel Game Development Focus Area" href="http://software.intel.com/en-us/articles/game-dev/">Game Development</a><br /><a title="Intel Visual Computing Artist/Animator Focus Area" href="http://software.intel.com/en-us/articles/artist-animator/">Artist/Animator</a><br /><a title="Intel Visual Computing Media Focus Area" href="http://software.intel.com/en-us/articles/media/">Media</a></td>
<td></td>
</tr>
<tr>
<td height="4" valign="top" colspan="3"></td>
</tr>
<tr>
<td></td>
<td>
<h3>Develop</h3>
</td>
<td></td>
</tr>
<tr>
<td></td>
<td valign="top"><a title="Intel Visual Computing Devlopment Tools" href="http://software.intel.com/en-us/articles/tools-vc/">Tools</a><br /><a title="Intel Visual Computing Devlopment Code" href="http://software.intel.com/en-us/articles/code/">Code</a></td>
<td></td>
</tr>
<tr>
<td height="4" valign="top" colspan="3"></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</center><!--END right column Content --></td>
</tr>
</tbody>
</table> ]]></description>
      <link>http://software.intel.com/ru-ru/articles/onloaded-shadows/</link>
      <pubDate>Thu, 02 Dec 2010 13:00:00 -0800</pubDate>
      <comments>http://software.intel.com/ru-ru/articles/onloaded-shadows/#comments</comments>
      <guid isPermaLink="true">http://software.intel.com/ru-ru/articles/onloaded-shadows/</guid>
      <category>Сообщество разработчиков графических приложений</category>
      <category>Сообщество разработчиков программного обеспечения</category>
    </item>
    <item>
      <title>Построение теней в реальном времени по методу Shadow Volumes</title>
      <description><![CDATA[ <h2>Введение</h2>
<p>Щекочущее нервы наслаждение эффектом присутствия в компьютерных играх рождается, в том числе, и при исследовании искусно смоделированных виртуальных миров – чем реалистичнее, тем лучше. Игры переносят нас в бесконечное множество локаций, от фантастических миров магии и тайн до полной опасностей и азарта виртуальной реальности. Совершенствование графических ускорителей позволило программистам преодолеть ограничения двухмерных игр и создавать трехмерные пространства с потрясающей реалистичностью. В условиях постоянного роста быстродействия процессоров и совершенствования технологий оптимизации графики, как аппаратных, так и программных, у разработчиков появляются новые возможности для повышения реалистичности трехмерной графики и выхода на новые уровни интерактивности.</p>
<p>Невзирая на богатство и яркость оттенков, замысловатые текстуры и потрясающие визуальные эффекты современных игр, мозг все-таки ощущает нехватку чего-то существенного. Человек осознает, что изображение на экране – просто трюк, изощренный обман разума совместными усилиями электронов, математики и светящегося люминофора. Несмотря на сложные алгоритмы перспективного деления и коррекции перспективы в текстурах, изображению на экране все-таки недостает настоящего ощущения глубины. Чего же не хватает? Недостающим звеном могут оказаться тени. Без них любая иллюзия трехмерности окажется весьма несовершенной.</p>
<!-- .code {padding: 10px 10px 5px; margin-bottom: 10px; background-color: #e3e3e3; border: 1px solid #bababa; } -->
<h2>Свет и тень в компьютерной графике</h2>
<p>В этой статье мы постарались снять покров тайны с процесса создания теней в трехмерных средах. Мы также предлагаем некоторые конкретные методы, с помощью которых программист может привнести в свой проект дополнительные элементы реализма, создаваемые рендерингом теней в реальном времени. Надеемся, что приведенные примеры и алгоритмы вдохновят программистов на новые эксперименты с предложенными методами и, может быть, на их адаптацию для конкретного приложения.</p>
<p>Совершенствование аппаратных средств ускорения и программных технологий обработки графики все больше расширяет спектр возможностей, доступных профессионалам. И сегодня, когда процессоры могут работать с ошеломляющей скоростью, а графические ускорители способны «строгать» треугольники быстрее, чем фабрика чипсов, мы можем воспользоваться преимуществами всех этих новых возможностей для создания весьма интересных приложений.</p>
<h2>Когда спускаются тени</h2>
<p>Сегодня существует множество методов расчета и отображения теней в реальном времени, включая проекции на плоскость (plane projections), наложение текстур (texture mapping), теневые объемы (shadow volumes) и трассировку лучей (ray tracing). Метод наложения текстур превосходно изложен в статье Хьюберта Нгуена «Построение теней на объемах» (Hubert Nguyen, "Casting Shadows on Volumes") в журнале «Game Developer» за март 1999 г. Наши первоначальные попытки реализовать тени в реальном времени были основаны на методе, весьма похожем на описанный в работе Нгуена. К сожалению, мы столкнулись с рядом негативных факторов, характерных для рассматриваемого метода, которые также были отмечены и описаны Нгуеном: низкая скорость рендеринга текстур, большие затраты вычислительных ресурсов при самозатенении, необходимость дополнительных итераций для сложных сцен и значительные размеры текстур, необходимые, чтобы избежать пикселизации. Наши поиски более эффективной технологии привели к методу отбрасывания теней (shadow casting).</p>
<p>Стремительное развитие технологий ускорения графики позволяет добиться на персональном компьютере такого же уровня быстродействия, как и на высокопроизводительной рабочей станции. Благодаря этому многие графические методы, первоначально разработанные для рабочих станций, были реализованы в трехмерных играх реального времени. Сегодня целый ряд видеокарт поддерживает 8-битные буферы шаблонов (stencil buffer), что позволяет использовать методы отбрасывания теней для создания теней в реальном времени при минимальном снижении производительности.</p>
<p>Алгоритм включает в себя три существенных компонента: построение внешнего ребра объекта, рисование полигонов с теневым объемом и рендеринг собственно тени. Мы рассмотрим каждый из этих компонентов в теории и затем, в последующих разделах, приведем подробные указания по их практической реализации.</p>
<p><a href="http://software.intel.com/articles/content/ru-ru/2325/fig1.htm" target="_blank"><img src="http://software.intel.com/file/9234" alt="" width="150" height="104" /></a><br /> <a href="http://software.intel.com/articles/content/ru-ru/2325/fig1.htm" target="_blank">Рис. 1 — увеличить</a></p>
<h2>Построение теневого объема</h2>
<p>Внешним ребрам объекта не всегда сопоставлена соответствующая выпуклая часть данного объекта. Необходимо определить все ребра объекта, описывающие силуэт этого объекта из точки текущего источника света. Когда ребра найдены, можно создать и спроецировать теневой объем. В местах, где ребра объекта пересекают конус света от источника в данной сцене, отбрасывается тень. Представьте себе луч света от карманного фонарика, но не заливающий сцену светом, а использующий объект для отбрасывания тени на сцену. <a href="http://software.intel.com/articles/content/ru-ru/2325/fig1.htm" target="_blank">Рис. 1</a> проливает немного света на эту концепцию (каламбур умышленный). После определения силуэтных ребер формируются новые полигоны путем продления граней в направлении, указанном текущим источником света. Совокупность этих полигонов обозначается термином «теневой объем» (shadow volume). Правильное сочетание полученного объема и операций с буфером шаблонов позволяет сформировать тени и разместить их на сцене.</p>
<p><a href="http://software.intel.com/articles/content/ru-ru/2325/fig2.htm" target="_blank"><img src="http://software.intel.com/file/9236" alt="Click for larger view of the stencil buffer" width="149" height="92" /></a><br /> <a href="http://software.intel.com/articles/content/ru-ru/2325/fig2.htm" target="_blank">Рис. 2 — увеличить </a></p>
<h2>Увеличение и уменьшение буфера шаблонов</h2>
<p>Сначала необходимо отрисовать всю сцену без учета затенения. Фокус в том, чтобы дважды отрисовать на сцене теневой объем (оба раза в буфер невидимых объектов). Первый раз объем рисуется на сцене путем увеличения значения буфера шаблонов для каждого пикселя, прошедшего проверку по Z-координате глубины. Затем необходимо сменить режим отбрасывания невидимых полигонов (cull mode) графической карты на отбрасывание передних ребер и повторно отрисовать объем. Буфер шаблонов уменьшается для каждого пикселя, который снова проходит нормальную проверку по Z-координате. Метод проиллюстрирован на <a href="http://software.intel.com/articles/content/ru-ru/2325/fig2.htm" target="_blank">Рис. 2</a>. В результате этих операций буфер шаблонов содержит положительные значения для всех пикселей, лежащих внутри объема. Это логически ведет к следующему шагу алгоритма – собственно прорисовке тени.</p>
<p>После выполнения той же серии операций для всех объектов сцены необходимо нарисовать полупрозрачный четырехугольник (alpha-blended quad) во весь экран. Графическая карта настраивается на отрисовку только тех пикселей, для которых в буфере шаблонов содержится положительное значение. В результате на сцене появляются задуманные тени. Далее необходимо очистить буфер шаблонов и повторить весь процесс для следующего источника света в этой сцене. Правильная конфигурация буфера шаблонов при визуальной отрисовке теней позволяет минимизировать затраты ресурсов, связанные с очисткой буфера шаблонов. Графическая карта может устанавливать значение буфера шаблонов равным нулю каждый раз, когда пройден тест шаблона и нарисован пиксель тени. Эта операция обеспечивает заполнение буфера шаблонов нулевыми значениями, после чего он готов к обработке следующего источника света или кадра.</p>
<h2>Практическая реализация: рождение теневого объема</h2>
<p>Первый шаг к формированию теневого объема – разработка эффективного метода для определения отбрасывающих тень ребер любого объекта. Согласно нашим выводам, из множества существующих методов определения ребер самым быстрым является метод предварительного расчета данных о соседних треугольниках. Данные о соседних треугольниках хранятся в форме внутреннего списка всех соседствующих граней для каждого треугольника.</p>
<p>В Примере 1 (ниже) приведен псевдокод, описывающий алгоритм расчета данных о соседних треугольниках. Этот расчет может проводиться при загрузке модели, либо данные могут быть обработаны заблаговременно и сохранены в файловом формате. После получения таких данных приложение может эффективно определить силуэтные ребра объекта. Ребра определяются путем отбрасывания (culling) граней, не видимых с текущей позиции источника света, и затем определения ребер, лежащих вдоль границы отброшенных и неотброшенных граней.</p>
<p>В Примере 2 (еще ниже) приведен псевдокод, описывающий эту процедуру. Демонстрацию процесса отбрасывания теней можно посмотреть, загрузив <a href="http://software.intel.com/en-us/articles/code-samples-license-2?target=http%3A%2F%2Fwww.intel.com%2Fcd%2Fids%2Fdeveloper%2Fasmo-na%2Feng%2F41054.htm" target="_blank">образец приложения (.zip, 739 KB)</a>.</p>
<div class="code">
<p>// Example 1</p>
<p>For (a = every face) {</p>
<p>//Edge 0</p>
<p>If ( The first edge does not already have a neighbor ) {</p>
<p>For (b = every other face) {</p>
<p>If ( The first edge of a = any edge in b ) {</p>
<p>They are neighbors !!!</p>
<p>Quit looking for a neighbor for this edge</p>
<p>}</p>
<p>}</p>
<p>Do the same for Edge 1</p>
<p>Do the same for Edge 2</p>
<p>}</p>
<p>}</p>
</div>
<p>После определения силуэтных ребер можно рассчитать полигоны, формирующие теневой объем. Это может оказаться проще или сложнее, в зависимости от подхода. В самом простом случае необходимо создать две новых вершины в направлении света по другую сторону от вершин текущего ребра. По получившимся четырем точкам можно построить два простых треугольника. В зависимости от того, насколько далеко вынесены новые точки, могут возникнуть определенные сложности.</p>
<p>Возможны следующие три варианта реализации:</p>
<p><strong>1. Вытянуть ребра на достаточное расстояние, чтобы гарантировать их выход за пределы пирамиды видимости (это также называют методом brute force).</strong> В Примере 2 (ниже) приведен пример реализации этого метода.</p>
<div class="code">
<p>// Example 2</p>
<p>Light Direction = Direction of the light in the object's local space</p>
<p> </p>
<p>Extension Vector = Light Direction * "Infinity"</p>
<p>// Length of the shadow volume</p>
<p> </p>
<p>//////////////////////////////////////////////////////////////////////</p>
<p> </p>
<p>For ( f = Every face in the Mesh ) {</p>
<p>if ( Face Normal * Light Direction = Visible ) {</p>
<p>Face is not culled</p>
<p>} else {</p>
<p>Face is culled</p>
<p>}</p>
<p>}</p>
<p> </p>
<p>/////////////////////////////////////////////////////////////////////</p>
<p> </p>
<p>For ( f = Every face in the Mesh ) {</p>
<p>if ( f = visible ) {</p>
<p>if (( f's first edge does not have a neighbor )</p>
<p>OR (f's first edge neighbor is NOT visible)) {</p>
<p>// This is a shadow casting edge</p>
<p>Add vertex 0</p>
<p>Add vertex 0 + Extension Vector</p>
<p>Add vertex 1</p>
<p>Add vertex 1 + Extension Vector</p>
<p>Add 2 faces</p>
<p>}</p>
<p>Do the same for edge 1</p>
<p>Do the same for edge 2</p>
<p>}</p>
<p>}</p>
</div>
<p>Хотя этот метод работает достаточно хорошо, необходимо отметить две проблемы, сказывающиеся на производительности. Во-первых, необходимо предусмотреть отсечение (clipping) этих полигонов на аппаратном уровне или с помощью специального кода отсечения. Это может привести к потенциальному снижению производительности. Во-вторых, сгенерированные таким образом полигоны теневого объема проникают сквозь всю геометрию сцены. Это может быть хорошо или плохо, в зависимости от степени использования теней в конкретном случае. Более подробно эта проблема рассмотрена в разделе 2.</p>
<p><strong>2. Отсекать вершины теневого объема при контакте с геометрией сцены.</strong></p>
<p><a href="http://software.intel.com/articles/content/ru-ru/2325/fig3.htm" target="_blank"><img src="http://software.intel.com/file/9238" alt="" width="150" height="118" /></a><br /> <a href="http://software.intel.com/articles/content/ru-ru/2325/fig3.htm" target="_blank">Рис. 3 — увеличить </a></p>
<p>Несколько слов по поводу отсечения по геометрии (Clipping to Geometry)</p>
<p>Этот подход полезен в том случае, если тени генерируются не для каждого объекта сцены. Пример использования этого метода приведен на <a href="http://software.intel.com/articles/content/ru-ru/2325/fig3.htm" target="_blank">Рис. 3</a>. Например, если объект находится с одной стороны стены, а при текущем положении камеры видна и другая сторона этой стены, тень объекта обычно проникает сквозь стену (если вы пользуетесь методом № 1). Это не создаст никаких проблем в том случае, если сама стена также отбрасывает тень.</p>
<p>При использовании этого метода зритель не увидит никаких артефактов - при условии, что тень отбрасывают все объекты сцены. В данном примере, если приложение не создает тени для стен, тени от каждого объекта должны быть отсечены по плоскости стены, чтобы избежать появления артефактов. Учтите, что при использовании метода отсечения по сцене (scene-clipping), если в стене есть отверстие, одного этого метода будет недостаточно, чтобы позволить тени проникнуть сквозь отверстие. Для этого потребуются дополнительные вычисления.</p>
<p><strong>3. Отсечение теневого объема по пирамиде видимости</strong></p>
<p>Этот подход представляет собой вариацию на тему описанного выше метода вытягивания ребер (edge-extension). Данный метод позволяет избежать падения производительности, возникающего из-за выполнения отсечения только с помощью аппаратных средств. Однако этот метод сопряжен с теми же проблемами, что и предшествующий.</p>
<p>Практическая реализация: движемся дальше</p>
<p>После того, как объем сгенерирован и сохранен в памяти, начинается самое интересное. Как мы упоминали при общем обзоре алгоритма, объем необходимо полностью отрисовать только в буфер шаблонов; никакая информация о цветах на экран не выводится.</p>
<p>В Примере 3 (ниже) показана реализация соответствующих настроек режима рендера (renderstate) в Direct3D. Полигоны отрисовываются в режиме плоского затенения (flat shading), чтобы не тратить циклы видеокарты на затенение по Гуро (Gouraud shading) с плавными цветовыми переходами для поверхностей, которые не будут отображаться на экране. Значения буфера шаблонов увеличиваются для каждого пикселя, отрисованного видеокартой за этот проход.</p>
<p>И вот, стоило вам поверить, что отрисовка объема уже позади, как приходится снова производить еще один проход рендеринга на тех же полигонах. На этот раз вам придется перевернуть все мироздание с ног на голову, и заодно поменять режим отбрасывания невидимых граней. В Примере 3 (Example 3 ниже) показана реализация в Direct3D настроек для правильного выполнения второго прохода рендеринга. Обратите внимание на изменения в функциях буфера шаблонов, а также на смену режима отбрасывания невидимых граней. Затем объем отрисовывается в буфер шаблонов так же, как и при первом проходе, но на этот раз значения буфера шаблонов уменьшаются, а не увеличиваются. Не забудьте вернуть правильные значения буфера глубины (z-buffer), буфера шаблонов и режима отбрасывания невидимых граней (cullmode) перед переходом к следующей сцене.</p>
<div class="code">
<p>// Example 3</p>
<p>//Draw the volume opening side</p>
<p>dev-&gt;SetRenderState(D3DRENDERSTATE_STENCILPASS, D3DSTENCILOP_INCR);</p>
<p>dev-&gt;SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_CCW);</p>
<p>dev-&gt;DrawIndexedPrimitive</p>
<p>(</p>
<p>D3DPT_TRIANGLELIST,</p>
<p>D3DFVF_VERTEX,</p>
<p>VtxPool,</p>
<p>vnum,</p>
<p>FaceList,</p>
<p>fnum,</p>
<p>0</p>
<p>);</p>
<p> </p>
<p>//Draw the volume closing side</p>
<p>dev-&gt;SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_CW);</p>
<p>dev-&gt;SetRenderState(D3DRENDERSTATE_STENCILPASS, D3DSTENCILOP_DECR);</p>
<p>dev-&gt;DrawIndexedPrimitive</p>
<p>(</p>
<p>D3DPT_TRIANGLELIST,</p>
<p>D3DFVF_VERTEX,</p>
<p>VtxPool,</p>
<p>vnum,</p>
<p>FaceList,</p>
<p>fnum,</p>
<p>0</p>
<p>);</p>
</div>
<p>Приложение повторяет формирование и отрисовку объема для каждого отбрасывающего тень объекта, для текущего источника света, и только после этого отрисовывает собственно тень. Это не только увеличивает производительность (поскольку, как мы скоро увидим, отрисовка «настоящих» теней может потребовать очень больших затрат системных ресурсов), но и позволяет избежать артефактов – участков многократного падения освещенности в тенях.</p>
<p>На данном этапе можно отрисовывать видимое изображение тени. Принцип очень прост. Во весь экран рисуются два больших серых полупрозрачных треугольника. Операции с шаблонами настраиваются таким образом, чтобы рисовать только пиксели, которым в буфере шаблонов соответствует положительное значение. В Примере 4 (ниже) показаны переменные, описывающие режимы рендера (renderstates) для выполнения данной операции.</p>
<div class="code">
<p>// Example 4</p>
<p>static D3DTLVERTEX box[4];</p>
<p>static WORD box_faces[6] = {0,2,1,0,3,2};</p>
<p>static bool first = true;</p>
<p>static DWORD color = 0x00E0E0E0;</p>
<p> </p>
<p>m_dev-&gt;SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_DESTCOLOR);</p>
<p>m_dev-&gt;SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);</p>
<p>m_dev-&gt;SetRenderState(D3DRENDERSTATE_STENCILFUNC, D3DCMP_LESSEQUAL);</p>
<p>m_dev-&gt;SetRenderState(D3DRENDERSTATE_STENCILPASS, D3DSTENCILOP_ZERO);</p>
<p> </p>
<p>if (first)</p>
<p>{</p>
<p>first = false;</p>
<p>Zero Memory for vertices</p>
<p>Assign 4 vertices to the 4 corners of your screen</p>
<p>}</p>
<p> </p>
<p>m_dev-&gt;DrawIndexedPrimitive(D3DPT_TRIANGLELIST, D3DFVF_TLVERTEX,</p>
<p>box, 4, box_faces, 6,</p>
<p>D3DDP_DONOTCLIP);</p>
</div>
<h2>Свет и тьма: за и против</h2>
<p>Отбрасывание теней в реальном времени в интерактивных трехмерных средах с помощью представленных в данной статье методов имеет свои преимущества и недостатки. В этом разделе мы рассмотрим и положительные, и отрицательные аспекты нашего метода. К положительным относится значительное увеличение реалистичности без манипуляций с текстурами или неоправданного падения скорости рендеринга. Среди отрицательных аспектов – вопросы поддержки буфера шаблонов, ограничение скорости заполнения сцены (fillrate), резкие краями теней, мелкие аномалиями полигонов и трудности с продвинутым управлением сценами.</p>
<p>Наиболее существенным преимуществом отбрасывания теней в реальном времени является значительное повышение реалистичности изображения. При полноценном отбрасывании теней вся сцена выглядит реалистично, при любом количестве полигонов и объектов. Возможно создание полностью динамических сцен без предварительных расчетов освещения (за исключением упоминавших выше данных о соседних треугольниках). Объекты также могут затенять сами себя, чего нелегко добиться путем наложения текстуры в связи с необходимостью интенсивных расчетов и многочисленных операций текстурирования.</p>
<p>Снижение необходимого для сцены числа проходов текстурирования является еще одним существенным преимуществом метода отбрасывания теней. Если тени строятся на основе текстур, как описано в предыдущих частях публикации, модификации текстуры и проходы рендера, необходимые для построения теней в сцене со множеством объектов, становится многочисленными и невероятно сложными. Производительность аппаратных графических ускорителей при рендеринге текстур на разных чипсетах непредсказуема. Метод отбрасывания теней больше привязан к скорости заполнения сцены, а этот показатель проще поддается оценке при программировании для широкого спектра ускорителей.</p>
<p>При всех своих достоинствах, отбрасывание теней, как и многие новые технологии, имеет и свою теневую сторону (на этот раз каламбур родился случайно). Основная проблема – зависимость от поддержки аппаратными графическими средствами 8-битного буфера шаблонов. В то время, когда были написаны коды примеров, этот фактор был особенно актуален. Однако, глядя в будущее, можно предположить, что поддержка 8-битных буферов шаблонов станет стандартом среди графических ускорителей нового поколения. Существенное значение также имеет скорость заполнения сцены, так как при отбрасывании теней количество используемых в расчетах полигонов резко возрастает. Рендеринг теней легко может стать критическим параметром, ограничивающим производительность приложения. Единственный положительный момент заключается в том, что больше циклов процессора может быть потрачено на выполнение других частей приложения без снижения частоты кадров ниже уровня, достигнутого при рендеринге теней.</p>
<p>Меньшие сложности связаны с формированием «резких» теней, что является побочным эффектом применяемого метода. Поскольку тени формируются ребрами полигонов, их граница абсолютно четкая. Во многих ситуациях «мягкие» тени, затухающие или рассеивающиеся по краям, лучше соответствуют освещению сцены. Поскольку собственно рендеринг полигонов производится равномерно по всему экрану, операции для смягчения теней чрезвычайно трудоемки и приводят к заметному снижению скорости обработки (вплоть до полной нецелесообразности их реализации). Кроме того, если объект имеет много мелких деталей или малый размер на экране, полигоны теневого конуса могут уменьшиться до ширины в один пиксель или менее. Это приводит к появлению на экране заметных артефактов в виде разрывов или мерцания теней.</p>
<p>Последняя потенциальная проблема отбрасывания тени обусловливается сложностью продвинутого управления сценой (advanced scene management), особенно в случаях, когда освещение не ограничивается простым верхним светом (обратите внимание, что в большинстве демо-роликов, иллюстрирующих отбрасывание теней, показан только простой случай). Эта и другие проблемы более подробно рассматриваются в следующем разделе, где приводятся рекомендации по их устранению.</p>
<h2>Путь к просветлению</h2>
<p>Базовый алгоритм и общие принципы эффективного отбрасывания теней кратки и просты. Надеемся, что нам удалось представить их достаточно наглядным образом. Однако, в сущности, мы коснулись лишь основных принципов отбрасывания теней. Мы могли бы с легкостью посвятить еще с полдюжины статей дополнительным возможностям и обсуждению смежных вопросов. В завершение этой статьи мы хотели бы затронуть ряд вопросов, касающихся практической реализации данного метода, о которых вам следует помнить, приступая к любому проекту, где используется отбрасывание теней. Многие из этих вопросов являются существенными ограничениями для практического применения метода отбрасывания теней.</p>
<p>Выше мы коснулись проблемы полигонов субпиксельного размера, появляющихся из-за создания теневых объемов для насыщенных сцен или мелких объектов. Избежать этой проблемы поможет расчет и отрисовка теневых объемов с модели невидимого уровня детализации (LOD, level of detail), что также приведет к сокращению времени вычислений и рендеринга. Хотя этот метод ведет к появлению определенных артефактов, особенно в случае моделей, затеняющих самих себя, но общий результат обычно вполне приемлем. Кроме того, этот метод значительно быстрее и позволяет избавиться от неприятных артефактов, часто возникающие при визуализации объектов субпиксельного размера. Большая часть системных затрат на отбрасыванием теней от упрощенных моделей может быть оптимизирована, если упрощенные модели используются приложением для других целей, например, для обнаружения столкновений.</p>
<p>Самая серьезная проблема, связанная с отбрасыванием теней, касается вопросов сцены и геометрии. Возможно, вы замечали, что в большинстве примеров отбрасывания теней метод демонстрируется с использованием одного верхнего источника света и неподвижной камеры. Это ловко задуманный способ вызвать восхищение зрителя (и будущего программиста), не учитывающего дополнительные проблемы при изменении точки зрения и источника света. Рано или поздно, во время или после просмотра демо, программист может задаться вопросом: «А что если камера находится внутри теневого объема?» Алгоритм отбрасывания тени основан на том, что луч, направленный от наблюдателя в любую затененную точку сцены, должен пройти и через переднюю, и заднюю сторону объема. Когда объем приближается к передней плоскости, этот эффект теряется. По сути, пользователь остается один на один с недостатками реализации теней.</p>
<p><a href="http://software.intel.com/articles/content/ru-ru/2325/fig4.htm" target="_blank"><img src="http://software.intel.com/file/9240" alt="" width="150" height="55" /></a><br /> <a href="http://software.intel.com/articles/content/ru-ru/2325/fig4.htm" target="_blank">Рис. 4 — увеличить </a></p>
<h2>Покрывание теневого объема по передней плоскости (Near Plane)</h2>
<p>Наше решение этой проблемы основано на «покрывании» (capping) теневого объема в каждом случае обнаружения данной ситуации. Чтобы реализовать данный эффект, геометрия объекта была преобразована в двухмерный вариант и затем трансформирована на переднюю плоскость, идеально покрывая открытый объем. Наглядный пример изображен на <a href="http://software.intel.com/articles/content/ru-ru/2325/fig4.htm" target="_blank">Рис. 4</a>.</p>
<p>Активное отсечение невидимых объектов в пирамиде видимости и в сцене высокого уровня также может привести к проблемам генерирования теней. Даже если геометрия и источники света находятся вне текущей пирамиды видимости, тени от геометрии все же могут попадать в пределы видимой сцены. Например, когда теневой объем приближается к параллельной плоскости земли, он может вытягиваться на огромное расстояние до фактического контакта с землей. Этот фактор следует так или иначе учитывать в менеджере сцены (scene manager), в зависимости от конкретного приложения. К возможным решениям относится ограничение расстояния падения тени (чтобы упростить отбрасывание невидимых объектов в менеджере сцены), а также проведение простых проверок, чтобы определить, не может ли какой-либо элемент затенить видимую сцену. Ошибки в реализации этого аспекта могут привести к появлению внезапно появляющихся теней от объектов, которые слишком поздно были распознаны как имеющие тень.</p>
<p>Передняя плоскость пирамиды видимости также может порождать подобные сложности. Даже если предположить, что приложение не дает объектам проникать сквозь видимую переднюю плоскость, все-таки существует частный случай, когда геометрия проникает сквозь невидимую переднюю плоскость, но при этом направление света приводит к тому, что теневой объем попадает в поле обзора. Это также создает ситуацию, в которой отдельные пиксели могут лежать за пределами обеих сторон объема, что приводит к появлению нежелательных эффектов. Распознавание и исправление таких ситуаций гораздо сложнее, чем при сценарии capping, вследствие пересечения с передней плоскостью. Одно из возможных решений – создание нового силуэта для отбрасывания тени с учетом передней плоскости. Другой вариант решения – предотвратить возникновение таких ситуаций на уровне менеджера сцены. Этот путь может привести к появлению внезапно появляющихся теней, но в то же время он обычно оказывается более простым.</p>
<h2>Спецэффекты на основе теней</h2>
<p>Алгоритм отбрасывания теней является источником не только потенциальных проблем, но и новых возможностей для спецэффектов. Так, одним из простых дополнений к алгоритму может стать окрашивание теней, что позволяет создавать чрезвычайно реалистичные или поразительные визуальные эффекты. Меняя цвет поверхности пересечения, показанный в наших примерах как базовый серый, можно получить участки теней с яркими цветами или замысловатыми текстурами. Этот эффект можно использовать для получения точных цветов тени в средах с многочисленными цветными источниками света, или даже для создания зловещих потусторонних эффектов, когда тени кажутся царством ужаса и тьмы.</p>
<p>Нигде не сказано, что для создания теней обязательно использовать именно метод теневых объемов. Выбирая режим альфа-смешивания видимых объектов (alpha blend mode) или даже подбирая текстуры, можно создавать интересные эффекты направленных лучей света, прожекторов или вспышек. Такой метод эффективен при выборе аддитивных режимов смешивания для перекрывающих полигонов, при этом в большей степени создаются реалистичные эффекты наложения освещения, а не теней.</p>
<h2>Об авторах</h2>
<p>Джейсон Бестимт (Jason Bestimt) окончил Технический Университет штата Виржиния (Virginia Tech) и начала работу в группе по связям с разработчиками трехмерных приложений. Недавно он присоединился к команде студии Firaxis Games, работающей над новыми продуктами компании.</p>
<p>Брайнт Фрайтаг (Bryant Freitag) является специалистом по прикладному программированию (Application Engineer) в Отделе по связям с разработчиками корпорации Intel. Если он не занят оптимизацией, анализом и вообще своей «настоящей» работой, то отдает все силы совершенствованию видеоигр на благо всего человечества. Похоже, для этого ему и самому приходится много играть.</p> ]]></description>
      <link>http://software.intel.com/ru-ru/articles/real-time-shadow-casting-using-shadow-volumes/</link>
      <pubDate>Wed, 04 Feb 2009 13:00:00 -0800</pubDate>
      <comments>http://software.intel.com/ru-ru/articles/real-time-shadow-casting-using-shadow-volumes/#comments</comments>
      <guid isPermaLink="true">http://software.intel.com/ru-ru/articles/real-time-shadow-casting-using-shadow-volumes/</guid>
      <category>Сообщество разработчиков графических приложений</category>
    </item>
  </channel></rss>
