<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
  <title>XNA</title>
  <link>http://xna.gamedev.ru/</link>
  <description>XNA</description>
  <language>ru</language>
  <generator>http://skif.qrim.ru/</generator>
  <image>
    <url>http://www.gamedev.ru/_img/imggen/?s=196</url>
    <title>XNA</title>
    <link>http://xna.gamedev.ru/</link>
  </image>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=5436</guid>
  <pubDate>Wed, 23 Mar 2011 21:12:33 GMT</pubDate>
  <title>&quot;Guns, Balls &amp; Walls&quot; - Windows Phone 7 game preview 2</title>
  <link>http://xna.gamedev.ru/blog/?id=5436</link>
  <description>
&lt;p&gt;&lt;object width=&quot;640&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/BSSHp9zlpDg&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=ru_RU&amp;amp;feature=player_embedded&amp;amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/BSSHp9zlpDg&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=ru_RU&amp;amp;feature=player_embedded&amp;amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; allowfullscreen=&quot;true&quot; allowScriptAccess=&quot;always&quot; width=&quot;640&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;br /&gt;читать оригинальный блог:
&lt;br /&gt;&lt;a href=&quot;http://dtimofeev.blogspot.com/2011/03/guns-balls-walls-windows-phone-7-game_23.html&quot;&gt;http://dtimofeev.blogspot.com/2011/03/guns-balls-walls-windows-ph&amp;hellip; -game_23.html&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=5416</guid>
  <pubDate>Mon, 07 Mar 2011 14:41:31 GMT</pubDate>
  <title>&quot;Guns, Balls &amp; Walls&quot; - Windows Phone 7 game preview</title>
  <link>http://xna.gamedev.ru/blog/?id=5416</link>
  <category>игры</category>
  <category>Windows Phone7</category>
  <category>XNA</category>
  <description>
&lt;p&gt;
&lt;br /&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/mini_game8.jpg&quot; alt=&quot;&amp;quot;Guns, Balls &amp;amp; Walls&amp;quot; - Windows Phone 7 game preview | &amp;quot;Guns, Balls &amp;amp; Walls&amp;quot; - Windows Phone 7 game preview&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Подробности и видео в основном блоге:
&lt;br /&gt;&lt;a href=&quot;http://dtimofeev.blogspot.com/2011/03/guns-balls-walls-windows-phone-7-game.html&quot;&gt;http://dtimofeev.blogspot.com/2011/03/guns-balls-walls-windows-ph&amp;hellip; e-7-game.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;P.S. Проекту требуется музыкант.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=5364</guid>
  <pubDate>Sat, 12 Feb 2011 23:09:20 GMT</pubDate>
  <title>Вышла новая библиотека GPF для платформ Windows и Windows Pfone 7</title>
  <link>http://xna.gamedev.ru/blog/?id=5364</link>
  <category>gpf</category>
  <category>GUI</category>
  <category>XNA</category>
  <description>
&lt;p&gt;Библиотека предназначена для создания пользовательского интерфейса в приложениях построенных на основе XNA Game Studio 4.0 для платформ Windows и Windows Phone 7.&lt;/p&gt;
&lt;p&gt;Лицензия - FREEWARE&lt;/p&gt;
&lt;p&gt;Сайт продукта - &lt;a href=&quot;http://generalpf.ru/&quot;&gt;http://generalpf.ru/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Блог автора - &lt;a href=&quot;http://dtimofeev.blogspot.com/&quot;&gt;http://dtimofeev.blogspot.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ранее опубликованное видео:
&lt;br /&gt;&lt;a href=&quot;http://dtimofeev.blogspot.com/2010/10/xna-gengine-forms-gui.html&quot;&gt;http://dtimofeev.blogspot.com/2010/10/xna-gengine-forms-gui.html&lt;/a&gt;
&lt;br /&gt;&lt;a href=&quot;http://dtimofeev.blogspot.com/2010/10/gpf-wpf-for-xna.html&quot;&gt;http://dtimofeev.blogspot.com/2010/10/gpf-wpf-for-xna.html&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/articles/ContentPipelineOverview</guid>
  <pubDate>Mon, 17 Jan 2011 13:15:07 GMT</pubDate>
  <title>XNA Content Pipeline: Обзор</title>
  <link>http://xna.gamedev.ru/articles/ContentPipelineOverview</link>
  <comments>http://xna.gamedev.ru/forum/?id=142750</comments>
  <category>Графика</category>
  <category>content</category>
  <category>content pipeline</category>
  <category>C#</category>
  <category>XNA</category>
  <category>XNB</category>
  <category>.NET</category>
  <description>
