<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated on Wed, 25 Nov 2009 17:14:25 -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/code/</link>
    <description></description>
    <language>ru-ru</language>
    <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="/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="/articles/content/ru-ru/2325/fig1.htm" target="_blank">Рис. 1 — увеличить</a></p>
<h2>Построение теневого объема</h2>
<p>Внешним ребрам объекта не всегда сопоставлена соответствующая выпуклая часть данного объекта. Необходимо определить все ребра объекта, описывающие силуэт этого объекта из точки текущего источника света. Когда ребра найдены, можно создать и спроецировать теневой объем. В местах, где ребра объекта пересекают конус света от источника в данной сцене, отбрасывается тень. Представьте себе луч света от карманного фонарика, но не заливающий сцену светом, а использующий объект для отбрасывания тени на сцену. <a href="/articles/content/ru-ru/2325/fig1.htm" target="_blank">Рис. 1</a> проливает немного света на эту концепцию (каламбур умышленный). После определения силуэтных ребер формируются новые полигоны путем продления граней в направлении, указанном текущим источником света. Совокупность этих полигонов обозначается термином «теневой объем» (shadow volume). Правильное сочетание полученного объема и операций с буфером шаблонов позволяет сформировать тени и разместить их на сцене.</p>
<p><a href="/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="/articles/content/ru-ru/2325/fig2.htm" target="_blank">Рис. 2 — увеличить </a></p>
<h2>Увеличение и уменьшение буфера шаблонов</h2>
<p>Сначала необходимо отрисовать всю сцену без учета затенения. Фокус в том, чтобы дважды отрисовать на сцене теневой объем (оба раза в буфер невидимых объектов). Первый раз объем рисуется на сцене путем увеличения значения буфера шаблонов для каждого пикселя, прошедшего проверку по Z-координате глубины. Затем необходимо сменить режим отбрасывания невидимых полигонов (cull mode) графической карты на отбрасывание передних ребер и повторно отрисовать объем. Буфер шаблонов уменьшается для каждого пикселя, который снова проходит нормальную проверку по Z-координате. Метод проиллюстрирован на <a href="/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="/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="/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="/articles/content/ru-ru/2325/fig3.htm" target="_blank">Рис. 3 — увеличить </a></p>
<p>Несколько слов по поводу отсечения по геометрии (Clipping to Geometry)</p>
<p>Этот подход полезен в том случае, если тени генерируются не для каждого объекта сцены. Пример использования этого метода приведен на <a href="/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="/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="/articles/content/ru-ru/2325/fig4.htm" target="_blank">Рис. 4 — увеличить </a></p>
<h2>Покрывание теневого объема по передней плоскости (Near Plane)</h2>
<p>Наше решение этой проблемы основано на «покрывании» (capping) теневого объема в каждом случае обнаружения данной ситуации. Чтобы реализовать данный эффект, геометрия объекта была преобразована в двухмерный вариант и затем трансформирована на переднюю плоскость, идеально покрывая открытый объем. Наглядный пример изображен на <a href="/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>Fri, 29 Aug 2008 16:38:05 -0700</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>
    <item>
      <title>Интегрированные графические карты Intel® – рассчитывайте на них!</title>
      <description><![CDATA[ <p><br /> <em>Название этой статьи умышленно сформулировано именно так, чтобы кратко, но в то же время полно отражать ее содержание и нести сразу два смысла.</em> <br /> <br /> <em>Во-первых, интегрированные с материнской платой графические карты Intel (Intel® Integrated Graphics, IGFX) с Графическим Медиа Акселератором (Graphics Media Accelerator, GMA) занимают значительную часть рынка, причем, Intel развивает и в будущем планирует продолжить развитие этого сегмента своей продукции. Так что, определяя системные требования к вашему разрабатываемому программному продукту, то есть, решая, на каком «железе» он будет выполняться, на интегрированную графику Intel стоит рассчитывать. <br /> <br /> Во-вторых, современные интегрированные графические ядра карт Intel, о которых пойдет речь в этой статье, имеют достаточную производительность, чтобы рассчитывать на них графику игровых приложений. <br /> <br /> Оба этих утверждения мы постараемся доказать ниже. <br /> </em></p>
<p><br /> Хотя разные источники приводят слегка отличающиеся статистические данные, можно утверждать, что в 2006-2007 годах Intel с долей в сегменте рынка, превышающей 50%, занимает первое место среди производителей интегрированных графических карт для настольных компьютеров, а также лидирует «в общем зачете» производителей интегрированной графики (с учетом мобильных компьютеров) – более 35% доли сегмента рынка по данным Mercury Research*.</p>
<p><br /> При этом, в 2006-2007 годах общие поставки интегрированных графических карт по всему миру для всех производителей примерно в три раза превысили поставки неинтегрированных (дискретных) графических карт. И по прогнозам это соотношение со временем только увеличится, а именно – поставки интегрированных карт вырастут, а дискретных снизятся. Прежде всего, это произойдет за счет увеличения числа мобильных компьютеров, в которых по соображениям геометрических размеров, цены, тепловыделения и энергопотребления обычно нецелесообразно ставить отдельную графическую карту. <br /> <br /> Что означают эти цифры? Что даже если на каждый PC со встроенным видеоадаптером была дополнительно поставлена дискретная графическая карта (что маловероятно), то 2/3 современных компьютеров остаются только со встроенной графикой. Если же дискретные карты ставятся исключительно на компьютеры без интегрированного видеоадаптера, то доля компьютеров только со встроенной графикой возрастает до ¾ общего числа всех PC. <br /> <br /> Давайте посмотрим, какие чипсеты Intel представлены на рынке, и каковы их характеристики. Мы не будем упоминать уже давно выпускаемые и хорошо известные чипсеты 945G и 945GM – они основаны на графическом ядре предыдущего поколения –GMA950, в то время как абсолютное большинство современных чипсетов Intel базируется на графических ядрах нового поколения - семейства GMA 3x00. <br /> <br /> В таблице ниже приведены сравнительные «высокоуровневые» характеристики работы с 3D-графикой ядер GMA 3x00 и модели базирующихся на них чипсетов.</p>
<p> </p>
<table class="tableFormat1" border="0" cellspacing="0" cellpadding="5" width="550">
<tbody>
<tr class="tableFormat1FirstRow">
<td class="tableFormat1FirstRowCol">Графическое Ядро</td>
<td class="tableFormat1FirstRowCol">Intel® GMA 3000</td>
<td class="tableFormat1FirstRowCol">Intel® GMA 3100</td>
<td class="tableFormat1FirstRowCol">Intel® GMA X3000</td>
<td class="tableFormat1FirstRowCol">Intel® GMA X3100</td>
<td class="tableFormat1FirstRowCol">Intel® GMA X3500</td>
</tr>
<tr>
<td>Intel® Chipset</td>
<td>946GZ, Q963, Q965</td>
<td>G31, G33, Q33, Q35</td>
<td>G965</td>
<td>GM965, GL960</td>
<td>G35</td>
</tr>
<tr>
<td>Видео память</td>
<td>До 256 MB</td>
<td>До 256 MB</td>
<td>До 384 MB</td>
<td>До 384 MB</td>
<td>До 384 MB</td>
</tr>
<tr>
<td>Поддержка DirectX*</td>
<td>DirectX* 9.0c</td>
<td>DirectX* 9.0c</td>
<td>DirectX* 9.0c</td>
<td>DirectX* 10.<sup>1</sup></td>
<td>DirectX* 10.<sup>1</sup></td>
</tr>
<tr>
<td>Поддержка OpenGL</td>
<td>1.4 + Extensions</td>
<td>1.4 + Extensions</td>
<td>OpenGL 1.5</td>
<td>OpenGL 1.5</td>
<td>OpenGL 2.0</td>
</tr>
<tr>
<td>Аппаратный T&amp;L</td>
<td>НЕТ</td>
<td>НЕТ</td>
<td>ЕСТЬ</td>
<td>ЕСТЬ</td>
<td>ЕСТЬ</td>
</tr>
<tr>
<td>Поддерживаемая Шейдерная Модель</td>
<td>2</td>
<td>2</td>
<td>3.0</td>
<td>4.0<sup>2</sup></td>
<td>4.0<sup>2</sup></td>
</tr>
</tbody>
</table>
<p> </p>
<p><sup><span class="sectionBody"><sup>1 </sup>– DirectX10 –реализован на аппаратном уровне, поддержка в драйвере ожидается в первом квартале 2008 <br /> <sup>2</sup> – Шейдерная модельl 4.0 – реализована на аппаратном уровне поддержка в драйвере ожидается в первом квартале 2008 </span></sup></p>
<p>В дополнение к этой информации нужно отметить, что не только все приведенные в таблице современные чипсеты, но и 945G, относящийся к предыдущему поколению, поддерживают Windows Vista Aero*</p>
<p>Intel® GMA 3x00 с индексом «X» также поддерживают 32-битные операции с плавающей точкой для Вершинных и Пиксельных шейдеров и текстурирования.</p>
<p><br /> Но главное - аппаратная поддержка T&amp;L (преобразования и освещения вершин), а также Вершинных и Пиксельных шейдеров Модели 3.0 реализована в драйверах Intel® GMA X3х00 начиная с августа 2007. Хотя, оставлена и возможность переключения на программный T&amp;L – в некоторых случаях он работает быстрее. <br /> <br /> Как видите, возможности Intel® GMA X3x00 сравнимы с возможностям дискретных видеокарт начального и даже среднего уровня. Но возможности – это только основа потенциала видеокарты, а сам потенциал – это ее производительность.</p>
<p><strong>Что можно сказать о производительности GMA X3x00? </strong></p>
<p><br /> Прежде всего, то, что как у всякой встроенной карты, использующей для работы не только свои ресурсы, но и CPU, а также системную память, производительность сильно зависит от характеристик системы «в целом» - процессора, памяти, и конкретной материнской платы, частью которой является чипсет. Кроме того, сильное влияние на производительность карты оказывает графический драйвер. Поэтому давать оценку производительности интегрированной графики Intel «в общем», без учета специфики конкретного компьютера - некорректно. Но дать некоторые оценки – ориентиры можно. <br /> <br /> Еще в 2004 году на ixbt.com была опубликована статья, посвященная исследованию производительности интегрированных графических карт для платформы Pentium® 4. Название данной статьи говорит само за себя: «Интегрированная графика для платформы Pentium® 4: все не так уж плохо…», а результаты тестирования интегрированной графики Intel для 3D-игр приятно удивили авторов. С момента выхода статьи сменилось уже два поколения Intel GMA, появились новые производительные многоядерные процессоры Intel® Core2™ и ускорился доступ к системной памяти, что положительно сказалось на быстродействии интегрированной графической карты Intel. Так что в 2007 можно смело утверждать, что «Интегрированная Графика Intel – все совсем неплохо». <br /> <br /> GMA X3х00 с драйверами начиная с версии 14.31/15.6 (WindowsXP/Windows Vista) подходит для таких популярных игр, как Battlefield 2142*, Call of Duty 2*, Supreme Commander, Madden 2007*, Ghost Recon: Advanced Warfighter*, Unreal Tournament 2004*, World Of Warcraft*, Microsoft Flight Simulator X*, The Sims 2* (plus the expansion packs), Quake IV*, Half Life 2*, Far Cry*. <br /> Полный список самых распространенных игр, работающих на GMA X3х00 , можно увидеть на сайте <a href="http://support.intel.com/support/graphics/intelg965/sb/cs-023018.htm">http://support.intel.com/support/graphics/intelg965/sb/cs-023018.htm</a></p>
<p>Приведем сравнение производительности некоторых игр для встроенных графических карт последнего поколения (выпущенных на рынок в 2007 году): Intel G965, NVIDIA7050 и AMD* 690G (конфигурация тестовых систем- в приложении 1 в конце статьи)</p>
<p> </p>
<p><img src="http://software.intel.com/file/8721" alt="" /></p>
<p> </p>
<p><strong>А сколько кадров в секунду выдает ваше графическое приложение на Интегрированной Графике Intel®? </strong></p>
<p><br /> Если ваш ответ - «ноль», то есть, оно вообще не запускается (но работает на дискретных видеокартах), то ваши действия:</p>
<ul>
<li>Установите последнюю версию графического драйвера Intel с http://downloadcenter.intel.com (в разделе «Products»(«Продукты») выбираете нужный чипсет, затем – ОС) </li>
<li>Если ваше приложение использует Direct3D, то проверьте инициализацию D3D Device. Возможно, что, обнаружив отсутствие аппаратного преобразования и освещения вершин, приложение просто не создает D3D Device. Это не всегда правильно. Пример корректного кода инициализации DX9 Device с идентификацией Intel GMA приведен ниже - в приложении 2. Для инициализации DX9 Device сначала идет «стандартная» проверка возможностей устройства по аппаратному преобразованию и освещению: <br /> (caps.DevCaps &amp; D3DDEVCAPS_HWTRANSFORMANDLIGHT), <br /> и если они присутствуют, то ставится соответствующий флаг обработки вершин: <br /> vertexprocessingmode = D3DCREATE_HARDWARE_VERTEXPROCESSING; <br /> иначе – определяется идентификатор графической карты <br /> g_pD3D-&gt;GetAdapterIdentifier(0,0,&amp;adapterID ) <br /> и сравнением VendorId и DeviceId проверяется на соответствие современной встроенной графике Intel: <br /> if ( ( adapterID.VendorId == 0x8086 ) &amp;&amp; // Intel Architecture <br /> ( adapterID.DeviceId == 0x2A02 ) || // GM965 Device 0 <br /> ( adapterID.DeviceId == 0x29A2 ) || // G965 Device 0 <br /> ( adapterID.DeviceId == 0x27A2 ) // 945GM Device 0 <br /> ........ </li>
</ul>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>Если такое соответствие обнаружено, то ставится (а потом используется при создании DX9 Device) флаг программной обработки вершин <br /> vertexprocessingmode = D3DCREATE_SOFTWARE_VERTEXPROCESSING; <br /> и только если оказывается, что графическая карта не только не поддерживает аппаратную обработку вершин, но и не принадлежит к производительным Intel GMA, то принимается фактическое решение не создавать DX9 Device.</p>
</blockquote>
<ul>
<li>Возможно также, что ваше приложение некорректно определяет доступный объем видеопамяти – без учета того, что интегрированные карты Intel используют в качестве видеопамяти динамически выделяемую часть обычной системной памяти. Чтобы узнать действительный доступный объем видеопамяти на интегрированной графике Intel, проверяйте «локальную память» (“Local Memory”). Эта проверка вернет вам истинное значение, в то время как проверка «нелокальной памяти» (Non-Local Video Memory) покажет ноль. <br /> Для получения корректного значения доступной видеопамяти в DirectX 9 можно также использовать функцию получения доступной памяти для текстур: <br /> int AvailableMem = g_pd3dDevice-&gt;GetAvailableTextureMem() <br /> </li>
</ul>
<p><strong>Так сколько кадров в секунду выдает ваше приложение на Интегрированной Графике Intel? <br /> </strong></p>
<p>Если меньше, чем хотелось бы, то обратите внимание на следующие советы по оптимизации или конфигурации вашего приложения. <br /> Основной фактор, ограничивающий производительность современных Intel GMA, –это не скорость вычислений, а скорость заполнения (fill rate), поэтому большинство советов направлено именно на решение этой проблемы – на уменьшение числа отрисовываемых пикселей.</p>
<p> </p>
<ul>
<li>Предоставьте пользователям возможность понизить экранное разрешение вашего приложения, уменьшить качество (разрешение) текстур, отключить эффекты, требующие двухпроходной отрисовки – например, тени. </li>
<li>Сложные однопроходные шейдеры для GMA X3х00 предпочтительнее простых многопроходных шейдеров </li>
<li>Используйте аппаратный тест буфера глубины (Z-test) для уменьшения числа пикселов, посылаемых на отрисовку. Z-test пикселя проводится перед пиксельными шейдерами (при их наличии) и работает достаточно эффективно. Поэтому, по возможности, пользуйтесь автоматическим Z-test, а не манипулируйте буфером глубины напрямую в пиксельных шейдерах. <br /> <br /> Чтобы еще больше ускорить работу Z-test, можно попробовать в списке отрисовки расположить объекты в сцене в порядке удаления от зрителя. Но если это переупорядочивание объектов приведет к промахам в кеше текстур или к дополнительным сменам состояния DirectX или OpenGL, а значит, и к падению общей производительности, то от полного переупорядочивания стоит отказаться. Выход – объединить объекты в группы по общим текстурам и\или состояниям и, по возможности, изменить порядок следования групп в сцене - «сначала ближние, потом дальние». Но если пространственная сложность сцены невелика и используются только простые шейдеры с одной текстурой, то повышения производительности от подобной сортировки ожидать не стоит. </li>
<li>Также при использовании сложных пиксельных шейдеров для минимизации количества фактически отрисовываемых пикселей, попробуйте использовать двухпроходную обработку (rendering): сначала только с Z test (с отключенной записью в буфер цветов и выполнением пиксельных шейдеров), а потом уже с включенной отрисовкой. Однако, выигрыш производительности не гарантируется, так как может оказаться, что «стоимость» двух проходов окажется выше, чем у однопроходной обработки пиксельного шейдера. </li>
<li>Используйте проверку на загораживание (Occlusion Query), поддерживаемую GMA X3х00 в D3D. Такая проверка используется для определения числа потенциально видимых пикселей объекта при помощи рисования не самого объекта, а его ограничивающего объема. Если Occlusion Query возвращает ноль, это значит, что ни один пиксель ограничивающего объема, а значит, и самого объекта, не был виден, следовательно, объект можно не рисовать. Такая проверка максимально эффективна для сложных объектов с большим количеством вершин. Для дополнительной информации обратитесь к справке по функции IDirect3DDevice9::CreateQuery() </li>
<li>Для достижения максимального эффекта комбинируйте вышеописанные приемы. <br /> Например, при использовании двухпроходной обработки в первом проходе только с Z- test можно переупорядочить объекты сцены «от ближних к дальним». Так как этот проход не включает отрисовку на экран, изменение порядка объектов не внесет никаких дополнительных накладных расходов на смену состояния DirectX или OpenGL или загрузку-выгрузку текстур. Кроме того, к этому же проходу для сложных объектов можно добавить Occlusion Query, по результатам которого исключить невидимые объекты из финального прохода – отрисовки. </li>
</ul>
<div class="sectionHeading">Дополнительная информация</div>
<p>В заключение отметим, что, конечно же, эта статья не содержит всей информации о постоянно развивающейся Интегрированной Графике Intel. Поэтому рекомендуем обратиться за дополнительной информацией:</p>
<p> </p>
<ul>
<li>Руководство Разработчика для Intel® GMA 3000 и X3000 (Intel® GMA 3000 and X3000 Developer's Guide) - <a href="/ru-ru/articles/intel-gma-3000-and-x3000-developers-guide">/ru-ru/articles/intel-gma-3000-and-x3000-developers-guide</a> </li>
<li>Краткий Справочник по Интегрированной Графике Intel (Quick Reference Guide to Intel® Integrated Graphics) - <a href="/ru-ru/articles/quick-reference-guide-to-intel-integrated-graphics">/ru-ru/articles/quick-reference-guide-to-intel-integrated-graphics</a> </li>
<li>Форум Разработчиков Integrated Graphics Software Development (английский язык) <a href="/en-us/forums/user-community-for-intel-graphics-technology">/en-us/forums/user-community-for-intel-graphics-technology</a> </li>
</ul>
<p><br /> <br /> <br /> <strong>Приложение 1. Конфигурация оборудования для тестов игр</strong></p>
<p> </p>
<ul>
<li>Intel System: Processor Intel ® core ™ 2 Duo E6700 Dual channel DS Micron* 2GB (2x1GB) @DDR2-667 5-5-5-15 with Integrated Intel GMAХ3000 graphics + Seagate* 320GB NCQ SATA2 (BIOS:0023, Graphics: 1268, Sound: 5274) </li>
<li>AMD System: AMD * Athlon64 X2 6000+ 3.00G/1000/2x1MB on Asus M2A-VM Dual channel DS Micron 2GB (2x1GB) DDR2-800 5-5-5-18 with Integrated ATI X1250 graphics + Seagate 320GB NCQ SATA2 (BIOS:901, Graphics: ATI 7.7, Sound: 5386) </li>
<li>NVIDIA System: AMD* Athlon64 X2 6000+ 3.00G/1000/2x1MB on BIOStar TF7050-M2 (nVidia C68) Dual channel DS Micron 2GB (2x1GB) DDR2-800 5-5-5-18 with Integrated nVidia 7050PV graphics + Seagate 320GB NCQ SATA2 (BIOS:07/16, Graphics: NV 7.15.11.6222, Sound: 6.01.5377) </li>
<li>OperatingSystem: Windows* Vista* Ultimate RTM Build 6000 NTFS </li>
</ul>
<p><br /> <br /> <strong>Приложение 2. Пример корректной инициализации флага обработки вершин для создания D3D Device</strong></p>
<p> </p>
<pre><pre>DWORD SetVertexProcessingMode( LPDIRECT3D9 pD3D ) <br />{ <br />DWORD vertexprocessingmode; // vertex processing mode <br />D3DCAPS9 caps; // Device CAPs structure <br />D3DADAPTER_IDENTIFIER9 adapterID; // Used to store device info <br /><br />// Retrieve device capabilities <br />if( g_pD3D-&gt;GetDeviceCaps( 0, D3DDEVTYPE_HAL, &amp;caps ) != D3D_OK ) <br />{ <br />return E_FAIL; // exit if reading caps fails... <br />} <br /><br />// Check if hardware T&amp;L is supported... <br />// - The D3DDEVCAPS_HWTRANSFORMANDLIGHT capability should <br />// be enabled for GMA X3000 <br />if ( ( caps.DevCaps &amp; D3DDEVCAPS_HWTRANSFORMANDLIGHT ) != 0 ) <br />{ <br />vertexprocessingmode = D3DCREATE_HARDWARE_VERTEXPROCESSING; <br />} <br />else <br />{ <br />// Check vendor and device ID and enable software vertex <br />// processing for Intel(R) Graphics... <br /><br />// Gather the primary adapter's information... <br />if( g_pD3D-&gt;GetAdapterIdentifier(0,0,&amp;adapterID ) != D3D_OK ) <br />{ <br />return E_FAIL; <br />} <br /><br />if ( ( adapterID.VendorId == 0x8086 ) &amp;&amp; // Intel Architecture <br />( adapterID.DeviceId == 0x2972 ) || // 946GZ Device 0 <br />( adapterID.DeviceId == 0x2973 ) || // 946GZ Device 1 <br />( adapterID.DeviceId == 0x27A2 ) || // 945GM Device 0 <br />( adapterID.DeviceId == 0x27A6 ) || // 945GM Device 1 <br />( adapterID.DeviceId == 0x2772 ) || // 945G Device 0 <br />( adapterID.DeviceId == 0x2776 ) || // 945G Device 1 <br />( adapterID.DeviceId == 0x2992 ) || // Q965/Q963 Device 0 <br />( adapterID.DeviceId == 0x2993 ) || //Q965/Q963 Device 1 <br />( adapterID.DeviceId == 0x29B2 ) || // Q35 Device 0 <br />( adapterID.DeviceId == 0x29B3 ) || //Q35 Device 1 <br />( adapterID.DeviceId == 0x29C2 ) || //G33/G31Device 0 <br />( adapterID.DeviceId == 0x29C3 ) || //G33/G31 Device 1 <br />( adapterID.DeviceId == 0x29D2 ) || //Q33 Device 0 <br />( adapterID.DeviceId == 0x29D3 ) //Q33 Device 1 <br /><br />{ <br />vertexprocessingmode = D3DCREATE_SOFTWARE_VERTEXPROCESSING; <br />} <br />else <br />{ <br />// Chipset does not meet minimum requirements... <br />return E_MINSPEC; <br />} <br />} <br />return vertexprocessingmode; <br />}</pre>
<br /><br /><br /><br /></pre>
* Источник: Mercury Research; Bear, Stearns &amp; Co. Inc. <br /> ]]></description>
      <link>http://software.intel.com/ru-ru/articles/61043</link>
      <pubDate>Wed, 09 Apr 2008 18:12:13 -0700</pubDate>
      <comments>http://software.intel.com/ru-ru/articles/61043#comments</comments>
      <guid isPermaLink="true">http://software.intel.com/ru-ru/articles/61043</guid>
      <category>Сообщество разработчиков графических приложений</category>
    </item>
  </channel></rss>