&lt;p&gt;Большинство начинающих разработчиков-программистов (классический вариант),&amp;nbsp; поначалу, основное внимание концентрируют на коде, алгоритмах, технологиях, пытаясь создать свои движки и библиотеки. А их &amp;laquo;игры&amp;raquo; &amp;mdash; в основном, только код. Но со временем они начинают понимать, что игра &amp;mdash; это только отчасти код. И что есть ещё другая важная часть, без которой полноценной игры быть не может, &amp;mdash; контент.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;Контент (от англ. content &amp;mdash; содержимое) в данном случае &amp;mdash; это текстуры, модели, анимация, звук, музыка и т.д. То есть, наполнение игры.&lt;/p&gt;
&lt;p&gt;В контексте программирования, контент &amp;mdash; это различные данные, которые программа должна загрузить в память (из файла), чтобы позже с ними производить разные действия (рисовать на экране, воспроизводить).&lt;/p&gt;
&lt;p&gt;В этой статье речь пойдет о том, как в &lt;a href=&quot;http://www.gamedev.ru/code/terms/XNA&quot; title=&quot;XNA&quot;&gt;XNA&lt;/a&gt; принято работать с контентом, а конкретнее &amp;mdash; о XNA Content Pipeline.&lt;/p&gt;
&lt;p&gt;==XNA Content Pipeline==&lt;/p&gt;
&lt;p&gt;Большинство разработчиков&amp;nbsp; представляет себе загрузку моделей, текстур или другого контента как метод или функцию, например, LoadTexture или LoadModel. Такие функции ориентированы на какой-то определенный формат, знают, как прочитать из него данные и как их впоследствии разместить в памяти, чтобы программа могла с ними дальше работать. Код этой функции содержится в самой программе (игре). Программа сообщает функции имя файла, а функция соответственно выполняет загрузку.&lt;/p&gt;
&lt;p&gt;В XNA по умолчанию подход&amp;nbsp; совсем другой. В XNA в этом месте за дело берется XNA Content Pipeline. Content Pipeline можно перевести на русский язык как &amp;laquo;конвейер контента&amp;raquo; (имеется в виду, система, в которой данные проходят последовательно несколько стадий, на каждой из которых над данными выполняется какое-то действие).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;XNA Content Pipeline&lt;/b&gt; &amp;mdash; это инструмент в форме сборок .net (библиотек) и, следовательно, .net классов. Этот инструмент в первую очередь интегрируется в среду разработки Visual Studio, но помимо этого представлен и классами на стороне библиотеки времени исполнения XNA (XNA runtime). Другими словами, XNA Content Pipeline &amp;mdash; это общее название для классов, которые интегрируются в среду разработки, и классов, которые используются в конечной программе для загрузки контента.&lt;/p&gt;
&lt;p&gt;Изложенное возможно звучит непонятно, но если рассмотреть далее идеи и устройство системы в деталях – все станет на свои места.&lt;/p&gt;
&lt;p&gt;==Основная идея==&lt;/p&gt;
&lt;p&gt;Конечно, абсолютно точно можно сказать, какие же цели преследовались, когда создавался XNA Content Pipeline, могут только разработчики XNA. Но можно попробовать сделать собственные выводы, исходя из того, что реально получилось, и того, как оно устроено. &lt;/p&gt;
&lt;p&gt;Итак, что дает XNA Content Pipeline.&lt;/p&gt;
&lt;p&gt;В первую очередь, часть работы перенесена на время компиляции. В отличие от варианта с единым методом LoadTexture, который все действия выполняет во время работы программы, с XNA Content Pipeline часть работы выполняется в среде разработки во время компиляции. Конкретнее, на этапе компиляции данные извлекаютя (import) из первоначального формата (x, fbx и т.д. &amp;mdash; для моделей; png, bmp, dds, jpg и т.д. &amp;mdash; для изображений; wav, mp3 &amp;mdash; для аудио), кроме того, для каждого типа данных (уже независимо от первоначального файлового формата) выполняется предварительная обработка (processing). А уже во время выполнения (run-time), приложению не приходится работать с разными форматами, и выполнять все эти действие, потому что результатом работы Content Pipeline на этапе компиляции есть файлы внутреннего формата (XNB), которые, по сути, есть бинарно сериализованными классами приложения (что означает &amp;mdash; минимум затрат времени при загрузке). &lt;/p&gt;
&lt;p&gt;Исходя из этого, мы сразу получаем и вторую идею &amp;mdash; возможность отделить остальную логику приложения от того, в каком формате контент нам был предоставлен первоначально. Только самая первая часть &amp;laquo;конвейера&amp;raquo; знает о файловых форматах. И после того, как на первой стадии данные извлекутся из файла, они будут в едином представлении, которое зависит от типа самих данных, а не от первоначального формата. &lt;/p&gt;
&lt;p&gt;И, конечно же, в XNA Content Pipeline предусмотрена расширяемость. В этом всем не было бы смысла, если бы мы не могли заставить работать систему с теми форматами, которые нам нужны, и выполнять свою специфическую обработку. &lt;/p&gt;
&lt;p&gt;==Подробней&amp;nbsp; об устройстве XNA Content Pipeline==&lt;/p&gt;
&lt;p&gt;Как выше было сказано, в первую очередь всю систему можно разделить на две части: ту, что интегрируется в студию и выполняет свою работу во время компиляции XNA проекта, и ту часть (Content Manager), которая работает во время выполнения XNA приложения (классы и методы, которые мы используем в коде нашей игры).&lt;/p&gt;
&lt;p&gt;Для наглядности &lt;a href=&quot;http://blogs.msdn.com/b/xna/archive/2006/08/29/730168.aspx&quot;&gt;позаимствуем диаграмму с блога&lt;/a&gt; команды разработчиков XNA. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/xfcpdrawing.png&quot; alt=&quot;XNAPipelineArticle_p1 | XNA Content Pipeline: Обзор&quot; /&gt;
&lt;br /&gt; 
&lt;br /&gt;Спускаясь на уровень глубже, этап компиляции можно разделить на такие части: импорт, предварительная обработка, сериализация в XNB.&lt;/p&gt;
&lt;p&gt;На этапе импорта (content importer) из конкретного файлового формата данные извлекаются и трансформируются во внутреннее представление (content DOM). Как уже упоминалось выше, представление зависит от типа данных, а нет от файлового формата. Так данные из .x файла будут представлены точно так же, как и данные из .fbx (вертексы с текстурными координатами, нормалями и т.д.), так как оба формата содержать 3D-модель. &lt;/p&gt;
&lt;p&gt;На втором этапе (content processor) над данными может проводиться дополнительная обработка, какая именно &amp;mdash; зависит от ваших потребностей. Но в любом случае, даже если с данными ничего делать не нужно, то на этом этапе как минимум определяется, в виде какого класса данные будут представлены в приложении. Хорошим примером предварительной обработки, может быть генерация карт освещения (lightmaps) или&amp;nbsp; генерация упрощенных LOD-моделей на основе оригинальной. Или же, если вам просто нужно преобразовать данные модели в какой-то свой особый тип (вместо стандартного Model, например).&lt;/p&gt;
&lt;p&gt;После того, как тип (класс) для данных определен, Content Pipeline создает экземпляр данного типа, заполняет его данными, и выполняет сериализацию этого экземпляра в файл формата XNB.&lt;/p&gt;
&lt;p&gt;А вот уже во время выполнения приложения, происходит меньше всего действий. Тут по требованию программиста (благодаря коду, который он написал) Content Manager пытается открыть соответствующий XNB файл и десериализовать экземпляр соответствующего класса. &lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;class&lt;/span&gt; Game1 : Microsoft.Xna.Framework.Game
{    
       Model myPrettyModel;

       &lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; LoadContent&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
       {
               myPrettyModel =     Content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Model&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;myPrettyModelFile&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
       }
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Сам формат XNB не задокументирован. Он просто не рассчитан на модификацию, к тому же, по словам разработчиков из команды XNA, часто меняется. Но как они сами говорят, в формате нет ничего секретного, и при желании можно взять Reflector (посмотреть код классов, которые осуществляют генерацию файлов) или любой hex-редактор и посмотреть, что же и как туда пишется. И если мы это сделаем, то увидим, что помимо &amp;laquo;магических чисел&amp;raquo; &amp;mdash; это просто последовательность из имен типов (классов) и бинарно сериализованных экземпляров этих типов (как уже было сказано).&lt;/p&gt;
&lt;p&gt;Таким образом, когда вы вызовете generic метод ContentManager.Load для класса Model, класс ContentManager попытается десериализовать из указанной вами единицы контента (из XNB файла) экземпляр класса Model. И если во время компиляции был выбран правильный соответствующий модуль обработки (content processor), то вы получите свою модель.&lt;/p&gt;
&lt;p&gt;==Расширение XNA content pipeline==&lt;/p&gt;
&lt;p&gt;В первую очередь, возможность модификации обеспечивается тем, что два основных этапа &amp;mdash; импорт и обработка &amp;mdash; вынесены в модули. Именно поэтому на диаграмме эти узлы представлены несколькими экземплярами. Если вы ещё не догадались, для каждого формата существует свой отдельный content importer, а для каждого вида данных и каждого конечного типа &amp;mdash; свой content processor.&lt;/p&gt;
&lt;p&gt;То, какую именно комбинацию из двух модулей нужно использовать для каждой конкретной единицы контента, задает разработчик прямо из среды разработки (что и есть одним из элементов интеграции).&lt;/p&gt;
&lt;p&gt;Помимо этого, есть также возможность добавлять свои типы времени выполнения. Так скажем, если вам не нравится стандартный класс Model, то вы можете описать свой, при этом обеспечив для него поддержку со стороны Content Pipeline. Правда, для этого вам придется создать свой content processor, но это уже тема для отдельной статьи (про TypeWriter, TypeReader, автоматическую сериализацию и написание своих модулей).&lt;/p&gt;
&lt;p&gt;==Интеграция с Visual Studio==&lt;/p&gt;
&lt;p&gt;XNA Content Pipeline интегрируется в среду разработки как часть XNA Game Studio. И представляет собой отдельную папку &amp;laquo;Content&amp;raquo; в проекте XNA приложения в версии XNA 3.1. Или же отдельный проект, начиная с версии XNA 4.0. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/article_pic2_1.png&quot; alt=&quot;XNAPipelineArticle_p2 | XNA Content Pipeline: Обзор&quot; /&gt;
&lt;br /&gt; 
&lt;br /&gt;Слева на рисунке XNA 4.0 в Visual Studio 2010, справа &amp;mdash; XNA 3.1 в Visual Studio 2010.&lt;/p&gt;
&lt;p&gt;Все добавленные в такую папку (или проект) файлы расцениваются как отдельные единицы контента. И при выборе такого проекта, на панели Propeties (Свойства) отдельно отображаются параметры, связанные с XNA Content Pipeline, в том числе назначенные модули для импорта и обработки. И для конкретного модуля обработки &amp;mdash; свои специфические параметры.&lt;/p&gt;
&lt;p&gt;&lt;div style=&quot; overflow: auto; overflow-x: scroll hidden; overflow-y:hidden;&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/article_pic2_2.png&quot; alt=&quot;XNAPipelineArticle_p3 | XNA Content Pipeline: Обзор&quot; /&gt;&lt;/div&gt; &lt;/p&gt;
&lt;p&gt;При этом такая папка (или проект) имеет свой список &amp;laquo;References&amp;raquo;, сборки из которого не только используются во время компиляции, но также используются как источник модулей (content importer, content processor) для конвейера. Когда возникает необходимость показать список доступных модулей, content pipeline сканирует сборки, добавленные в &amp;laquo;References&amp;raquo;, на наличие классов-модулей конвейера (определяет по базовому классу или интерфейсу).&lt;/p&gt;
&lt;p&gt;Такой подход на первый взгляд довольно необычен. Но если мы посмотрим внимательно, то увидим, что аналогичные вещи есть и у профессиональных разработчиков. Хороший пример – Source Engine от Valve, в котором есть внешний простой текстовый формат SMD и внутренний формат MDL, который (по слухам) полностью повторяет то, как данные располагаются в памяти программы во время работы.&lt;/p&gt;
&lt;p&gt;==Недостатки==&lt;/p&gt;
&lt;p&gt;Недостатки очевидны. В первую очередь, с этой системой значительно труднее освоиться, чем с одним &amp;laquo;плоским&amp;raquo; методом LoadTexture или LoadModel.&lt;/p&gt;
&lt;p&gt;А по той причине, что добавление нового контента требует повторной сборки проекта, у вас могут возникнуть проблемы, если вы захотите дать пользователям возможность модифицировать контент. Да и просто, необходимость каждый раз заново компилировать проект, является довольно неудобным.&lt;/p&gt;
&lt;p&gt;Но не стоит забывать, XNA это не только платформа Windows, это также XBOX и Windows Phone 7. И на этих двух платформах скорость загрузки контента более критична. К тому же, Content Pipeline помогает логически отделить код вашей игры от кода, который обеспечивает работу с файлами и устройствами хранения данных (который меняется от платформы к платформе).&lt;/p&gt;
&lt;p&gt;В то же время, если вы работаете только под Windows, никто не мешает работать по старинке &amp;mdash; написать свои методы загрузки моделей, текстур и звуков, используя пространство имен System.IO.&lt;/p&gt;
&lt;p&gt;==В завершение==&lt;/p&gt;
&lt;p&gt;Вот и все. Статья, возможно, получилась не совсем техническая. Но мне хотелось сделать больше обзор, чем &amp;laquo;кучу кода с комментариями&amp;raquo;. Если кому-то будет интересно, возможно в недалеком будущем я попробую продолжить тему, но уже с конкретными примерами кода &amp;mdash; модулей импорта и обработки.&lt;/p&gt;
&lt;p&gt;==Полезные ссылки==&lt;/p&gt;
&lt;p&gt;Интересующимся, в первую очередь, стоит заглянуть сюда:
&lt;br /&gt;&lt;a href=&quot;http://create.msdn.com/en-US/&quot;&gt;Официальный портал Microsoft&lt;/a&gt; - посвященный разработке под XNA&amp;nbsp; (недавно сменил дизайн и адрес – в связи с выходом Windows Phone 7).
&lt;br /&gt;&lt;a href=&quot;http://blogs.msdn.com/b/xna/&quot;&gt;Официальный блог команды разработчиков XNA&lt;/a&gt;.
&lt;br /&gt;&lt;a href=&quot;http://blogs.msdn.com/b/shawnhar/&quot;&gt;Персональный блог товарища по имени Shawn Hargreaves&lt;/a&gt; (участвует в разработке XNA Framework)&lt;/p&gt;
&lt;p&gt;Конкретнее по XNA Content Pipeline:
&lt;br /&gt;&lt;a href=&quot;http://blogs.msdn.com/b/shawnhar/archive/2008/11/24/content-pipeline-assemblies.aspx&quot;&gt;Про структуру Content Pipeline&lt;/a&gt;, а также про создание своих типов. 
&lt;br /&gt;&lt;a href=&quot;http://blogs.msdn.com/b/shawnhar/archive/2009/06/15/content-pipeline-types-updated.aspx&quot;&gt;Полезная диаграмма&lt;/a&gt; стандартных типов и модулей Content Pipeline.
&lt;br /&gt;&lt;a href=&quot;http://create.msdn.com/en-US/education/catalog/?contenttype=4&amp;amp;devarea=13&amp;amp;platform=0&amp;amp;sort=1&quot;&gt;Примеры от Microsoft&lt;/a&gt; связанные с Content Pipeline
&lt;br /&gt;&lt;a href=&quot;http://www.gamedev.ru/projects/forum/?id=126263&quot;&gt;Мой пример&lt;/a&gt; модуля импорта для Valve SMD =)&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/WP7MarketplaceRussia</guid>
  <pubDate>Fri, 01 Oct 2010 10:25:26 GMT</pubDate>
  <title>Windows Marketplace for Mobile в России</title>
  <link>http://xna.gamedev.ru/blog/WP7MarketplaceRussia</link>
  <comments>http://xna.gamedev.ru/forum/?id=139053</comments>
  <category>marketplace</category>
  <category>windows mobile 7</category>
  <category>XNA</category>
  <category>.NET</category>
  <description>
&lt;p&gt;Когда Microsoft объявила о выходе Windows Phone 7 и о том, что основным способом распространения программ, будет Marketplace &amp;mdash; многие отечественные девелоперы и просто интересующиеся заволновались (ведь до этого, marketplace обходил страны СНГ стороной). А на форумах начались споры, нужна ли кому такая платформа (на которой нельзя делиться результатом своего труда с обычными пользователями).&lt;/p&gt;
&lt;p&gt;Ну вот, теперь можно перестать спорить и волноваться (и полюбить Windows Phone =)). Теперь, зайдя &lt;a href=&quot;http://developer.windowsphone.com/&quot;&gt;на эту&lt;/a&gt; страницу, и перейдя по ссылке для регистрациии аккаунта разработчика в Marketplace, в списке стран можно увидеть &amp;laquo;Russia&amp;raquo;.&lt;/p&gt;
&lt;p&gt;Я думаю это хорошая новость.&lt;/p&gt;
&lt;p&gt;Это значит, что российские разработчики могут запросто продавать (я правда, не в курсе особенностей вывода денег) свои
&lt;br /&gt;Silverlight и XNA приложения для Windows Phone 7. Осталось дождаться выхода устройств под эту платформу.&lt;/p&gt;
&lt;p&gt;К сожалению, жители других стран СНГ, все ещё в пролете. =(&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/xna40Release</guid>
  <pubDate>Thu, 16 Sep 2010 18:40:42 GMT</pubDate>
  <title>Релиз XNA Game Studio 4.0</title>
  <link>http://xna.gamedev.ru/blog/xna40Release</link>
  <comments>http://xna.gamedev.ru/forum/?id=138270</comments>
  <category>windows phone 7</category>
  <category>WP7</category>
  <category>Xbox</category>
  <category>xbox360</category>
  <category>XNA</category>
  <category>XNA Game Studio</category>
  <category>.NET</category>
  <description>
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/xna4.png&quot; alt=&quot;xna40release | Релиз XNA Game Studio 4.0&quot; /&gt;
&lt;br /&gt;Сегодня, 16 сентября 2010 года, Microsoft выпустила полную версию XNA Game Studio 4.0.
&lt;br /&gt;Правда заполучить нам её предлагают весьма специфическим способом, а именно скачав комплект средств разработки (SDK) для Windows Phone 7. 
&lt;br /&gt;Иначе говоря, XNA Game Studio 4.0 идет как часть SDK для Windows Phone 7. 
&lt;br /&gt;Не знаю как к этому относится, можно только предположить, что Microsoft таким образом пытается популяризовать свою новую платформу. Я думаю, что для XNA это скорее хорошо, чем плохо =).
&lt;br /&gt;Есть правда отдельная версия XNA Game Studio 4.0, но она рассчитана только на пользователей Windows XP (напомню, что WP7 SDK в свою очередь можно установить только на Windows Vista/7).
&lt;br /&gt;Но даже для неё, вас все равно понадобится Visual Studio 2010 Professional (и выше) или Visual C# 2010 Express.&lt;/p&gt;
&lt;p&gt;Для того что бы скачать XNA Game Studio 4.0 - прошу следовать &lt;a href=&quot;http://creators.xna.com/en-US/launchcenter&quot;&gt;на эту страницу &lt;/a&gt;.
&lt;br /&gt;Новость на сайте XNA - можно почитать &lt;a href=&quot;http://creators.xna.com/en-US/news/xnags40release&quot;&gt;тут&lt;/a&gt;.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/XNA4CTP_And_WP7</guid>
  <pubDate>Fri, 19 Mar 2010 12:00:37 GMT</pubDate>
  <title>XNA 4.0 CTP, MIX2010 и Windows Phone 7</title>
  <link>http://xna.gamedev.ru/blog/XNA4CTP_And_WP7</link>
  <comments>http://xna.gamedev.ru/forum/?id=132725</comments>
  <category>mix</category>
  <category>mix2010</category>
  <category>windows phone 7</category>
  <category>WP7</category>
  <category>XNA</category>
  <category>.NET</category>
  <description>
&lt;p&gt;Сразу много приятных новостей.&lt;/p&gt;
&lt;p&gt;По порядку обо всем.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Во-первых&lt;/b&gt;, совсем недавно Microsoft объявила о том, что разрабатывает новую мобильную программно-аппаратную платформу - Windows Phone 7, которая включает в себя операционную систему, технологии, а также набор требований/спецификаций для аппаратной части (смартфона), которую будут производить сторонние фирмы (уже известно, что, как минимум, Samsung и LG&amp;nbsp; будут иметь по такому аппарату в своем ассортименте). И самое важное для нас тут, что программная часть сконцентрирована, в основном, вокруг двух технологий, одна из которых - XNA Framework.&lt;/p&gt;
&lt;p&gt;Проще говоря, скоро появится целая серия мобильных телефонов от разных популярных производителей, которые будут поддерживать XNA framework. Причем, писать программы под Windows Phone 7 можно будет только на управляемом (managed) коде. По сути, это то, чего так давно не хватало XNA. Возможно, даже, это повысит популярность технологии и спрос на неё.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Во-вторых&lt;/b&gt;, с 15 по 17 марта в Лас-Вегасе прошла традиционная конференция Microsoft для дизайнеров и разработчиков - MIX 2010.
&lt;br /&gt;Одной из основным тем, опять же, был Windows Phone 7, и, следовательно, разработка&amp;nbsp; XNA приложений под эту платформу.
&lt;br /&gt;Был представлен эмулятор Windows Phone 7 для Microsoft Visual Studio 2010. Также стали известны многие подробности, вот основные из них:
&lt;ul&gt;
&lt;li&gt; разработчики получают возможность закачивать игры прямо на смартфон с PC, правда, для обычных пользователей единственным способом устанавливать игры и программы будет Microsoft Marketplace (xbox live marketplace);&lt;/li&gt;
&lt;li&gt;XNA на Windows Phone 7 будет поддерживаться, практически, в полной мере, в том числе и 3D, отличия от PC и XBOX будут минимальны;&lt;/li&gt;
&lt;li&gt;исключением станут разве что шейдеры, первоначально возможности использовать собственноручно написанные шейдеры не будет, но будет набор готовых шейдеров и возможность их настройки, хотя прозвучало обещание что со временем будет возможность использовать те же шейдеры, что и на PC и XBOX (.fx);&lt;/li&gt;
&lt;li&gt;в составе XNA появится API для работы с аудиопотоками на нижнем уровне;&lt;/li&gt;
&lt;li&gt; в XNA, также как и в Silverlight (вторая основная технология платформы), на Windows Phone 7 будет возможность использовать API для работы с акселерометром, и определением местоположения (location - при помощи GPS, сотовой связи и Wi-Fi);&lt;/li&gt;
&lt;li&gt;вышеупомянутый эмулятор будет иметь полную аппаратную поддержку на PC, что позволит отлаживать игры для новой платформы без каких-либо проблем с производительностью, в то же время, производительность эмулятора буде выше реального телефона, и поэтому реальное устройство все-таки будет нужно для окончательной отладки.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;В третьих&lt;/b&gt;, в первый же день MIX, стал доступен CTP(Community Technology Preview) XNA 4.0, правда, пока что только в составе бесплатного пакета для разработки под WP7, вместе с CTP версией Microsoft Visual Studio 2010 Express, Silverlight 4, и эмулятором WP7.&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/gamexna.png&quot; alt=&quot;xna4_wp7_game | XNA 4.0 CTP, MIX2010 и Windows Phone 7&quot; /&gt;
&lt;br /&gt;Пример 3D игры на XNA4 для Windows Phone 7 (представленный MIX2010)
&lt;br /&gt;(&lt;a href=&quot;http://www.engadget.com/photos/windows-phone-7-series-xna-screenshots/&quot;&gt;тут на engadget&lt;/a&gt; можно посмотреть скриншоты)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Видео-материалы с MIX 2010 о XNA&lt;/b&gt;:
&lt;br /&gt;&lt;a href=&quot;http://www.microsoft.com/presspass/events/mix/videoGallery.aspx?contentID=ondemand_mix10&quot;&gt;MIX 2010 - Keynote day 1&lt;/a&gt;&amp;nbsp; -&amp;nbsp; в основном о silverlight, но с 2:12:0 можно наблюдать примеры готовых игр на XNA
&lt;br /&gt;&lt;a href=&quot;http://live.visitmix.com/MIX10/Sessions/CL19&quot;&gt;Session CL19 - Development and Debugging Tools for Building XNA Games for Windows Phone&lt;/a&gt;
&lt;br /&gt;&lt;a href=&quot;http://live.visitmix.com/MIX10/Sessions/CL21&quot;&gt;Session CL21 - Building Windows Phone Games&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Инструменты&lt;/b&gt;:&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=2338b5d1-79d8-46af-b828-380b0f854203&amp;amp;displaylang=en&quot;&gt;
&lt;br /&gt;Windows Phone Developer Tools CTP&lt;/a&gt; (устанавливается только на Windows Vista SP2 и Windows 7)&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/articles/screenshot</guid>
  <pubDate>Wed, 26 Aug 2009 11:05:30 GMT</pubDate>
  <title>Захват Скриншота средствами XNA</title>
  <link>http://xna.gamedev.ru/articles/screenshot</link>
  <category>скриншот</category>
  <category>tutorial</category>
  <category>основы</category>
  <description>
&lt;p&gt;В этом уроке я покажу вам, как захватить скриншот в &lt;a href=&quot;http://www.gamedev.ru/code/terms/XNA&quot; title=&quot;XNA&quot;&gt;XNA&lt;/a&gt; 2.0. Тема эта короткая и сравнительно простая, так что давайте уже нырнём в неё с головой!&lt;/p&gt;
&lt;/p&gt;
&lt;/p&gt;&lt;p style=&quot;text-align: right;&quot;&gt;Автор: &lt;b&gt;Nezerv&lt;/b&gt;
&lt;br /&gt;Перевод: &lt;b&gt;&lt;a href=&quot;http://www.gamedev.ru/users/?id=42512&quot; title=&quot;JMC: Сергей Евсеев&quot;&gt;Сергей Евсеев&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Прежде всего давайте создадим новый XNA 2.0 Windows Game проект. Назовите его как хотите, свой я назвал ScreenshotTutorial.&lt;/p&gt;
&lt;p&gt;Начнём с того, что сотрём все лишние комментарии, которые идут вместе с проектом, поскольку они нам не нужны. Это отнюдь не является необходимым шагом, но мне кажется так будет лучше, потому что это сделает код немного чище и яснее.&lt;/p&gt;
&lt;p&gt;Теперь давайте объявим пару объектов под строчкой SpriteBatch spriteBatch;&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #808080&quot;&gt;// Объявления Скриншота&lt;/span&gt;
Texture2D Screenshot;
RenderTarget2D ScreenshotRenderTarget;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Ничего из того, что мы сделали здесь, не было сложным, мы просто объявили два объекта: Texture и RenderTarget, которые нужны нам для захвата нашего скриншота.&lt;/p&gt;
&lt;p&gt;Теперь нам надо инициализировать наш RenderTarget. В конце нашего метода LoadContent() добавьте вот это:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #808080&quot;&gt;// Инициализируем наш RenderTarget&lt;/span&gt;
ScreenshotRenderTarget = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; RenderTarget2D&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;
    GraphicsDevice,
    &lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;.Window.ClientBounds.Width,
    &lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;.Window.ClientBounds.Height,
    &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;,
    SurfaceFormat.Rgba64&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Всё, что мы на данный момент сделали, так это инициализировали наш RenderTarget. Давайте пройдёмся по аргументам, которые&amp;nbsp; мы передали. Первое, что мы сделали, так это передали наш объект GraphicsDevice, чтобы ассоциировать его с нашим RenderTarget. Затем мы сообщили нашему RenderTarget, какого размера мы хотим его сделать (в пикселях). Поскольку мы планируем делать и полноэкранные скриншоты, мы предоставляем полные высоту и ширину нашего окна с помощью наших значений window.ClientBounds.Width и window.ClientBounds.Height. С помощью четвёртого аргумента мы просто сообщаем, сколько мы хотим иметь mipmap-уровней. В большинстве случаев подойдёт 0 (ноль). В последнем аргументе мы просто сообщаем нужный нам формат поверхности. Я рекомендую rgba64, похоже, что он работает лучше всего. Теперь давайте загрузим простую текстуру, чтобы у нас было, что нарисовать. Я загружу простую белую картинку 256х256, которую я сделал в Photoshop&apos;е, а вы можете загрузить всё, что хотите. Чтобы добавить картинку или текстуру в ваш проект, просто щёлкните правой кнопкой на вашей папке &apos;Content&apos; в Solution Explorer&apos;е и выберете там Add -&amp;gt; Existing item и просто укажите файл, который вы хотите добавить.&lt;/p&gt;
&lt;p&gt;Всё же, прежде, чем мы сможем её использовать, нам надо её объявить. Так что давайте добавим следующий код под нашими объявлениями скриншота:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #808080&quot;&gt;// Content&lt;/span&gt;
Texture2D texPicture;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Теперь давайте загрузим нашу картинку/текстуру. Добавьте этот код в конце нашего метода LoadContent():&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #808080&quot;&gt;// Загружаем нашу текстуру&lt;/span&gt;
texPicture = Content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Texture2D&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;Rectangle&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Только вам надо изменить &amp;quot;Rectangle&amp;quot; на месторасположение вашей картинки/текстуры.&lt;/p&gt;
&lt;p&gt;Теперь давайте создадим простой метод, который будет рисовать нашу сцену (игру):&amp;nbsp; &lt;/p&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; DrawScene&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
    GraphicsDevice.Clear&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Color.CornflowerBlue&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    spriteBatch.Begin&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    spriteBatch.Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;texPicture, 
            &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector2&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Window.ClientBounds.Width  / &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; - &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;texPicture.Width  / &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;,
                        &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Window.ClientBounds.Height / &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; - &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;texPicture.Height / &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;, 
            Color.Red&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    spriteBatch.End&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;Здесь нам просто надо вызвать метод, чтобы отрисовать всю нашу сцену. Конечно, это будет гораздо сложнее в более крупных проектах, но для этого урока это сработает. Здесь нет ничего фантастического, мы просто очищаем цветом наш объект GraphicsDevice, и затем рисуем нашу картинку прямо в центре нашего окна с помощью объекта SpriteBatch.&lt;/p&gt;
&lt;p&gt;Теперь давайте изменим метод Draw(). Сначала удалите эту строчку:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;graphics.GraphicsDevice.Clear&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Color.CornflowerBlue&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Нам это не нужно, так как мы уже очистили наш GraphicsDevice в методе DrawScene().&lt;/p&gt;
&lt;p&gt;Теперь давайте вызовем метод DrawScene() из нашего метода Draw(). Теперь ваш метод Draw() должен выглядеть так:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;DrawScene&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
base.Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Теперь давайте создадим метод, который и будет непосредственно захватывать скриншот:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; CaptureScreenshot&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
    &lt;span style=&quot;color: #808080&quot;&gt;// Устанавливаем наш RenderTarget&lt;/span&gt;
    GraphicsDevice.SetRenderTarget&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;, ScreenshotRenderTarget&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    &lt;span style=&quot;color: #808080&quot;&gt;// Рисуем нашу сцену&lt;/span&gt;
    DrawScene&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    &lt;span style=&quot;color: #808080&quot;&gt;// Сбрасываем наш RenderTarget&lt;/span&gt;
    GraphicsDevice.SetRenderTarget&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;, null&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    &lt;span style=&quot;color: #808080&quot;&gt;// Получаем картинку/текстуру из нашего RenderTarget&lt;/span&gt;
    Screenshot = ScreenshotRenderTarget.GetTexture&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    &lt;span style=&quot;color: #808080&quot;&gt;// Теперь давайте просто сохраним наш скриншот!&lt;/span&gt;
    Screenshot.Save&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;Screenshot.jpg&amp;quot;&lt;/span&gt;, ImageFileFormat.Jpg&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Как видно, всё достаточно просто. Мы начинаем с того, что сообщаем нашему GraphicsDevice какой RenderTarget мы хотим использовать, затем рисуем нашу сцену, и просто сбрасываем наш RenderTarget, передав 0 (ноль), как второй аргумент в метод GraphicsDevice.SetRenderTarget(). После этого мы просто извлекаем текстуру из RenderTarget и копируем её в наш объект Screenshot. Отсюда вызываем метод Save() и указываем имя файла, формат файла изображения и скриншот будет сохранён!&lt;/p&gt;
&lt;p&gt;Теперь всё, что нам надо сделать, так это обновить наш метод Update():&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;KeyboardState kbState = Keyboard.GetState&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

&lt;span style=&quot;color: #808080&quot;&gt;// функция Exit&lt;/span&gt;
&lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;kbState.IsKeyDown&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keys.Escape&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
    &lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;.Exit&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
}

&lt;span style=&quot;color: #808080&quot;&gt;// функция Screenshot&lt;/span&gt;
&lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;kbState.IsKeyDown&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keys.PrintScreen&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
    CaptureScreenshot&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Здесь нет ничего сверхестественного. Мы просто создаём объект KeyboardState и получаем текущее состояние клавиатуры, затем проверяем, нажаты ли выбранные нами клавиши, и если нажаты, то они вызывают CaptureScreenshot(), который непосредственно делает скриншот. Хотя я должен отметить, что текущая функция для проверки нажатия клавиши PrintScreen не идеальна, поскольку она вызовает CaptureScreenshot() лишнее количество раз. Так как это легко сделать, я не буду вдаваться в подробности в этом уроке.&lt;/p&gt;
&lt;p&gt;Также я не уверен, что это будет работать на Xbox360. Я такового не имею, поэтому проверить работоспособность не могу.&lt;/p&gt;
&lt;p&gt;Итак, мы всё сделали!&lt;/p&gt;
&lt;p&gt;Исходная статья &lt;a href=&quot;http://www.ziggyware.com/readarticle.php?article_id=187&quot;&gt;здесь&lt;/a&gt;. Перевод предоставлен мной в рамках проекта &lt;a href=&quot;http://ru.ziggyware.com&quot;&gt;Russian Ziggyware&lt;/a&gt;.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/articles/simple_skybox</guid>
  <pubDate>Sat, 22 Aug 2009 10:25:42 GMT</pubDate>
  <title>Рисование простого SkyBox-а.</title>
  <link>http://xna.gamedev.ru/articles/simple_skybox</link>
  <comments>http://xna.gamedev.ru/forum/?id=122771</comments>
  <category>Графика</category>
  <category>SkyBox</category>
  <category>XNA</category>
  <category>основы</category>
  <category>уроки</category>
  <description>
&lt;p&gt;В этой статье мы рассмотрим метод создания SkyBox-а в XNA. SkyBox (небесный куб) &amp;mdash; это задний фон в изображениях трёхмерной компьютерной графики. Дальние неподвижные объекты, как горы, небо, растительность, полоса горизонта &amp;mdash; можно поместить заранее в текстуру и выводить только её. Чтобы задний фон присутствовал во всех направлениях, делают &amp;laquo;большой&amp;raquo; куб, на стенки которого устанавливаются соответственно 6-ть текстур, а внутри самого куба помещается наблюдатель &amp;mdash; камера трёхмерного приложения.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/skybox3.png&quot; alt=&quot;SkyBox Simple Pic 3 | Рисование простого SkyBox-а.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Давайте создадим простой SkyBox для нашего 3D-мира в &lt;a href=&quot;http://www.gamedev.ru/code/terms/XNA&quot; title=&quot;XNA&quot;&gt;XNA&lt;/a&gt;. Для начала нам потребуется шесть текстур, которые будут представлять фронт, тыл, левую часть, правую, верх и низ нашего мира. Положите текстуры в папку внутри проекта.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/skybox1.png&quot; alt=&quot;SkyBox Simple Pic 1 | Рисование простого SkyBox-а.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Также нам понадобится простой шейдер файла эффекта (Effect), который мы будем использовать для рендеринга skybox’а.&lt;/p&gt;
&lt;p&gt;Я отключил освещение и Z-буффер, а также включил texture clamping, чтобы увеличить производительность и предотвратить показ краев текстур.&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #808080&quot;&gt;//Входные переменные&lt;/span&gt;
float4x4 worldViewProjection;

texture baseTexture;

sampler baseSampler = 
sampler_state
{
    Texture = &lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt; baseTexture &lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;;
    MipFilter = LINEAR;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
    ADDRESSU = CLAMP;
    ADDRESSV = CLAMP;
};

&lt;span style=&quot;color: #0030fF; &quot;&gt;struct&lt;/span&gt; VS_INPUT
{
    float4 ObjectPos: POSITION;
    float2 TextureCoords: TEXCOORD0;
};

&lt;span style=&quot;color: #0030fF; &quot;&gt;struct&lt;/span&gt; VS_OUTPUT 
{
   float4 ScreenPos:   POSITION;
   float2 TextureCoords: TEXCOORD0;
};

&lt;span style=&quot;color: #0030fF; &quot;&gt;struct&lt;/span&gt; PS_OUTPUT 
{
   float4 Color:   COLOR;
};


VS_OUTPUT SimpleVS&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;VS_INPUT In&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
   VS_OUTPUT Out;

    &lt;span style=&quot;color: #808080&quot;&gt;//Переходим к экранному пространству&lt;/span&gt;
    Out.ScreenPos = mul&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;In.ObjectPos, worldViewProjection&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
    Out.TextureCoords = In.TextureCoords;

    &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; Out;
}

PS_OUTPUT SimplePS&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;VS_OUTPUT In&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
    PS_OUTPUT Out;

    Out.Color = tex2D&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;baseSampler,In.TextureCoords&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; Out;
}

&lt;span style=&quot;color: #808080&quot;&gt;//-------------------------------------------------------------------------//&lt;/span&gt;
&lt;span style=&quot;color: #808080&quot;&gt;// Раздел техники для простого экранного преобразования&lt;/span&gt;
&lt;span style=&quot;color: #808080&quot;&gt;//-------------------------------------------------------------------------//&lt;/span&gt;
technique Simple
{
   pass Single_Pass
   {
        LIGHTING = FALSE;
        ZENABLE = FALSE;
        ZWRITEENABLE = FALSE;
        ALPHATESTENABLE = FALSE;
        ALPHABLENDENABLE = FALSE;

        CULLMODE = CCW;

        VertexShader = compile vs_1_1 SimpleVS&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
        PixelShader = compile ps_1_1 SimplePS&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
   }
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Поскольку теперь у нас есть простой шейдер для рендеринга, давайте спроектируем класс skybox’а.&lt;/p&gt;
&lt;p&gt;Мы будем использовать модель интерфейса GameComponent.&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;#region &lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt;’и
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; System;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Audio;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Content;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Graphics;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Input;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Storage;
#endregion

&lt;span style=&quot;color: #0030fF; &quot;&gt;namespace&lt;/span&gt; SkyBox
{

    &lt;span style=&quot;color: #0030fF; &quot;&gt;class&lt;/span&gt; SkyBox : GameComponent,IDrawable
    {&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Я добавил IDrawable к компоненту skybox’а. Это добавило некоторые функции под разделом со следующим названием:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;#region Члены IDrawable&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Вы можете автоматически сгенерировать описания этого члена, если кликнете правой кнопкой мыши на слове IDrawable и выберете Implement Interface. Это меню доступно, только если вы щелкаете на IDrawable первый раз. Если вы забыли выбрать Implement Interface, то вы можете вернуться и удалить слово IDrawable, а потом напечатать его снова, кликнув затем по нему правой кнопкой мыши и выбрав Implement Interface.&lt;/p&gt;
&lt;p&gt;Skybox будет содержать шесть сторон, поэтому нам нужно место для шести текстур:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;        Texture2D&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; textures = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Texture2D&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;
        Effect effect;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Давайте объявим буфер вершин, буфер индексов и объявление буфера (vertex declaration), чтобы мы могли рендерить skybox вручную. Этот подход лучше, чем использование сетки (mesh), так как вы можете рендерить только видимые камере стороны skybox’а и пропустить остальные стороны.&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;        VertexBuffer vertices;
        IndexBuffer indices;
        VertexDeclaration vertexDecl;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Запомним направление и позицию камеры, чтобы skybox в последствии мог быть преобразован правильно:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;        Vector3 vCameraDirection;
        Vector3 vCameraPosition;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Файлу эффекта понадобится комбинированная мировая/видовая/проекционная (World * View * Projection) матрица преобразования:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;        Matrix viewMatrix;
        Matrix projectionMatrix;
        Matrix worldMatrix;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Давайте сохраним указатель на content manager. Это, вероятно, можно оптимизировать.&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;  
        ContentManager content;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Базовый класс игрового компонента требует от нас, чтобы мы передали указатель на экземпляр класса Game:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; SkyBox&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Game g&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
            : base&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;g&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
        }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Давайте определим методы-аксессоры для переменных члена:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; Vector3 CameraDirection
        {
            get { &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; vCameraDirection; }
            set { vCameraDirection = value; }
        }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Когда изменяется позиция камеры, нам необходимо пересчитать мировую матрицу преобразования:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; Vector3 CameraPosition
        {
            get { &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; vCameraPosition; }
            set 
            {
                vCameraPosition = value;

                worldMatrix = Matrix.CreateTranslation&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vCameraPosition&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            }
        }

        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; Matrix ViewMatrix
        {
            set { viewMatrix = value; }
        }

        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; Matrix ProjectionMatrix
        {
            set { projectionMatrix = value; }
        }

        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; ContentManager ContentManager
        {
            set { content = value; }
        }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Внутри метода инициализации нам надо сделать работу по созданию skybox’а:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Initialize&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            base.Initialize&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Загружаем все шесть сторон (текстур) skybox&apos;а:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;            textures&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Texture2D&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;Skybox\\back&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            textures&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Texture2D&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;Skybox\\front&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            textures&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Texture2D&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;Skybox\\bottom&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            textures&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Texture2D&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;Skybox\\top&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            textures&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Texture2D&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;Skybox\\left&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            textures&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Texture2D&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;Skybox\\right&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

            effect = content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Effect&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;Skybox\\skybox&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Получаем указатель на графическое устройство, чтобы мы могли создать вершинный и индексный буферы:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;            IGraphicsDeviceService graphicsService = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;IGraphicsDeviceService&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
                Game.Services.GetService&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;typeof&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;IGraphicsDeviceService&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Для рендеринга от нас потребуется определить объявление вершин (vertex declaration). Поскольку мы используем тип вершины PositionTexture, то он содержит два элемента: Position (Vector3) и TextureCoordinate (Vector2):&lt;/p&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;            vertexDecl = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; VertexDeclaration&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;graphicsService.GraphicsDevice,
                &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; VertexElement&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; {
                    &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; VertexElement&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;,&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;,VertexElementFormat.Vector3,
                           VertexElementMethod.Default,
                            VertexElementUsage.Position,&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;,
                    &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; VertexElement&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;,&lt;span style=&quot;color: #0030fF; &quot;&gt;sizeof&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;*&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;,VertexElementFormat.Vector2,
                           VertexElementMethod.Default,
                            VertexElementUsage.TextureCoordinate,&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;}&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;Создаем вершинный буфер с 4*6 вершинами. Он будет содержать по четыре вершины на каждую сторону skybox’а. Установите ResourceUsage на WriteOnly, чтобы оптимизировать производительность:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;            vertices = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; VertexBuffer&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;graphicsService.GraphicsDevice, 
                                typeof&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;VertexPositionTexture&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;, 
                                &lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt; * &lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;, 
                                ResourceUsage.WriteOnly&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Заполните вершинный буфер:&lt;/p&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;            VertexPositionTexture&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; data = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; VertexPositionTexture&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;*&lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;
            
            Vector3 vExtents = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;500&lt;/span&gt;, &lt;span style=&quot;color: #F04000; &quot;&gt;500&lt;/span&gt;, &lt;span style=&quot;color: #F04000; &quot;&gt;500&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            &lt;span style=&quot;color: #808080&quot;&gt;//зад&lt;/span&gt;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, -vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, -vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;

            &lt;span style=&quot;color: #808080&quot;&gt;//перед&lt;/span&gt;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, -vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, -vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;

            &lt;span style=&quot;color: #808080&quot;&gt;//низ&lt;/span&gt;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;8&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, -vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;8&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;8&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;9&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, -vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;9&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;9&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, -vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, -vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;

            &lt;span style=&quot;color: #808080&quot;&gt;//верх&lt;/span&gt;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;13&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;13&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;13&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;


            &lt;span style=&quot;color: #808080&quot;&gt;//лево&lt;/span&gt;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;18&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, -vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;18&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;18&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;19&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-vExtents.X, -vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;19&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;19&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;

            &lt;span style=&quot;color: #808080&quot;&gt;//право&lt;/span&gt;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, -vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;21&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, -vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;21&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;21&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;22&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, vExtents.Y, vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;22&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;22&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Position = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector3&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vExtents.X, vExtents.Y, -vExtents.Z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.X = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f; data&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.TextureCoordinate.Y = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f;

            vertices.SetData&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;VertexPositionTexture&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;data&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;Теперь нам надо создать индексный буфер, который будет использоваться для индексирования каждой поверхности во время рендеринга:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;            indices = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; IndexBuffer&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;graphicsService.GraphicsDevice, 
                                typeof&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;short&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;,&lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;*&lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;, 
                                ResourceUsage.WriteOnly&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

            &lt;span style=&quot;color: #0030fF; &quot;&gt;short&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; ib = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;short&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt; * &lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;

            &lt;span style=&quot;color: #0030fF; &quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;int&lt;/span&gt; x = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;; x &lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;; x++&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
            {
                ib&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;short&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                ib&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;short&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                ib&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;short&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

                ib&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;short&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                ib&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;short&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                ib&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;short&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;x * &lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            }

            indices.SetData&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;short&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;ib&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            
        }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Любой код, который должен быть выполнен между каждым кадром, помещаем в метод Update:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Update&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GameTime gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            
            base.Update&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
        }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Вот реализация интерфейса IDrawable:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;        #region Члены IDrawable

        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GameTime gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vertices == null&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Давайте начнем использовать эффект (Effect):&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;            effect.Begin&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            effect.Parameters&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;worldViewProjection&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.SetValue&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;
                             worldMatrix * viewMatrix * projectionMatrix&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Цикл проходит через каждую сторону skybox’а:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;            &lt;span style=&quot;color: #0030fF; &quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;int&lt;/span&gt; x = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;; x &lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;; x++&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
            {&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Сделаем простой тест видимости для каждой стороны skybox’а:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;                &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; f=&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;;
                &lt;span style=&quot;color: #0030fF; &quot;&gt;switch&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;x&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
                {
                &lt;span style=&quot;color: #0030fF; &quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;: &lt;span style=&quot;color: #808080&quot;&gt;//зад&lt;/span&gt;
                    f = Vector3.Dot&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vCameraDirection,Vector3.Forward&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                    &lt;span style=&quot;color: #0030fF; &quot;&gt;break&lt;/span&gt;;
                &lt;span style=&quot;color: #0030fF; &quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;: &lt;span style=&quot;color: #808080&quot;&gt;//перед&lt;/span&gt;
                    f = Vector3.Dot&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vCameraDirection,Vector3.Backward&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                    &lt;span style=&quot;color: #0030fF; &quot;&gt;break&lt;/span&gt;;
                &lt;span style=&quot;color: #0030fF; &quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;: &lt;span style=&quot;color: #808080&quot;&gt;//низ&lt;/span&gt;
                    f = Vector3.Dot&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vCameraDirection,Vector3.Up&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                    &lt;span style=&quot;color: #0030fF; &quot;&gt;break&lt;/span&gt;;
                &lt;span style=&quot;color: #0030fF; &quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;: &lt;span style=&quot;color: #808080&quot;&gt;//верх&lt;/span&gt;
                    f = Vector3.Dot&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vCameraDirection,Vector3.Down&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                    &lt;span style=&quot;color: #0030fF; &quot;&gt;break&lt;/span&gt;;
                &lt;span style=&quot;color: #0030fF; &quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;: &lt;span style=&quot;color: #808080&quot;&gt;//лево&lt;/span&gt;
                    f = Vector3.Dot&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vCameraDirection,Vector3.Right&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                    &lt;span style=&quot;color: #0030fF; &quot;&gt;break&lt;/span&gt;;
                &lt;span style=&quot;color: #0030fF; &quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt;: &lt;span style=&quot;color: #808080&quot;&gt;//право&lt;/span&gt;
                    f = Vector3.Dot&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vCameraDirection,Vector3.Left&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                    &lt;span style=&quot;color: #0030fF; &quot;&gt;break&lt;/span&gt;;
                }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Если данная сторона видна, то устанавливаем текстуру и рендерим:&lt;/p&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;                &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;f &lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;= &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
                {
                    IGraphicsDeviceService graphicsService = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;IGraphicsDeviceService&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
                        Game.Services.GetService&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;typeof&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;IGraphicsDeviceService&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

                    GraphicsDevice device = graphicsService.GraphicsDevice;
                    device.VertexDeclaration = vertexDecl;
                    device.Vertices&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.SetSource&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;vertices, &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;, 
                        vertexDecl.GetVertexStrideSize&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

                    device.Indices = indices;

                    effect.Parameters&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;baseTexture&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.SetValue&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;textures&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;x&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                    effect.Techniques&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Passes&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Begin&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                    
                    device.DrawIndexedPrimitives&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;PrimitiveType.TriangleList, 
                        &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;,x*&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;,&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;,x*&lt;span style=&quot;color: #F04000; &quot;&gt;6&lt;/span&gt;,&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                    effect.Techniques&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.Passes&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;.End&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
                    
                }
            }
            
            effect.End&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
        }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;Skybox должен быть нарисован одним из первых (сделаем нулевым по порядку):&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;int&lt;/span&gt; DrawOrder
        {
            get { &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;; }
        }

        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; event EventHandler DrawOrderChanged;

        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;bool&lt;/span&gt; Visible
        {
            get { &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;true&lt;/span&gt;; }
        }

        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; event EventHandler VisibleChanged;

        #endregion
    }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Давайте теперь взглянем на класс игры и на то, как используется компонент skybox’а:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;    &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;class&lt;/span&gt; Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        ContentManager content;


        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; Game1&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            graphics = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; GraphicsDeviceManager&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            content = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; ContentManager&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Services&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
        }


        &lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Initialize&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            &lt;span style=&quot;color: #808080&quot;&gt;// TODO: Add your initialization logic here&lt;/span&gt;

            base.Initialize&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
        }


        &lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; LoadGraphicsContent&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;bool&lt;/span&gt; loadAllContent&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;loadAllContent&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
            {&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Создаем skybox:&lt;/p&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;                SkyBox sb = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; SkyBox&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

                sb.ContentManager = &lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;.content;

                sb.CameraDirection = Vector3.Forward;
                sb.CameraPosition = Vector3.Zero;

                sb.ViewMatrix = Matrix.CreateLookAt&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;sb.CameraPosition, 
                    sb.CameraPosition + sb.CameraDirection, Vector3.Up&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

                Viewport viewport = graphics.GraphicsDevice.Viewport;
                &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; aspectRatio = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;viewport.Width / &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;viewport.Height;

                sb.ProjectionMatrix = Matrix.CreatePerspectiveFieldOfView&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;
                    MathHelper.PiOver4, aspectRatio, &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f, &lt;span style=&quot;color: #F04000; &quot;&gt;10000&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;Игровой компонент должен вызывать метод Initialize() внутренне. Хотя я и не использую его на своем компьютере, я добавлю его здесь:&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;                sb.Initialize&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Не забудьте добавить skybox к списку игровых компонентов:&lt;/p&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;                &lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;.Components.Add&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;sb&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            }

            &lt;span style=&quot;color: #808080&quot;&gt;// TODO: Load any ResourceManagementMode.Manual content&lt;/span&gt;
        }


        &lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; UnloadGraphicsContent&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;bool&lt;/span&gt; unloadAllContent&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;unloadAllContent == &lt;span style=&quot;color: #0030fF; &quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
            {
                content.Unload&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            }
        }

        &lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Update&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GameTime gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            &lt;span style=&quot;color: #808080&quot;&gt;// Allows the default game to exit on Xbox 360 and Windows&lt;/span&gt;
            &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GamePad.GetState&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;PlayerIndex.One&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;.Buttons.Back == ButtonState.Pressed&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;.Exit&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;Для проверки правильности работы skybox’а, я добавил кое-какой код, который будет вращать камеру в зависимости от оси левого джойстика:&lt;/p&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;            SkyBox sb = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;SkyBox&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;.Components&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;

            Matrix matX = Matrix.CreateRotationY&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;
                -GamePad.GetState&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;PlayerIndex.One&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;.ThumbSticks.Left.X * .&lt;span style=&quot;color: #F04000; &quot;&gt;05&lt;/span&gt;f&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            
            sb.CameraDirection = Vector3.TransformNormal&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;sb.CameraDirection, matX&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

            Matrix matY = Matrix.CreateFromAxisAngle&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;
                Vector3.Normalize&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Vector3.Cross&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;sb.CameraDirection,Vector3.Up&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;,
                -GamePad.GetState&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;PlayerIndex.One&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;.ThumbSticks.Left.Y * .&lt;span style=&quot;color: #F04000; &quot;&gt;05&lt;/span&gt;f&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

            Vector3 vDir = Vector3.TransformNormal&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;sb.CameraDirection, matY&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            
            &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Math.Abs&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Vector3.Dot&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Vector3.Up,vDir&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;9&lt;/span&gt;f&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
                vDir = sb.CameraDirection;
            sb.CameraDirection = vDir;

            
            sb.ViewMatrix = Matrix.CreateLookAt&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;sb.CameraPosition, 
                sb.CameraPosition + sb.CameraDirection,Vector3.Up&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

            base.Update&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
        }


        &lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GameTime gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            graphics.GraphicsDevice.Clear&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Color.CornflowerBlue&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

            &lt;span style=&quot;color: #808080&quot;&gt;// TODO: Add your drawing code here&lt;/span&gt;

            base.Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;Скачать &lt;b&gt;&lt;a href=&quot;http://www.gamedev.ru/files/?id=45095&quot;&gt;Пример простого SkyBox для XNA 1.0&lt;/a&gt;&lt;/b&gt;
&lt;br /&gt;Скачать &lt;b&gt;&lt;a href=&quot;http://www.gamedev.ru/files/?id=45096&quot;&gt;Пример простого SkyBox для XNA 3.1&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Оригинал статьи &lt;a href=&quot;http://www.ziggyware.com/readarticle.php?article_id=71&quot;&gt;здесь&lt;/a&gt;. Перевод предоставлен сайтом &lt;a href=&quot;http://ru.ziggyware.com&quot;&gt;Russian Ziggyware&lt;/a&gt;.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/articles/XnaQuickStart</guid>
  <pubDate>Mon, 27 Jul 2009 13:10:02 GMT</pubDate>
  <title>XNA – Быстрый старт</title>
  <link>http://xna.gamedev.ru/articles/XnaQuickStart</link>
  <comments>http://xna.gamedev.ru/forum/?id=121657</comments>
  <category>Графика</category>
  <category>C#</category>
  <category>tutorial</category>
  <category>XNA</category>
  <category>XNA Game Studio</category>
  <category>основы</category>
  <description>
&lt;p&gt;Наша задача, быстро ввести вас в курс дела, &amp;mdash; что такое XNA, как его использовать. Статья рассчитана на людей уже имеющих определённый опыт программирования (но не знакомых собственно с XNA), и желающих кратко ознакомиться с платформой.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/home_tour_sidebar_new_2.png&quot; alt=&quot;articles_xna_quickstart_p2 | XNA – Быстрый старт&quot; /&gt;&lt;/p&gt;
&lt;p&gt;==Так что же такое XNA?==&lt;/p&gt;
&lt;p&gt;Само название шутливый рекурсивный акроним &amp;laquo;не являющийся акронимом&amp;raquo;. &lt;a href=&quot;http://www.gamedev.ru/code/terms/XNA&quot; title=&quot;XNA&quot;&gt;XNA&lt;/a&gt; &amp;mdash; XNA&apos;s Not Acronymed.&lt;/p&gt;
&lt;p&gt;В целом, это набор из нескольких .NET сборок, который включает в себя:
&lt;ul&gt;
&lt;li&gt;обвёртку над DirectX (Direct3d, XINPUT, XACT);&lt;/li&gt;
&lt;li&gt;каркас игрового приложения (классы Game, GameComponent, GameWindow);&lt;/li&gt;
&lt;li&gt;набор вспомогательных классов/структур для работы с векторами, матрицами, лучами, кватернионами, а также разные математические функции в дополнение к стандартному System.Math;&lt;/li&gt;
&lt;li&gt;инфраструктура Content Pipeline &amp;mdash; специфической контент сиcтемы XNA.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;При помощи XNA на данный момент можно разрабатывать игры для Windows (XP, Vista, 7), XBOX360, а также ZUNE (но только 2D, так как текущие модели ZUNE не поддерживают 3D).&lt;/p&gt;
&lt;p&gt;Как видно, XNA не просто оболочка над DirectX, но в то же время и не готовый &amp;laquo;двиг&amp;raquo;. В целом, XNA &amp;mdash; это платформа, которая следует &amp;laquo;философии&amp;raquo; языка C# и платформы .NET &amp;mdash; серьёзный упор на ООП и эффективность разработки.&lt;/p&gt;
&lt;p&gt;===Почему XNA?===&lt;/p&gt;
&lt;p&gt;XNA хороший выбор для вас:
&lt;ul&gt;
&lt;li&gt;если вы хотите создавать игры используя языки платформы .Net, а тем более используя C#;&lt;/li&gt;
&lt;li&gt;если требуется высокая скорость и эффективность разработки (в противовес С++, который&amp;nbsp; может обеспечить большую производительность и мобильность, но требует больших&amp;nbsp; &amp;laquo;затрат&amp;raquo; при разработке);&lt;/li&gt;
&lt;li&gt;если вы хотите попробовать свои силы на XBOX.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;==C чего начать?==&lt;/p&gt;
&lt;p&gt;Вам нужно иметь уже установленную Microsoft Visual Studio 2008 или же бесплатную версию – Microsoft Visual C# 2008. Должна быть в наличии видеокарта с поддержкой DirectX 9.0c и как минимум шейдеров версии 1.1. (разработчики XNA отказались от фиксированного графического конвейера, в связи с чем минимальная версия шейдеров 1.1 является&amp;nbsp; обязательным требованием). В добавок желательно иметь свежую версию DirectX, например за ноябрь 2008 года вполне подходит. Если эти условия выполнены, можете наконец перейти к установке XNA Game Studio (в конце статьи приведены ссылки на актуальные версии).&lt;/p&gt;
&lt;p&gt;После установки в обоих студиях появляются проекты нового типа:
&lt;ul&gt;
&lt;li&gt;XNA Game Windows&lt;/li&gt;
&lt;li&gt;XNA Game XBOX&lt;/li&gt;
&lt;li&gt;XNA Game ZUNE&lt;/li&gt;
&lt;li&gt;XNA Game Library (Windows,XBOX,ZUNE)&lt;/li&gt;
&lt;li&gt;XNA Content Pipeline Extension Library&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/art_xna_qst_p3.png&quot; alt=&quot;art_xna_qst_p3 | XNA – Быстрый старт&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Собственно, минимальные проекты игр для разных платформ и минимальные проекты библиотек, с уже подключёнными референсами на сборки библиотек XNA. Кроме того, в зависимости от версии XNA Game Studio в типах проектов будут также доступны &amp;laquo;starter-kits&amp;raquo; &amp;mdash; маленькие примеры готовых игр.&lt;/p&gt;
&lt;p&gt;==Минимальный проект==&lt;/p&gt;
&lt;p&gt;Как уже было сказано, XNA включает готовый каркас игрового приложения. Минимальный проект XNA игры в самом начале уже умеет инициализировать окно приложения и инициализировать устройства.&lt;/p&gt;
&lt;p&gt;Основа каркаса – это класс &lt;i&gt;Game&lt;/i&gt;, который используется как базовый в основе каждой игры. Класс Game содержит абстрактные методы типа – Draw, Update, LoadContent, UnloadContent, Initialize и так далее. То есть, каждая конкретная игра наследуется от этого класса&amp;nbsp; и переопределяет важные методы (события сущности Game) своим кодом. Кроме того свойствами базового класса Game выступают такие класы как GameWindow, GraphicDevice и другие.&lt;/p&gt;
&lt;p&gt;Минимальный проект обычно уже умеет крутить игровой цикл, производить очистку экрана заливая приятным цветом, а также закрываться при нажатии определённой кнопки. Далее вам лишь необходимо заполнить методы Update и Draw своим кодом. И осуществить загрузку контента на LoadContent.&lt;/p&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; System;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; System.Linq;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Audio;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Content;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.GamerServices;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Graphics;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Input;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Media;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Net;
&lt;span style=&quot;color: #0030fF; &quot;&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Storage;

&lt;span style=&quot;color: #0030fF; &quot;&gt;namespace&lt;/span&gt; WindowsGame1
{
    &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;class&lt;/span&gt; Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        &lt;span style=&quot;color: #0030fF; &quot;&gt;public&lt;/span&gt; Game1&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            graphics = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; GraphicsDeviceManager&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            Content.RootDirectory = &lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;Content&amp;quot;&lt;/span&gt;;
        }
        &lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Initialize&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            &lt;span style=&quot;color: #808080&quot;&gt;// TODO: Add your initialization logic here&lt;/span&gt;
            base.Initialize&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
        }

        &lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; LoadContent&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            &lt;span style=&quot;color: #808080&quot;&gt;// Create a new SpriteBatch, which can be used to draw textures.&lt;/span&gt;
            spriteBatch = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; SpriteBatch&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GraphicsDevice&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
            &lt;span style=&quot;color: #808080&quot;&gt;// TODO: use this.Content to load your game content here&lt;/span&gt;
        }

        &lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; UnloadContent&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            &lt;span style=&quot;color: #808080&quot;&gt;// TODO: Unload any non ContentManager content here&lt;/span&gt;
        }

        &lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Update&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GameTime gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
          &lt;span style=&quot;color: #808080&quot;&gt;// Allows the game to exit&lt;/span&gt;
          &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GamePad.GetState&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;PlayerIndex.One&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;.Buttons.Back == ButtonState.Pressed&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
            &lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;.Exit&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

          &lt;span style=&quot;color: #808080&quot;&gt;// TODO: Add your update logic here&lt;/span&gt;
          base.Update&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
        }

        &lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GameTime gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            GraphicsDevice.Clear&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Color.CornflowerBlue&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

            &lt;span style=&quot;color: #808080&quot;&gt;// TODO: Add your drawing code here&lt;/span&gt;

            base.Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;==Ближе к делу==&lt;/p&gt;
&lt;p&gt;Несложные игры обычно состоят из таких частей:
&lt;ul&gt;
&lt;li&gt;контент и его загрузка, то главное, из чего состоит игра, картинки, звуки, и так далее;&lt;/li&gt;
&lt;li&gt;вывод графики – 2D или 3D;&lt;/li&gt;
&lt;li&gt;обработка управления – мышка, клавиатура,&amp;nbsp; геймпады;&lt;/li&gt;
&lt;li&gt;вывод аудио – звуки и музыка;&lt;/li&gt;
&lt;li&gt;игровая логика и взаимодействие всего выше перечисленого (это, к счастью, не относится к теме статьи ;));&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Будем разбирать по порядку.&lt;/p&gt;
&lt;p&gt;==Загрузка контента==&lt;/p&gt;
&lt;p&gt;Одна из главных особенностей XNA &amp;mdash; специфическая система работы с контентом.&lt;/p&gt;
&lt;p&gt;Заключается она в наборе специальных &amp;laquo;контент процессоров&amp;raquo; и &amp;laquo;контент импортеров&amp;raquo; (кроме использования стандартных вы можете добавлять и свои).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Задача контент импортеров&lt;/b&gt; &amp;mdash; превращение (на этапе компиляции) контента из внешнего поддерживаемого формата во внутреннее привычное для XNA представление. &lt;/p&gt;
&lt;p&gt;Проще говоря, к примеру добавленные в проект текстуры в формате dds, bmp и png в момент компиляции будут все переведены в один общий для текстур внутренний формат. Такой подход позволяет не зависеть от того в каком виде изначально представлен контент, скажем если вам вдруг понадобилось использовать модели формата Quake3 (.md3), вам нужно будет только написать дополнительный контент импортер, а в конечном виде модели не будут иметь ничего общего с изначальным форматом.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Задача контент процессоров&lt;/b&gt; &amp;mdash; преобразование контента из внутреннего представления (файлов), в объекты управляемого (managed) кода. То есть, по сути сама загрузка контента в память на этапе исполнения.&lt;/p&gt;
&lt;p&gt;Если вам это кажется излишни сложным для начала &amp;mdash; не стоит беспокоится, XNA уже содержит готовые импортеры и процессоры для основных типов контента.&lt;/p&gt;
&lt;p&gt;Обычно контент добавляется в проект через Solution Explorer студии, в специальную папку “Content”. Там же для каждого файла назначается (панель Properties при выборе конкретного файла) тот или иной процессор и импортер. Таки образом студия берёт на себя автоматизацию процесса компиляции контента.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/art_xna_qst_p4.png&quot; alt=&quot;art_xna_qst_p4.png | XNA – Быстрый старт&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Со стороны управляемого кода контент уже представлен классами Texture, Texture2D, Model, ModelMesh, Effect&amp;nbsp; и другими.&lt;/p&gt;
&lt;p&gt;Саму загрузку в коде следует осуществлять при помощи класса ContentManager (уже представленый полем Content класса Game), и советуют её осуществлять в методе LoadContent класса Game (точнее вашего класса &amp;mdash; предка Game).&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;Texture2D myCoolPlayerSprite;  &lt;span style=&quot;color: #808080&quot;&gt;//декларация объекта - текстуры&lt;/span&gt;
Model myCoolModel;  &lt;span style=&quot;color: #808080&quot;&gt;//декларация объекта -  модели&lt;/span&gt;

&lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; LoadContent&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
  spriteBatch = &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; SpriteBatch&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GraphicsDevice&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  &lt;span style=&quot;color: #808080&quot;&gt;//загружаем текстуру с именем SomeTexture в объект myCoolPlayerSprite&lt;/span&gt;
  myCoolPlayerSprite = Content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Texture2D&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;SomeTexture&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  &lt;span style=&quot;color: #808080&quot;&gt;//загружаем модель&lt;/span&gt;
  myCoolModel = Content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Model&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;plane&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;В то же время, если вы испытываете желание работать по старинке, вы можете воспользоваться стандартными&amp;nbsp; средствами .NET для работы с файлами и грузить всё самостоятельно.&lt;/p&gt;
&lt;p&gt;Стандартные импортеры XNA изначально поддерживают такие форматы:
&lt;ul&gt;
&lt;li&gt;текстуры &amp;mdash; bmp, dds, dib, hdr, jpg, pfm, png, ppm, и tga;&lt;/li&gt;
&lt;li&gt;модели &amp;mdash; x, fbx;&lt;/li&gt;
&lt;li&gt;аудио &amp;mdash; wav, mp3(с версии xna 3.0);&lt;/li&gt;
&lt;li&gt;шейдеры &amp;mdash; fx.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Стандартные процессоры:
&lt;ul&gt;
&lt;li&gt;модели;&lt;/li&gt;
&lt;li&gt;текстуры;&lt;/li&gt;
&lt;li&gt;растровые шрифты (автоматическая генерация из системных и на основе текстур);&lt;/li&gt;
&lt;li&gt;эффекты (шейдеры);&lt;/li&gt;
&lt;li&gt;звуки и музыка(класс Song).&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Особняком стоит также система аудио контента на базе Microsoft XACT, но начиная с версии XNA 3.0 кроме этого подхода также обеспечивается параллельно стандартный (такой же как для текстур и моделей) способ работы со звуками.&lt;/p&gt;
&lt;p&gt;==Вывод графики==&lt;/p&gt;
&lt;p&gt;Помимо того, что вам доступен GraphicsDevice &amp;mdash; по сути то же Direct3D устройство, доступное &amp;laquo;любителям попрограммировать на DirectX под с++&amp;raquo;, у нас также есть несколько готовых инструментов от XNA.&lt;/p&gt;
&lt;p&gt;Для 3D &amp;mdash; это группа состоящая из классов: ModelMesh, Model и Effect. А для 2D это специальный класс SpriteBatch.&lt;/p&gt;
&lt;p&gt;Далее коротко обо всём.&lt;/p&gt;
&lt;p&gt;===Вывод 2D графики и текста при помощи SpriteBatch===
&lt;br /&gt; 
&lt;br /&gt;Делается очень просто по средствам класса SpriteBatch. Всё что вам нужно сделать, это создать экземпляр SpriteBatch (в минимальном проекте обычно уже есть один такой).&lt;/p&gt;
&lt;p&gt;При каждом проходе метода Draw:
&lt;ul&gt;
&lt;li&gt;начинаем работу при помощи SpriteBatch.Begin().&lt;/li&gt;
&lt;li&gt;далее нужное вам количество раз вызываем SpriteBatch.Draw() для того, чтобы нарисовать каждый спрайт.&lt;/li&gt;
&lt;li&gt;и в конце при помощи SpriteBatch.End() – завершаем процесс.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt; 
&lt;br /&gt;Метод SpriteBatch.Draw() &amp;mdash; по сути, рисует всю текстуру или её фрагмент на экране.&lt;/p&gt;
&lt;p&gt;В качестве параметров SpriteBatch.Draw() может принимать позицию на экране, где будет выведена текстура, поворот, наклон, масштаб. Также класс SpriteBatch поддерживает автоматическую сортировку по Z координате. Сама текстура передаётся в метод SpriteBatch.Draw() в виде референса на класс Texture2D которые вы предварительно должны были получить, в результате загрузки контента.&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GameTime gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
    GraphicsDevice.Clear&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Color.CornflowerBlue&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    spriteBatch.Begin&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    spriteBatch.Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;myCoolPlayerSprite, &lt;span style=&quot;color: #0030fF; &quot;&gt;new&lt;/span&gt; Vector2&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;10&lt;/span&gt;f, &lt;span style=&quot;color: #F04000; &quot;&gt;10&lt;/span&gt;f&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;, Color.White&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    spriteBatch.End&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    base.Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;SpriteBatch также содержит метод DrawString(), который аналогичен методу Draw(), за исключением того, что вместо текстуры он принимает как параметр растровый шрифт (объект класса SpriteFont), а также строчку текста, которую необходимо вывести.&lt;/p&gt;
&lt;p&gt;===Вывод 3D графики===&lt;/p&gt;
&lt;p&gt;Разработчики XNA решили избавиться от фиксированного графического конвейера, который широко использовался в MDX и MDX2. В XNA используется программируемый графический конвейер, то есть в основе процесса рендеринга &amp;mdash; шейдер (по правде говоря, и в середине SpriteBatch лежит надстройка над конвейером и свой специальный шейдер). Как результат, если вы знакомы с данным подходом, работа с 3Д в XNA для вас не будет сложна.&lt;/p&gt;
&lt;p&gt;Итак, за рендеринг у нас должен отвечать шейдер. К счастью в XNA уже реализован простой шейдер BasicEffect&amp;nbsp; (практически обеспечивает тот минимум, что был доступен с фиксированным конвейером).&lt;/p&gt;
&lt;p&gt;Предварительно добавив модель в контент, и загрузив её, вы уже должны иметь объект класса Model. Такая модель в свою очередь содержит набор мешей (класс ModelMesh).&lt;/p&gt;
&lt;p&gt;Всё, что нам нужно сделать, это перебрать все объекты класса ModelMesh в нашей модели, назначить (обычно он уже назначен) в качестве шейдера &amp;mdash; BasicEffect. Далее, передать в шейдер необходимые параметры (в обязательном порядке &amp;mdash; матрицы View, Projection и World). И в конце вызвать у каждого ModelMesh&apos;а метод Draw.&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GameTime gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
    GraphicsDevice.Clear&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Color.CornflowerBlue&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    foreach &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;ModelMesh mesh in myCoolModel.Meshes&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
    {
        foreach &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;BasicEffect effect in mesh.Effects&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        {
            effect.View = ViewMatrix;
            effect.Projection = ProjectionMatrix;
            effect.World = WorldMatrix;
        }
        mesh.Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
    }
    
    base.Draw&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;==Управление==&lt;/p&gt;
&lt;p&gt;Тут всё предельно просто. Набор классов со статическими методами, и несколько перечислений. А именно &amp;mdash; классы Keyboard, Mouse, GamePad, каждый их них отвечает за своё устройство. У каждого из них есть метод GetState(), который возвращает соответственно KeyboardState, MouseState, GamePadState, содержащие информацию о состоянии устройств ( к примеру позиция Х, Y курсора мыши, или состояние кнопки клавиатуры в текущий момент).&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; Update&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;GameTime gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{

    &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keyboard.GetState&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;.IsKeyDown&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keys.Escape&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        &lt;span style=&quot;color: #0030fF; &quot;&gt;this&lt;/span&gt;.Exit&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keyboard.GetState&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;.IsKeyDown&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keys.Up&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        PlayerPosition.Y -= &lt;span style=&quot;color: #F04000; &quot;&gt;10&lt;/span&gt;f;
    &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keyboard.GetState&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;.IsKeyDown&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keys.Down&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        PlayerPosition.Y += &lt;span style=&quot;color: #F04000; &quot;&gt;10&lt;/span&gt;f;
    &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keyboard.GetState&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;.IsKeyDown&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keys.Left&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        PlayerPosition.X -= &lt;span style=&quot;color: #F04000; &quot;&gt;10&lt;/span&gt;f;
    &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keyboard.GetState&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;.IsKeyDown&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Keys.Down&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
        PlayerPosition.X += &lt;span style=&quot;color: #F04000; &quot;&gt;10&lt;/span&gt;f;

    base.Update&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;gameTime&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Всё, что вам нужно &amp;mdash; в Update проверять состояние устройства, и соотвественно работать с игровой моделью.&lt;/p&gt;
&lt;p&gt;==Аудио==&lt;/p&gt;
&lt;p&gt;Тут у нас хитрая история. Изначально звук в XNA (1.0-2.0) был возможен только при помощи XACT проектов.&lt;/p&gt;
&lt;p&gt;Они создавались в отдельном редакторе, идущем вместе с XNA Game Studio. Такой проект содержал набор аудио файлов(точнее относительных ссылок на них, на диске), набор поименованных сущностей – звуков, каждый соответствовал тому или иному аудио файлу, а то и нескольким (случайный выбор конечного звука по таблице с вероятностями). Привязка звуков к группам (например, &amp;laquo;Музыка&amp;raquo; и &amp;laquo;Эффекты&amp;raquo;, с отдельной регулировкой громкости на каждую). Ну, и так далее.&lt;/p&gt;
&lt;p&gt;&lt;div style=&quot; overflow: auto; overflow-x: scroll hidden; overflow-y:hidden;&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/art_xna_qst_p5.png&quot; alt=&quot;art_xna_qst_p5 | XNA – Быстрый старт&quot; /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;После чего XACT проект добавлялся в игру через специальный процессор и импортер, и работа дальше шла через специальный класс XNA – AudioEngine.&lt;/p&gt;
&lt;p&gt;В версии XNA 3.0 появились новые классы: Song, SoundEffect. Новый контент процессор и импортер к ним (за одно и поддержка mp3 как внешнего формата). Появился класс MediaPlayer для воспроизведения музыки (с поддержкой очереди песен).&lt;/p&gt;
&lt;p&gt;Работа со звуком упростилась, и в принципе стала на уровень с текстурами и моделями. Всё, что нужно – добавить звук в контент, установить нужный контент процессор/импортер, установить нужное имя (asset name), в коде загрузить в объект нужного типа, когда нужно – воспроизвести.&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;SoundEffect myCoolSfx;
Song mySuperSong;

&lt;span style=&quot;color: #0030fF; &quot;&gt;protected&lt;/span&gt; override &lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; LoadContent&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;{
   Content.RootDirectory = &lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;Content&amp;quot;&lt;/span&gt;;
   myCoolSfx= Content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;SoundEffect &lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;sfx2&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
   mySuperSong= Content.Load&lt;span style=&quot;color: #a06000&quot;&gt;&amp;lt;&lt;/span&gt;Song&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;song1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;На этом с основными частями всё, конечно, каждый пункт можно раскрыть подробней, что возможно и будет сделано в будущем.&lt;/p&gt;
&lt;p&gt;Напоследок ещё пару важных пунктов.&lt;/p&gt;
&lt;p&gt;==Запуск игры на машине пользователя==&lt;/p&gt;
&lt;p&gt;Для запуска на машине (Windows/PC) конечного пользователя, предварительно нужно установить:
&lt;ul&gt;
&lt;li&gt;.NET framework 2.0 Redistrubutable;&lt;/li&gt;
&lt;li&gt;XNA Redistrubutable соответствующей версии;&lt;/li&gt;
&lt;li&gt;Свежий выпуск DirectX Redistrubutable.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Кроме того, пользователь должен обладать видео-картой с поддержкой шейдеров 1.1 минимум.&lt;/p&gt;
&lt;p&gt;==Ccылки==&lt;/p&gt;
&lt;p&gt;Последняя версия XNA Game Studio на данный момент, а именно 3.1, доступна &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=80782277-d584-42d2-8024-893fcd9d3e82&quot;&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;XNA 3.1 Redistrubutable &amp;mdash; необходимый конечному пользователю, &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=53867a2a-e249-4560-8011-98eb3e799ef2&amp;amp;displaylang=en&quot;&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Также работает официальный ресурс (от Microsoft, помимо раздела в MSDN) посвящённый XNA: &lt;a href=&quot;http://creators.xna.com&quot;&gt;http://creators.xna.com&lt;/a&gt;, где вас ждёт множество примеров и уроков по XNA.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/Game_Studio_3_1</guid>
  <pubDate>Fri, 12 Jun 2009 08:53:22 GMT</pubDate>
  <title>XNA Game Studio 3.1 вышла в свет</title>
  <link>http://xna.gamedev.ru/blog/Game_Studio_3_1</link>
  <comments>http://xna.gamedev.ru/forum/?id=119819</comments>
  <category>xact</category>
  <category>Xbox</category>
  <category>XNA</category>
  <category>XNA Game Studio</category>
  <description>
&lt;p&gt;XNA Game Studio 3.1 вышла в свет. Данная версия сопровождается следующими нововведениями:
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Поддержка Avatar API&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Поддержка Xbox LIVE Party:&lt;/b&gt; обеспечивает общение между игроками, 
&lt;br /&gt;не зависимо от того в какую игру каждый играет в данный момент.&amp;nbsp; Голосовая связь на 
&lt;br /&gt;группу до 8 человек, которая обеспечивается&amp;nbsp; постоянно, до запуска игр, во время работы игр, 
&lt;br /&gt;и при смене.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Воспроизведение видео:&lt;/b&gt;
&lt;br /&gt;&amp;nbsp;  - Полноэкранное воспроизведение видео.
&lt;br /&gt;&amp;nbsp;  - Воспроизведении видео на простые текстуры прям в игре.
&lt;br /&gt;&amp;nbsp;  - Включает возможность управлять воспроизведением (поставить на паузу/восстановить, остановить).
&lt;br /&gt;&amp;nbsp;  - Доступ к информации о видео - длительность по времени, размер, частота кадров.
&lt;br /&gt;&amp;nbsp;  - Определение типа аудиотрека (диалог/музыка/музыка и диалог).
&lt;br /&gt;&amp;nbsp;  - Одновременное воспроизведение множества видео потоков.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Audio API 3.1:&lt;/b&gt; Новый вариант использования SoundEffect.Play. Экземпляр звукового эффекта
&lt;br /&gt;создаётся при вызове Play и автоматически освобождается по завершению воспроизведения. 
&lt;br /&gt;SoundEffect.Play возвращает Boolean тип (возвращает false в случае ошибки при воспроизведении).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Улучшения в Content Pipeline&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Поддержка XACT3:&lt;/b&gt; Возможность задействовать фильтр на каждый трек, поддержка 
&lt;br /&gt;формата xWMA - формата сжатия для ASF(WMA,WMV) контейнеров.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Изменения в Visual Studio:&lt;/b&gt; XNA Game Studio 3.1 поддерживает как проекты версии 3.0,
&lt;br /&gt;так и проекты 3.1. В добавок поддерживается конвертация проектов версии 3.0 в версию 3.1&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=80782277-d584-42d2-8024-893fcd9d3e82&quot;&gt;Скачать XNA Game Studio 3.1 можно тут.&lt;/a&gt;
&lt;br /&gt;&lt;a href=&quot;http://creators.xna.com/en-us/news/xnagamestudio3.1&quot;&gt;Официальная новость, описание нововведений на английском.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Перед установкой - необходимо де-инсталлировать XNA Game Studio 3.0.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=3180</guid>
  <pubDate>Fri, 31 Oct 2008 02:27:26 GMT</pubDate>
  <title>XNA 3.0 final</title>
  <link>http://xna.gamedev.ru/blog/?id=3180</link>
  <comments>http://xna.gamedev.ru/forum/?id=88579</comments>
  <category>XNA</category>
  <description>
&lt;p&gt;Финальная XNA 3.0 стала доступна для скачивания. Подробнее на creators.xna.com&lt;/p&gt;
&lt;p&gt;Требования - &lt;/p&gt;
&lt;p&gt; * Windows Vista Service Pack 1 или Windows XP Service Pack 3
&lt;br /&gt; * Visual C# 2008 Express Edition или Visual Studio 2008 Standard Edition или выше
&lt;br /&gt; * Видео карта с поддержкой DirectX 9.0c и Shader Model 1.1 (Shader Model 2.0 рекомендуется)
&lt;br /&gt; * Прямые руки...&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;&lt;a href=&quot;http://creators.xna.com&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/xna30.jpg&quot; alt=&quot;xna30 | XNA 3.0 final&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=3142</guid>
  <pubDate>Fri, 19 Sep 2008 12:37:31 GMT</pubDate>
  <title>XNA 3.0 beta</title>
  <link>http://xna.gamedev.ru/blog/?id=3142</link>
  <comments>http://xna.gamedev.ru/forum/?id=85787</comments>
  <category>XNA</category>
  <description>
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/xna.png&quot; alt=&quot;xna | XNA 3.0 beta&quot; /&gt;&lt;/p&gt;
&lt;p&gt;XNA 3.0 beta стала доступна для скачивания. Подробнее на &lt;a href=&quot;http://creators.xna.com&quot;&gt;creators.xna.com&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=3002</guid>
  <pubDate>Mon, 02 Jun 2008 21:02:55 GMT</pubDate>
  <title>GodRays (XNA)</title>
  <link>http://xna.gamedev.ru/blog/?id=3002</link>
  <comments>http://xna.gamedev.ru/forum/?id=84687</comments>
  <category>godrays</category>
  <category>XNA</category>
  <description>
&lt;p&gt;&lt;a href=&quot;http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=GodRays&quot;&gt;GodRays&lt;/a&gt; в исполнении Alex Urbano &amp;#193;lvarez. 
&lt;br /&gt;Пример адаптирован для XNA по материалам GPU Gems 3 (Volumetric Light Scattering as a Post-Process)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/godrayshigh.jpg&quot; alt=&quot;godraysHigh | GodRays (XNA)&quot; /&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=2982</guid>
  <pubDate>Mon, 26 May 2008 10:22:09 GMT</pubDate>
  <title>MD5 модели (XNA)</title>
  <link>http://xna.gamedev.ru/blog/?id=2982</link>
  <category>md5</category>
  <category>XNA</category>
  <description>
&lt;p&gt;&lt;a href=&quot;http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=MD5Loader&quot;&gt;MD5 импортер&lt;/a&gt; от Javier Cant&amp;#243;n. Пока бэта, но рабочая.&lt;/p&gt;
&lt;p&gt;Модели например из Doom3 можно теперь запросто использовать. Скин анимации. Материалы с NormalMapping или ParallaxMapping. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/md5_screenshot1.jpg&quot; alt=&quot;md5_screenshot1 | MD5 модели (XNA)&quot; /&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/articles/?id=2980</guid>
  <pubDate>Sun, 25 May 2008 04:31:20 GMT</pubDate>
  <title>Виртуализация графического устройства в XNA 2.0</title>
  <link>http://xna.gamedev.ru/articles/?id=2980</link>
  <description>
&lt;p&gt;Во второй версии XNA, графический девайс стал полностью виртуальным. Если кратко, то вам больше никогда не потребуется заботиться о многих вещах, о которых приходилось думать ранее.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;Теперь по-порядку...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Как было раньше (XNA 1.0)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Когда ваша игра стартует, происходит вызов метода LoadGraphicsContent(true), который отвечает за загрузку контента и создание ваших ресурсов. (textures, vertex buffers, rendertargets, и т.д.)&lt;/p&gt;
&lt;p&gt;Если во время игры происходит переход между оконным и полноэкранным режимами, а так же если было нажатие alt+tab и еще в ряде некоторых случаев - графическое устройство получает статус lost (потерянного) и нуждается в пересоздании. Использовать потерянный девайс разумеется нельзя и по этому, все вызовы к нему приостанавливаются и далее происходит создание нового устройства, по завершении которого некоторые типы ресурсов так же будут нуждаться в пересоздании. &lt;/p&gt;
&lt;p&gt;&amp;mdash; Большинство текстур, вершинных и индексных буферов, и т.д. остаются валидными. &lt;/p&gt;
&lt;p&gt;&amp;mdash; Все текстуры, буферы и др. ресурсы, созданные с использованием ResourceManagementMode.Manual - будут уничтожены&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&amp;mdash; Все рендер таргеты так же будут уничтожены.&lt;/p&gt;
&lt;p&gt;Когда такое происходит, XNA вызывает метод LoadGraphicsContent(false), который должен пересоздать все ресурсы загружаемые в режиме ResourceManagementMode.Manual.&lt;/p&gt;
&lt;p&gt;Многих такой подход вводил в заблуждение, так как не всегда можно было четко определить какой ресурс восстановит XNA, а какой нужно восстанавливать самому. Кроме этого, необходимо было заменить все ссылки на старые ресурсы - новыми, и если ваша игра использовала одни и те же ресурсы в разных местах, то процесс такой замены становился совсем не тривиальной задачей... &lt;/p&gt;
&lt;p&gt;Гораздо более сложная проблема возникает когда пользователь перетаскивает окно игры с одного экрана на другой (когда два монитора в системе). В таких случаях уничтожаются вообще все ресурсы, даже те, которые были созданы в режиме ResourceManagementMode.Automatic. Кроме этого, сам графический девайс то же должен быть полностью пересоздан (создается новый экземпляр объекта GraphicsDevice) и все ваши ссылки на старый девайс становятся инвалидными. Получить ссылку на новый экземпляр девайса можно было с помощью интерфейса IGraphicsDeviceService или используя класс GraphicsDeviceManager. Тут смысл в том, что правильнее будет использовать не прямые ссылки на девайс а получать референс на него используя тот же менеджер, например. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Как работает теперь (XNA 2.0)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Во второй версии XNA, и сам графический девайс и все его ресурсы постоянно остаются валидными. Тут нет необходимости заботиться о восстановлении ссылок на мертвые ресурсы, плюс к этому, на объект класса GraphicsDevice можно ссылаться где угодно и сколько угодно. Метод LoadContent, который раньше был LoadGraphicsContent, теперь вызывается только один раз - в момент старта игры. &lt;/p&gt;
&lt;p&gt;Разумеется все проблемы с ресурсами из первой версии XNA не исчезли сами по себе и во второй версии. Внутренняя логика работы с ресурсами была полностью переделана, теперь, если происходит сброс (потеря) устройства, XNA сама создаст новый ресурс и скопирует в него все данные из старого. После чего, у владельца этого ресурса будет заменена ссылка на него. (Все классы ресурсов в XNA являются обычными обертками и просто хранят ссылку на unsafe объект, именно эта ссылка и будет заменена) &lt;/p&gt;
&lt;p&gt;Однако, тут есть один момент. Некоторые типы ресурсов просто технически невозможно восстановить автоматом. Это относиться к ресурсам, которые постоянно обновляются из клиентского кода или с помощью GPU.&lt;/p&gt;
&lt;p&gt;1. DynamicVertexBuffer 
&lt;br /&gt;2. DynamicIndexBuffer
&lt;br /&gt;3. RenderTarget*
&lt;br /&gt;4. ResolveTexture2D&lt;/p&gt;
&lt;p&gt;Трудность автоматической реконструкции таких ресурсов в том, что они так же как и остальные ресурсы, создаются в памяти самой видеокарты, чтение из которой или очень затруднено по причинам производительности или вообще невозможно. И если со статическими данными все понятно (они создаются один раз и больше не меняются), то с динамическими, нельзя быть уверенным о свежести самих этих данных в момент сброса, так как логика их обновления определяется клиентским кодом.&lt;/p&gt;
&lt;p&gt;Звучит это может и страшно, но пугаться все же не стоит. Единственное о чем придется заботиться, это о повторном наполнении контентом таких ресурсов, сами экземпляры классов останутся валидными. Вы проверяете состояние &amp;quot;потерянности&amp;quot; ресурса используя новое свойство IsContentLost, и дальше принимаете решение запускать ваши алгоритмы реинкарнации или нет. Оживлять вам придется только сам динамический контент ресурса, все остальное (его размеры, формат и др.) останутся прежними. &lt;/p&gt;
&lt;p&gt;Приведем пример: &lt;/p&gt;
&lt;p&gt;Если ваша игра использует рендер таргеты для отрисовки теней или может для пост эффектов, то об новом заполнении данными таких таргетов, в момент сброса устройства, не стоит заботиться вообще, так как их наполнение происходит и так каждый кадр. &lt;/p&gt;
&lt;p&gt;В случае если обновление происходит реже одного раза за кадр, то новое свойство IsContentLost вам в помощь ... аминь&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Как это работает на&amp;nbsp; Xbox&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;На Xbox нет мультизадачной операционной системы и большинство ситуаций потери устройства просто не имеют место быть. Тут только одна задача может выполняться в один момент времени (не путать с потоками ею порожденными), соответственно ваша игра будет полноправным владельцем графического устройства и о его сбросах, вызванных внешними причинами, можно просто забыть. &lt;/p&gt;
&lt;p&gt;Метод LoadGraphicsContent (или LoadContent во второй версии XNA ) вызывается только один раз, в момент старта. Так что при создании Xbox-овой версии XNA&amp;nbsp; нам не пришлось заниматься проблемой виртуализации графического устройства...&lt;/p&gt;
&lt;p&gt;Источник: &lt;a href=&quot;http://blogs.msdn.com/shawnhar/default.aspx&quot;&gt;Shawn Hargreaves Blog&lt;/a&gt; (один из разработчиков XNA).&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=2978</guid>
  <pubDate>Sat, 24 May 2008 22:06:35 GMT</pubDate>
  <title>SpeedTrees (XNA)</title>
  <link>http://xna.gamedev.ru/blog/?id=2978</link>
  <category>XNA</category>
  <description>
&lt;p&gt;Очередной пример от Alex Urbano - &lt;a href=&quot;http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=TreesAnimation&quot;&gt;анимированные деревья + инстансинг&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/animtreeshigh.jpg&quot; alt=&quot;animTreesHigh | SpeedTrees (XNA)&quot; /&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=2974</guid>
  <pubDate>Sat, 24 May 2008 13:22:41 GMT</pubDate>
  <title>AtmosphericScattering (XNA)</title>
  <link>http://xna.gamedev.ru/blog/?id=2974</link>
  <category>atmospheric</category>
  <category>scattering</category>
  <category>XNA</category>
  <description>
&lt;p&gt;&lt;a href=&quot;http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=Componentes&quot;&gt;AtmosphericScattering&lt;/a&gt; от Alex Urbano.
&lt;br /&gt;Исходники (C#+XNA, HLSL) прилагаются.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/skydome.jpg&quot; alt=&quot;skyDome | AtmosphericScattering (XNA)&quot; /&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=2968</guid>
  <pubDate>Thu, 22 May 2008 14:06:03 GMT</pubDate>
  <title>SSSM (XNA)</title>
  <link>http://xna.gamedev.ru/blog/?id=2968</link>
  <category>map</category>
  <category>screen</category>
  <category>тени</category>
  <category>space</category>
  <category>XNA</category>
  <description>
&lt;p&gt;Alex Urbano Alvarez &lt;a href=&quot;http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=SSSM&quot;&gt;написал пример&lt;/a&gt; использования Screen Space Shadow Map для XNA. (C# + HLSL 2.0)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;DownloadId=34959&quot; alt=&quot;Изображение&quot; /&gt; &lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=2956</guid>
  <pubDate>Sun, 18 May 2008 07:19:21 GMT</pubDate>
  <title>SSAO (XNA)</title>
  <link>http://xna.gamedev.ru/blog/?id=2956</link>
  <category>SSAO</category>
  <category>XNA</category>
  <description>
&lt;p&gt;Alex Urbano Alvarez написал &lt;a href=&quot;http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=SSAO&quot;&gt;демку&lt;/a&gt; использования сабжа для XNA. (C# + HLSL 3.0)&lt;/p&gt;
&lt;p&gt;В основе реализации - &lt;a href=&quot;http://rgba.scenesp.org/iq/computer/articles/ssao/ssao.htm&quot;&gt;iсigo quilez: Screen Space Ambien Occlusion&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;DownloadId=32519&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=2930</guid>
  <pubDate>Fri, 25 Apr 2008 23:11:22 GMT</pubDate>
  <title>Особенности быстродействия GPU</title>
  <link>http://xna.gamedev.ru/blog/?id=2930</link>
  <category>GPU</category>
  <description>
&lt;p&gt;На сайте &lt;a href=&quot;http://www.xnadev.ru&quot;&gt;xnadev.ru&lt;/a&gt; опубликована статья об особенностях быстродействия GPU и способах её оптимизации..&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=2925</guid>
  <pubDate>Wed, 23 Apr 2008 12:55:11 GMT</pubDate>
  <title>КРИ + XNA + Visual3D.NET</title>
  <link>http://xna.gamedev.ru/blog/?id=2925</link>
  <comments>http://xna.gamedev.ru/forum/?id=79750</comments>
  <category>visual3d.net</category>
  <category>XNA</category>
  <category>КРИ</category>
  <description>
&lt;p&gt;Ролик о XNA презентации на КРИ 2008. &lt;a href=&quot;http://www.daybreak.ru/download/xna_kri.avi&quot;&gt;качать тут&lt;/a&gt;. (80 мб)&lt;/p&gt;
&lt;p&gt;На видео рассказывается об одном из первых серьезных продуктов для XNA - Visual 3D&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/xna_kri1.jpg&quot; alt=&quot;xna_kri1 | КРИ + XNA + Visual3D.NET&quot; /&gt; &lt;img src=&quot;http://www.gamedev.ru/files/images/xna_kri3.jpg&quot; alt=&quot;xna_kri3 | КРИ + XNA + Visual3D.NET&quot; /&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=2924</guid>
  <pubDate>Wed, 23 Apr 2008 11:37:02 GMT</pubDate>
  <title>C# порт физического движка Box2D</title>
  <link>http://xna.gamedev.ru/blog/?id=2924</link>
  <category>box2d</category>
  <category>портирование</category>
  <category>С#</category>
  <category>физический движок</category>
  <description>
&lt;p&gt;Игорь Колосовский сделал порт физического 2D движка &lt;a href=&quot;http://www.box2d.org&quot;&gt;Box2D&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;Портирование выполнено с языка С++ с использованием чиcтого C#. Это значит что этот двиг можно использовать не только для 2D игр XNA, но и для игр на Tao framework и для Silverlight..&lt;/p&gt;
&lt;p&gt;Список фич посмотреть и скачать все необходимое можно на &lt;a href=&quot;http://code.google.com/p/box2dx/&quot;&gt;странице проекта&lt;/a&gt;... &lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;&lt;div style=&quot; overflow: auto; overflow-x: scroll hidden; overflow-y:hidden;&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/box2d.jpg&quot; alt=&quot;box2d | C# порт физического движка Box2D&quot; /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=2168</guid>
  <pubDate>Mon, 11 Dec 2006 14:38:42 GMT</pubDate>
  <title>Релиз XNA Game Studio Express 1.0 и XNA Framework 1.0</title>
  <link>http://xna.gamedev.ru/blog/?id=2168</link>
  <description>
&lt;p&gt;&lt;img src=&quot;http://msdn.microsoft.com/directx/art/Hero/XNA_Hero_Banner2.jpg&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;XNA Game Studio Express 1.0 (81.1 MB)
&lt;br /&gt;&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyId=A73A7E71-FF41-432D-A0EB-043E904A1905&amp;displaylang=en&quot;&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=A73A7E71&amp;hellip; isplaylang=en&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;XNA Framework 1.0 (1.9 MB)
&lt;br /&gt;&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyId=2E136A1F-F187-478C-9DA5-AAEB0904782B&amp;displaylang=en&quot;&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=2E136A1F&amp;hellip; isplaylang=en&lt;/a&gt;
&lt;br /&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.xnadev.ru/modules.php?name=Forums&amp;file=viewtopic&amp;t=223&quot;&gt;Обсудить на форуме XNADEV.RU&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://xna.gamedev.ru/blog/?id=1178</guid>
  <pubDate>Mon, 11 Dec 2006 02:36:16 GMT</pubDate>
  <title>Документация по XNA в online-библиотеке MSDN</title>
  <link>http://xna.gamedev.ru/blog/?id=1178</link>
  <category>XNA</category>
  <description>
&lt;p&gt; До выхода финальной версии&amp;nbsp; XNA Game Studio Express и&amp;nbsp; XNA Framework 1.0 осталось ещё около суток, но в библиотеке для разработчиков MSDN уже появился&amp;nbsp; раздел посвящённый XNA Game Studio Express в котором можно найти документации по финальной версии XNA GSE. Думаю это порадует тех кто не смог/не сможет поставить полную версию XNA Game Studio Express в связи с отсутствием Visual C# 2005 Express.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://msdn2.microsoft.com/en-us/library/bb200104.aspx&quot;&gt;http://msdn2.microsoft.com/en-us/library/bb200104.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.xnadev.ru/_Content/Mikx/News/XNA_on_MSDN.gif&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;</description>
</item>
</channel>
</rss>

