Главная
страница 1

1. ВВЕДЕНИЕ 2

История 3Д графики 2

2. Основные понятия 3Д графики 4

Буфер шаблонов 5

3. Этапы визуализации сцены. 9

   Триангуляция (Triangle setup) 9

   Обработка вертексов (Vertex processing). 9

Трансформация вида (Viewing transformation) 9

Проекция сцены (Projection transformation) 9

Отсечение невидимых частей (Clipping) 10

(Rasterization) Растеризация. 10

(Pixel processing) Обработка пикселей 10

4. Текстурирование 11

   Общие представления о текстурах 11

    Проблемы с текстурами 12

  Фильтрация и MIP Mapping 12

   Процедурные текстуры (Закепчерить из Genetica 2 Pro ) 14

5. Обработка света. 15

Ray Tracing (трассировка лучей) 15

Radiosity http://en.wikipedia.org/wiki/Photon_mapping 15

Photon mapping 15

Lightmap (световые карты) 15

Shadow volumes (теневые объемы) 15

Shadow mapping 16

6. Дополнительные методы 17

NURBS 17


Voxel 17

7. 3D API 19

OpenGL http://en.wikipedia.org/wiki/OpenGL 19

    Direct3D http://en.wikipedia.org/wiki/Direct3D_10 19

Glide http://en.wikipedia.org/wiki/Glide_API 20

Заключение. 21


1. ВВЕДЕНИЕ


Что такое трехмерная графика? Определений этого понятия существует достаточно много. Трёхмерная графика — раздел компьютерной графики, охватывающий алгоритмы и программное обеспечение для оперирования объектами в трёхмерном пространстве, а также результат работы таких программ. Слишком формально? Хорошо, предложим другое определение: «3D графика предназначена для имитации фотографирования или видеосъемки трехмерных образов объектов, предварительно подготовленных в памяти компьютера». Сейчас мы проведём небольшой экскурс в историю 3D графики и расскажем о наиболее выдающихся личностях и технологических решениях, заложивших фундамент современной 3D индустрии. {появляется сначала плоскость, которая потом вытягивается в кубик, всё вращается и светится счастьем, все довольны, громкие и продолжительные аплодисменты, вокруг кубика летают буквы 3D}

История 3Д графики

Одним из отцов компьютерной графики специалисты называют Ивана Сазерленда, который, будучи аспирантом, в 1962 году написал программу Sketchpad, позволявшую создавать простые трехмерные объекты. После защиты диссертации на тему «Наука компьютерной графики» Сазерленд и доктор Дэвид Эванс (David Evans) открывают в университете города Юты первую кафедру компьютерной графики. {Было бы неплохо найти их фотографии}

Среди студентов кафедры оказался и Эд Катмулл (Еd Catmull), ныне технический директор корпорации Pixar. Именно Эд Катмул впервые смоделировал объект. В качестве предмета для моделирования выступила кисть его собственной руки. Между прочим, Джим Блинн (Jim Blinn), создатель bump mapping (техника симуляции неровностей) и environment mapping, первых компьютерных анимаций для NASA и, конечно же, знаменитого материала blinn, являлся студентом Ивана Сазерленда. Сумасшедшая концентрация интеллектуальной энергии в районе университета Юты, по-видимому, никому не давала спать спокойно и просто-таки заставляла людей безудержно мыслить и творить. Например, техника Phong shading была разработана вьетнамским тридэшником Би Тюн Фонгом (Bui Tuong Phong), который также являлся студентом кафедры компьютерной графики в Юте. А принцип Gouraud shading родился в голове французского ученого Анри Гюра (Henri Gouraud), работавшего там преподавателем. {фрагменты пиксаровских мультиков: Toy Story, про птичег, The Cars} (http://www.pixar.com/companyinfo/about_us/overview.htm)

Поговорим теперь о системах моделирования – то, с чего начиналась разработка нынешних 3Д-пакетов. Во-первых, стоит отметить систему моделирования, разработанную компанией MAGI (http://accad.osu.edu/~waynec/history/tree/magi.html). Она являлась процедурной – модели создавались путем комбинирования 25 геометрических фигур, имевшихся в библиотеке программы. Из простейших фигур, вроде пирамиды, сферы и цилиндра создавались более сложные, которые впоследствии становились основой для конечной 3D-модели. Программа Synthavision разрабатывалась в течение пяти лет и была использована при создании знаменитого киношедевра «Трон» (1982).{надо бы поискать скриншоты из этой программы и сделать нарезки из фильма} (http://accad.osu.edu/~waynec/history/tree/magi.html) (http://www.tron-movie.com/production/index.html) (http://accad.osu.edu/~waynec/history/tron.html) (http://www.pixar.com/companyinfo/about_us/execs.htm)

Во-вторых, следует рассказать о компании Triple–I (http://accad.osu.edu/~waynec/history/tree/iii.html), которая также внесла огромный вклад в развитие 3D технологий. Компания была открыта в 1962 году и изначально специализировалась на производстве оборудования для сканирования видеоматериала. В 1975 году руководство компании открывает отделение компьютерной графики и анимации. В отличие от компании MAGI, использовавшей геометрические фигуры, Triple-I задействовала в качестве простейших единиц треугольники и квадраты. Такой метод моделирования получил название «полигонального». Компания Triple-I также принимала участие в работе над фильмом «Трон». (тоже кадры из трона)

Очень интересным и мощным коммерческим программным решением следует признать PowerAnimator от Alias. Именно PowerAnimator является одним из предков Maya, программы, с которой знаком, хотя бы по названию, любой современный тридэшник. PowerAnimator представлял собою дорогостоящий программный комплекс, работавший на графических станциях SGI под операционной системой Irix (Unix-оподобной ОС для графической обработки). PowerAnimator впервые был масштабно использован в фильме «Бездна» Джеймса Кэмерона, который получил оскар за визуальные эффекты в 1990 году, а также множество других наград. Явление народу программы Maya версии 1.0 произошло в феврале 1998 года. Maya 1.0 соединила в себе достоинства трех следующих программных пакетов: The Advanced Visualizer (визуализация), Thomson Digital Image (моделирование) и Power Animator (анимация). (кортинге в папге PowerAnimator MAYA)

Программа 3D Studio компании Autodesk в версии для операционной системы DOS начала разрабатываться в 1993 году. А время всеми известного 3Ds MAX наступит лишь через три с лишним года. Приставка MAX в названии означала максимальное расшириние возможностей пакета, освобождение от досовских ограничений, а самое главное наличие полноценного 32-разрядного интерфейса. {3DS MAX, работа в нём}

Кроме Maya и 3Ds MAX устойчивыми лидерами в области являются Lightwave, XSI и Houdini. Тем не менее, уверенно набирают популярность и открытые продукты, распространяемые бесплатно, например, полнофункциональный пакет Blender3D и Wings3D или прекрасный визуализатор POV-Ray, который вырос из небольшой программы, написанной для компьютера Amiga в 1986 году на языке С.



2. Основные понятия 3Д графики


Перейдём к основным понятиям 3D графики.



Основным понятием при построении 3Д объектов является полигон.

Полигон (polygon) – треугольник, задаваемый координатами трёх точек в трёхмерном пространстве. Он является базовым геометрическим примитивом в 3D-графике. В более широком смысле слова полигон – произвольный плоский многоугольник. Но в 3D-графике это понятие сужают до треугольника, т.е. до наиболее простой плоской фигуры, легче всего поддающейся расчётам (по трём точкам задаётся плоскость). Хотя иногда применяются и другие многоугольники в качестве геометрических примитивов.

Вертекс (vertex) – вершина (точка) полигона, задаётся тремя координатами. В принципе, всю полигональную сетку 3D-модели можно было бы задать массивом полигонов, каждый из которых в свою очередь представлял бы массив из трёх вертексов, а вертекс – массив из трёх координат. Но чувствуется, что как-то это все громоздко, слишком много избыточности в информации, ведь соседние полигоны примыкают друг к другу, т.е. имеют общие вершины. Поэтому в большинстве случаев пользуются иным представлением. Попросту создаётся массив всех вертексов модели (вертексы в нём уже не повторяются, как это было в описанном выше представлении), затем каждому вертексу ставится в соответствие определённое число – индекс, и вся модель представляется массивом этих индексов. Этот способ значительно экономит место. Вертекс – понятие, аппаратно поддерживаемое современными бюджетными видеокартами. Аппаратная поддержка реализована в виде вертексного (вершинного) конвейера, где с вертексами производятся различные скоростные операции (Например, это могут координатные преобразования, вследствие перемещения или вращения объектов.).{появляются точки на концах полигона, потом всё пространство делится на координатную сетку 3-хмерную, камера вращается, у вертексов появляются массивы координат}

Текстура (texture)– плоское изображение, натягиваемое на полигон или несколько полигонов. Процесс заполнения полигона текстурой иногда называют wrapping-ом (обертыванием). {полигональное тело вращается – firm ware – на него накладывается текстурка (2жды рендерится одной и то же видео)}

Тексель (texel) – точка на поверхности текстуры. Из таких точек состоит всё изображение текстуры . {на объект указывает стрелка, подсвечивается определённый элемент текстуры }

Пиксель (pixel) (pixel, расшифровывается как PICture'S ELement, элемент изображения). – всем привычное название единичной точки, отображаемой на мониторе в конкретном месте. Кроме этого представления понятия пикселя, в трехмерной графике существуют еще два: пиксель – это адресуемый элемент буфера кадра или пиксель - это точка плоскости, на которую производится проекция трехмерной сцены после проведения всех требуемых вычислительных операций. Пиксель – понятие, аппаратно поддерживаемое современными бюджетными видеокартами. Аппаратная поддержка реализована в виде пиксельного конвейера, где с пикселями производятся различные скоростные операции (в основном это различные эффекты типа затуманивания, наложения шаблонов и т.д.).

Буфер кадра – (Frame buffer) Специально отведенная область памяти компьютера или отдельной платы для временного хранения данных о пикселях, требуемых для отображения одного кадра (полного изображения) на экране монитора. Емкость буфера кадра определяется количеством битов, задействованных для определения каждого пикселя, который должен отображать изменяемую область или количество цветов и их интенсивность на экране. (приблизить до жирного пикселя и показать, сколько памяти на него отводится (trans. Eff. :: zoom + export frame))

Буфер глубины (или Z-буфер) - используется главным образом для определения перекрывающихся частей полигонов, составляющих ЗD-модель. В более сложных случаях он используется специальным алгоритмом для удаления невидимых линий (поверхностей). В общем случае представляет собой двухмерный массив, содержащий значения глубины расположения соответствующей точки на экране (Z-координату). В результате программа путем простого сравнения глубины расположения точек полигонов узнает, точку какого из них необходимо отобразить.

Буфер шаблонов


Буфер шаблонов (Stencil buffer) достаточно недавно получил распространение в игровых ЗD-акселераторах. Принципиально, что, как и Z-буфер, он представляет собой двухмерный массив с размерностью равной текущему разрешению кадрового буфера. Используется для некоторых специфических эффектов при растеризации изображения. Например, можно производить вывод окончательного изображения в кадровый буфер только в тех точках, для которых в буфере шаблонов записана некоторая определенная величина. Буфер шаблонов будет упоминаться при рассказе об алгортме теневых объемов, в разделе «освещение».

Шейдер (shader) – графическая микропрограмма для CPU или GPU. Служит для определения окончательных параметров объекта или изображения. Это может включать в себя произвольной сложности описание поглощения и рассеяния света, наложения текстуры, отражение и преломление, затенение, смещение поверхности и эффекты пост-обработки. Различают вертексные (вершинные) и пиксельные (фрагментные) шейдеры. {шейдерный объект}

Вершинные шейдеры - это программы, выполняемые видеочипами, которые производят математические операции с вершинами (vertex), иначе говоря, они предоставляют возможность выполнять программируемые алгоритмы по изменению параметров вершин и их освещению (T&L - Transform & Lighting). Вершинные шейдеры, в зависимости от алгоритмов, изменяют эти данные в процессе своей работы, например, вычисляя и записывая новые координаты и/или цвет. То есть, входные данные вершинного шейдера - это данные об одной вершине геометрической модели, которая в данный момент обрабатывается. Очень простой и грубый (но наглядный) пример: вершинный шейдер позволяет взять 3D объект сферы и сделать из него красный куб.
Сцена "ToyShop" от разработчиков компании ATI, содержит в общей сложности около 500 специально для нее написанных шейдеров.

Больше половины из них используется для рисования дождя и сопутствующих эффектов, примерно 1/3 для рисования теней, отражений

1/6 - это постобработачные эффекты и наконец небольшое количество шейдеров для рисования частиц.

Пиксельные шейдеры позволяют программисту по шагам управлять процессом наложения текстур, определения глубины и вычисления цвета пикселей. Что это дает? Во-первых, можно создавать в играх per-pixel lighting, т.е. попиксельное освещение. Во-вторых, позволяет создавать красивые эффекты с частицами (например, огонь, дым, капли дождя). Благодаря пиксельным шейдерам, кожа персонажей стала выглядеть естественнее, в играх можно наблюдать реалистичную поверхность воды, а также создавать определенные эффекты разрушения. В этом примере из игры F.E.A.R. мы наблюдаем применение трех пиксельных шейдеров: parallax-mapping для создания эффекта глубины, система частиц для отлетающих камней и для создания пыли. А в этом примере мы видим, что дырка в стене не объемна, а является лишь сгенирированной шейдером двухмерной картинкой.



(Anti-aliasing) Фильтрация-Сглаживание

Явление Aliasing (которое в общем случае можно перевести, как «помеха дискретизации») возникает из-за несоответствия изображения рельного объекта и его представления в компьютере. В реальном мире объекты имеют сглаженные линии и контуры, монитор же может отображать лишь дискретные точки, т.е. пиксели. Так как пиксели имеют форму квадратов и равномерно закращиваются определенным цветом, линии объктов становятся зубчатыми или иначе говоря, ступенчатыми.

Для борьбы с этой проблемой существует простейший метод – увеличение разрешения экрана, однако это неполное ее решение, так как мы не можем увеличивать разрешение до бесконечности. Зато можно применить алгоритм Supersampling, т.е дополнительную дискретизацию. Пиксель как бы разбивается на некоторое множество подпикселей и для каждого отдельно считается значение цвета, а затем они суммируются. При применении такого сглаживания фактически получается так, что изображение рассчитывается как бы при более высоком разрешении, поэтому это резко уменьшает производительность, но зато мы имеем более гладкие переходы цвета соседствующих пикселей на линиях объектов.
Сглаживание движения (Temporal anti-aliasing) –

это метод, который решает следующую проблему. Допустим, у нас есть объект, достаточно медленно движущийся по сцене. По идее это должно происходить плавно, но из-за того, что мы наблюдаем трехмерное изображение, как бы через пиксельную сетку, часть объекта вместо этого резко дернется в сторону движения. Для борьбы с этим используется motion blur, т.е. смазывание в движении.
Смазывание в движении (motion blur) происходит при фото- и киносъемке из-за движения объектов в кадре в течение времени экспозиции кадра.

В трехмерной же анимации, в каждый конкретный момент времени (т.е. в одном кадре) объекты расположены по определенным координатам в трехмерном пространстве, аналогично виртуальной камере с бесконечно быстрой выдержкой. В результате, смазывание, подобное получаемому камерой и человеческим глазом при взгляде на быстро движущиеся объекты, отсутствует. Это выглядит неестественно и нереалистично. Motion blur также дает четкое представление о скорости и направлении движения объектов.



Depth of field (глубина резкости), вкратце, это степень размытости объектов в зависимости от их положения относительно фокусного расстояния камеры.




Следующая картинка – всего лишь камни мостовой тут - всего лишь результат попиксельного эффекта, т.е. камни на мостовой – это всего лишь изначально плоская текстура (как в texture mapping’е).






Render.ru -> Статьи -> Урок 3D истории
http://www.ixbt.com/video2/terms2k5.shtml
High Dynamic Range (HDR) в применении к 3D графике - это рендеринг в широком динамическом диапазоне. Динамаческим диапозон в данном случае относится к различным уровням экспозиции. Суть HDR заключается в аккуратном представлении широкого набора уровней интенсивности света, начиная от прямых солнечных лучей и заканчивая самыми темными тенями. (ИЗ Демки + Loast Coast)


Рендеринг (rendering) – называют процесс расчёта конечного изображения, которое выводится на экран. Как видно из определения, это понятие является обобщающим, т.е. охватывает всё то, что происходит в центральном процессоре (CPU) или графическом процессоре видеокарты (GPU) во время их работы над расчетом трехмерной картинки. {съёмка этапа рендеринга картинки в 3DS и какое-либо видео из игры}

3. Этапы визуализации сцены.


    Все операции просчета конечного трехмерного изображения выполняются по многоступенчатому механизму, который назвали конвейером рендеринга (rendering-pipeline). Дело в том, что сам принцип конвейерной обработки 3D является технологическим стандартом, а не прихотью какой-то отдельной конторы. По конвейерному принципу работают все трехмерные программные интерфейсы и все графические ускорители. Мы рассмотрим наиболее распространненую схему, которая примерно аналогична прохождению информации по вычислительным блокам видеокарты.



{Возможно стоит показать схему конвейера рендеринга OpenGL или Direct3D. Или просто какой-либо конвейер, например конвейер автомобильной сборки}

На вход конвейера поступают данные, описывающие трехмерную сцену, а его выходом является двухмерная растровая картинка.


   Триангуляция (Triangle setup)


Первый этап конвейера называется триангуляцией, что означает разбиение на треугольники. Зачем же требуется разбивать объекты на треугольники? С треугольниками проще работать. Почему? А потому что: 1) треугольник является простейшим полигоном, вершины которого однозначно задают плоскость; 2) любую область можно гарантировано разбить на треугольники; (показать фрагмент вывода теоремы об этом) 3) вычислительная сложность алгоритмов разбиения на треугольники существенно меньше, чем при использовании других полигонов; 4) для треугольника легко определить три его ближайших соседа, имеющих с ним общие грани. Триангуляция бывает двух видов, в зависимости от обрабатываемых объектов. Если это многогранник (например, пирамида, призма, куб, или октаэдр, икосаэдр), то они уже состоят из многоугольников, поэтому нужно лишь разделить их грани на треугольники. Если же это криволинейная поверхность, которая задается по точкам, то здесь уже применяются более сложные алгоритмы (например, метод Делоне). {показыватся крупный скриншот справа(есть в архиве картинок), можно показать полигональную модель из раздела ОСНОВНЫЕ ОПРЕДЕЛЕНИЯ}{Взрыв сферы на треугольники}

Операция триангуляции производится программно, т.е. силами центрального процессора.


    Трансформация объектов (Modeling transformation)

   {Показать фотографию GPU G80 } Во время трансформации преобразуются координаты объектов. По-научному, к ним применяются матрицы преобразований. Говоря проще, каждый объект отсылают, куда надо, поворачивают как надо и масштабируют. {Показать матрицы, формулы. Взять хотябы из книжки по RT, или прямо закэпчерить прокрутку майкрософтовской страницы http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/The_Direct3D_Transformation_Pipeline.asp хотя желательно найти чего-нить пострашнее}{Так же можно взять в максе объект, покрутить его, переставить, увеличить\уменьшить (всё закэпчурить фрапсом)}


   Обработка вертексов (Vertex processing).


На данном этапе возможно реализовывать по-вертексное освещение, когда каждый вертекс получает значение освещенности, а затем они интерполируются по поверхности полигона. Также на этом этапе вступают в силу вертексные шейдеры, которые позволяют деформировать или искривлять объекты при

изменении координат вертексов.


Трансформация вида (Viewing transformation)


Трансформация вида заключается в том, что координаты объектов, занимавших места в системе координат сцены транслируются в координаты, привязанные к виртуальной камере, это делается для упрощения следующего шага конвейера – трансформации проекции.

Проекция сцены (Projection transformation)


На этом шаге происходит проекция трехмерных объектов сцены на двухмерную плоскость. То, что видно на этой плоскости, как бы результат съемки виртуальной камеры.

Отсечение невидимых частей (Clipping)

Для того, чтобы на вход следующих этапов конвейера не поступала лишняя информация, т.е. объекты, или фрагменты объектов, которые не попадают в поле видимости камеры, применяются различные методы отсечения невидимых частей. Определяются полигоны, которые гарантированно не попадут в кадр. Эти полигоны отсекаются. Однако эта задача не столь тривиальна, насколько кажется. Ведь еще требуется учитывать полигоны, у которых “в кадре” оказывается только кусок? Или как учесть полигон объекта, который заслонен другим объектом и все равно не виден? Для отсечения сначала используется объем отсечения (clipping volume), т.е. шестью плоскостями по трем координатам ограничивается область сцены, которая гарантированно будет видна на экране. Затем в дело вступает backface culling — отбрасывание задних граней. У каждого полигона помимо координат вершин есть важнейшая характеристика — нормаль. Это вектор, который лежит на перпендикуляре, восставленном из геометрического центра треугольника. У каждого полигона есть две стороны — лицевая и обратная. Нормаль как бы определяет, куда “смотрит” полигон. Рассмотрим на примере сферы. Нормали сферы направлены во внешнюю сторону, и ее поверхность образована лицевыми сторонами граней. Примерно половина полигонов сферы “смотрит” от экрана, вторая половина — на экран. А это значит, что все полигоны, смотрящие от экрана, гарантированно не видны. Их можно отсечь. На самом деле этих двух методов не хватает для гарантированного отсечения всех невидимых полигонов, ведь в сцене могут оказаться объекты, находящиеся за стенами, под полами, над потолками. С этим можно бороться, например, с помощью BSP-деревьев, т.е. деревьев двоичного разделения пространства, где объекты сцены разбиваются по иерархическому принципу или с помощью метода кластеров, где сцена делится на логические зоны. {можно изобразить сферу с нормалями в MAXе и потом половину её удалить} { http://www.kci-group.com/z/culling.swf }



(Rasterization) Растеризация.


При растеризации 3D-картинка, спроецированная на плоскость проебразуется в растровый формат, т.е. определяются правильные значения результирующих пикселей. Для каждого пикселя определяется глубина и заносится в z-буфер. (добавить его описание в основные понятия!!!)

(Pixel processing) Обработка пикселей


На этой стадии отдельным пикселям присваиваются значения цвета, которые были получены интерполяцией цветов вертексов, либо они заменяются или к ним прибавляется цвет текстуры. Также здесь может дейcтвовать пиксельный шейдер, который будет определенным образом комбинировать цвет, глубину и позицию пикселя с текстурами или по специальным алгоритмам.

После прохождения всех стадий конвейера картинка заносится в буфер кадра У буфера кадра наличествуют два слоя (передний и задний). В заднем — новый кадр, а в переднем — кадр текущий. Когда приходит время очередного рендеринга, содержимое этих слоев меняется местами (swap). В итоге на экране мы видим новый кадр, а старый кадр пересылается в задний буфер, где немедленно заменяется очередным только что просчитанным.

4. Текстурирование


При описании процесса рендеринга было очень кратко сказано об одном важном процессе — текстурировании, который происходит на стадии обработки пикселей. Мы решили выделить ему отдельную главу, так как зачастую именно благодаря текстурированию объекты получают реалистичность. [Закепчерить из HL2 Viewer’a МОДЕЛЬ Alyx с разными текстурами и без]



Рис. 1. Самая простая текстура.





   Общие представления о текстурах


    Текстура — это двумерная битовая карта (или попросту картинка), которая накладывается на полигон и изображает фактуру его поверхности. То, что нельзя смоделировать полигонами, можно просто нарисовать. Причем если на




Рис. 2. Без текстур этот монстр
смотрелся бы довольно странно.



поверхности, которую мы моделируем текстурой, нет сильно выдающихся или неоднородных деталей, она будет смотреться реалистично. {Показать подряд несколько текстур, как простых прямоугольных, так и сложных «раскроек», типа того, что приведено тут на рисунке. И показать объекты с наложенными текстурами}

    По аналогии с конечным изображением, которое состоит из пикселей, текстура состоит из текселей. {тексель-элемент текстуры (бегущая строка)}






Рис. 3. Один из самых
неприятных глюков с
текстурами, происходящий
по вине Z-буфера.



Текстура накладывается строго по координатам. Например, в API OpenGL координаты текселей включают как сопроводительную информацию о полигонах. (вставить из книги Intro to RT)-> Процесс сопоставления координат текстур давно алгоримически выведен для объектов типа сферы, цилиндра, конуса и, естетвенно, многоугольника и в частности треугольника. {вот тут должен быть пример со сложной «раскройкой и моделью» тут можно показать текстуры персоонажей игр из Халвы, к прмеру, через SDK (попросить Гуляныча)}




Рис. 4. MIP-уровни текстуры
можно представить в виде
пирамиды. Каждый
последующий уровень в 2 или
4 раза меньше предыдущего.



    Проблемы с текстурами


    При работе с текстурами существует немало проблем, которые приходится решать весьма изощренными способами. У экрана есть свое разрешение и определенное количество пикселей, которые на нем можно отобразить в данной области экрана. Но в соответствующей области виртуального мира количество текселей может быть и больше, и меньше, чем на экране. Отсюда и рождаются проблемы отображения текстурированных объектов. Для борьбы с ними используются различные методы фильтрации.




Рис. 5. Пример грубой ошибки
разработчика: число MIP-
уровней явно недостаточно.





  Фильтрация и MIP Mapping


Билинейная фильтрация (Bi-Linear Filtering). Ее суть в том, что цвет пикселя получается в результате интерполяции (усреднения) цветов четырех соседних текселей. Если объект расположен далеко от камеры, его текстура почти не искажается. А когда объект недалеко от камеры, и текселей не хватает, интерполяция создает расплывчатое изображение этой области. {тут у нас есть видюшки из кваки, можете из BFа наснимать}




Рис. 6. А вот так это должно
было выглядеть на самом
деле...



    Но билинейная фильтрация хорошо работает только для полигонов, которые параллельны или почти параллельны экрану. Дело в том, что четыре соседних текселя, которые берутся для интерполяции, — это почти круг. Если плоскость наклоняется, круг медленно, но неумолимо превращается в эллипс. Но интерполируются тексели по-прежнему по кругу. От этого постоянно накапливаются небольшие ошибки. После определенного угла наклона ошибки становятся уже заметными, текстура фильтруется геометрически неправильно, а пользователь наблюдает сильные искажения.

    Есть и еще одна проблема: если мы видим текстуру намного дальше или намного ближе, чем предполагал разработчик, текстура очень сильно корежится фильтрацией. До поры до времени это не заметно, но со временем в рисунок текстуры закрадываются сильные искажения, своеобразные “помехи”.


Обе проблемы надо было решать, и решение быстро нашлось в симбиозе двух технологий: трилинейной фильтрации (Tri-Linear filtering) и мип-мэппинга (MIP Mapping). Multum in Parvo (MIP) с латыни переводится как “много в одном”. Это изречение стало лозунгом технологии MIP Mapping. Для одной и той же поверхности разработчик создает несколько копий текстуры с разной степенью детализации. Каждая следующая версия текстуры меньше или больше предыдущей в 4 раза. Данная версия текстуры называется мип-уровнем, а все мип-уровни вместе — мип-каскадом. Когда камера удаляется от текстуры, она сменяется на мип-уровень с меньшим разрешением, а когда приближается — с большим. Теперь независимо от того, на каком расстоянии находится наблюдатель от объекта, текстура отображается без геометрических искажений, однако в памяти приходится хранить несколько копий одной и той же текстуры. Переходы между мип-уровнями выполняются резко.

    По-настоящему востребованной оказалась технология, совмещающая MIP Mapping и билинейную фильтрацию и добавляющая в этот процесс несколько новых этапов. Речь идет о трилинейной фильтрации. Цвет конкретного пикселя на экране определяется в результате интерполяции цветов текселей двух соседних мип-уровней. При этом над каждым мип-уровнем предварительно проводится билинейная фильтрация, а для интерполяции берутся не 4, а 8 соседних текселей. За счет этого переход между мип-уровнями становится плавным и незаметным.

   




Рис. 7. Сравнение разных
способов фильтрации текстур.
Как видно, анизотропная
трилинейная фильтрация —
самая лучшая. Но не каждый
компьютер способен ее
потянуть.



Венцом эволюции стала анизотропная фильтрация (Anisotropic filtering) — самая сложная и ресурсоемкая из всех. После всех предыдущих фильтраций и мип-мэппингов все еще остается одна проблема. Более или менее красиво эти алгоритмы работают для текстур, которые располагаются параллельно экрану. Если текстура сильно наклонена, фильтрация в одном направлении выполняется больше, чем надо, а в другом — меньше.

Поэтому и появилась анизотропная фильтрация. Под этим словосочетанием подразумевается несколько совершенно разных и довольно сложных технологий. Поэтому не будем останавливаться на ней подробно. { http://graphics.cs.cmu.edu/projects/objewa/videos/trisptanis.avi }






Рис. 8. Объемный туман
позволяет добиться
интересных эффектов.





   





Рис. 9. Посмотрите на эту
картинку, и вы поймете, что
же скрывается за мудреным
словом “интерполяция”.








Рис. 11. Bump mapping
позволяет с помощью
двумерных текстур
реалистично изображать
рельефные поверхности.



Рис. 10. Процедурные текстуры
почти не занимают места на
диске и отлично подходят для
изображения земли, бетона
или кирпичной кладки...
   Процедурные текстуры (Закепчерить из Genetica 2 Pro )


http://video1.bit-tech.net/profx_bathroom_02.mov (скачено)




Рис. 13. ...карта высот.



   Процедурные текстуры - это текстуры, описываемые математическими формулами.

Наиболее часто встречающиеся процедурные текстуры: дерево, вода, лава, облака, кристаллическая поверхность, плиточную поверхность, ткань или кожу животных и так далее.


Преимущества процедурных текстур следующие: Во-первых, они не занимают в видеопамяти места, так как просчитываются в реальном времени.

Во-вторых, процедурные текстуры позволяют использовать анимированные текстуры при помощи всего лишь небольшой модификации математических формул. В-третьих процедурные текстуры также включают в себя неограниченный уровень детализации каждой текстуры - пикселизации просто не будет, текстура как бы всегда генерируется под необходимый для ее отображения размер, они могут неограниченно масштабироваться в реальном времени, отсюда еще следует что для них не требуются мип-уровни. В-четвертых, они легко могут быть трехмерными.

Процедурными текстурами можно имитировать — словом, любой однородный материал. Наиболее распространенные алгоритмы для генерации процедурных текстур - вариации “шумовых” алгоритмов Перлина. Единственный недостаток процедурных текстур – это их естественное требование к большому количеству вычислений, которых существенно больше, нежели при загрузке «классической» текстуры в память. И дело в том, что первые подобные текстуры считались программно центральным процессором. Благодаря оптимизациям MMX, 3D Now! и SSE, наложение процедурных текстур стало происходить почти с такой же скоростью, что и обычных. Ну а после появления DirectX 8 с видеокартами, поддерживающих шейдеры версии 1.1 процедурные текстуры стали просчитываться аппаратно.

5. Обработка света.


Освещение играет одну из основных ролей в построении реалистичного трехмерного изображения. Именно освещение позволяет оценивать объемность объектов. (далее видео с двумя шарами одинакового размера на плоскости и комментарии к нему). Вообще говоря то, что мы видим, является отражением света источника. (какая-нибудь картинка или видео с глазом, объектом и источником). Из курса физики известно о корпускулярно-волновом дуализме света. Волновая природа света наблюдается в таких явлениях, как интерференция и дифракция. Но это происходит в масштабах микромира, поэтому отображение подобных явлений посредством 3Д-Графики теряет смысл. В трехмерных визуализациях используется корпускулярная часть света. Поток фотонов представляется в виде лучей и просчитывается с привлечением геометрических законов оптики, а так же свойств поверхностей. (видео с потоком частиц, переходящих в луч, всяческие отражения и преломления его с показанными углами) Так мы приходим к физически достоверному (естественно, с некоторой долей приближения) алгоритму под названием Ray Tracing.

Ray Tracing (трассировка лучей)


(Далее показаны самые красивые ролики с использованием RT)

Ray-tracing – это наиболее общий алгоритм, который позволяет создавать глобальное освещение сцены, полный просчет всех теней с любыми параметрами, отображение сложных оптических эффектов многократного преломления и отражения и т.д. Единственный его недостаток заключается в высоких требованиях к вычислительным мощностям, так что его расчет в реальном времени стал производится только недавно.



Radiosity http://en.wikipedia.org/wiki/Photon_mapping




Photon mapping

Lightmap (световые карты)


Есть другие методы, которые не являются такими ресурсоемкими, как Ray-Tracing, но и в тоже время теряют в универсальности, зато под них заточены современные графические ускорители. Одним из таких методов является lightmap, т.е. карта освещенности, первая компьютерная игра в которой он появился – Quake. Lightmap представляет из себя массив так называемых световых текстур, конечный цвет точки получается простым умножением её цвета в темноте на значение яркости точки световой текстуры.

Можно провести аналогию с классической анимацией: примерно так в рисованных мультфильмах художники-мультипликаторы рисовали тени от персонажей. Только вместо кисти аниматора используется видеоускоритель. А именно — тень представляется или как специальная текстура с черным силуэтом объекта, которая накладывается на затеняемые треугольники (отбрасывающая тень модель сначала рисуется в эту теневую текстуру). Карты освещенности позволяют отобразить лишь статическое освещение, и очень часто для их предварительного расчета используется тот же Ray Tracing.



(видео из различных игр со специальными остановками для того, чтобы разглядеть источники света. Можно просто взять всю серию quake с 1-ой по 3-ую часть).

Shadow volumes (теневые объемы)


Volume Intersect !!!! -> http://download.developer.nvidia.com/developer/SDK/Individual_Samples/samples.html#HLSL_VertexLight

В Nvidia effects browser все есть !!!!!!!!!!!!!!!!

Динамические тени от объектов в реальном времени с учетом совместимости с существующими технологиями аппаратного ускорения получают с помощью алгоритма Теневых Объемов. Самый яркий пример здесь – игра Doom 3.

Алгоритм Shadow Volumes был впервые предложен Франклином Кроу (Franklin Crow) в 1977 году для генерации теней в трехмерном пространстве. Особенностями алгоритма можно назвать построение геометрически правильных теней с четкими краями, а также использование буфера шаблонов (stencil-буфера). По сути, буфер шаблонов поддерживают все видеокарты, поддерживающие 32-битный цвет, начиная с таких динозавров, как Riva TNT. Что такое буфер шаблонов? Буфер шаблонов - это, по сути, дополнительная плоскость в буфере кадра (обычно 8 битов на точку), используемая для поточечного отсечения изображения.

Алгоритм основан на использовании так называемых "теневых объемов" (shadow volumes). Теневой объем представляет собой область трехмерного пространства, полностью заполненную тенью. Теоретически, теневые объемы строятся по точкам силуэта объекта, отбрасывающего тень, и лучам, исходящим из этих точек по направлению от источника света. Однако практически, вместо лучей используются отрезки конечной длины, так как, во-первых, технически сложно работать с бесконечными величинами, а во-вторых, сцена всегда ограничена пирамидой видимости.

Чтобы определить, попадает ли данная конкретная точка экрана в тень, или нет, предлагается подсчитывать число пересечений луча, идущего от наблюдателя через эту точку с границами теневых объемов. Если результат нечетный - точка лежит в тени (СМ. КАРТИНКУ!!!!). Этот подход был впоследствии усовершенствован для использования с буфером шаблонов. Мы увеличиваем значение в буфере, соответствующее точке на экране, при пересечении лучом "видимых" граней (нормаль которых повёрнута к наблюдателю) теневых объемов и уменьшаем при пересечении "невидимых" граней (см. рис. 1). В результате мы получаем маску в буфере шаблонов, по которой впоследствии рисуем тень, причем делается это за два цикла обхода сцены, за один цикл рисуются освещенные участки сцены, а за другой - затененные.  

Основным плюсом этой системы освещения стала возможность построения теней в реальном времени, для каждого отображаемого кадра: монстры, проходя мимо ламп, отбрасывают динамические тени; передвигающиеся источники освещения корректно затеняют окружающий их мир.    

Однако при помощи shadow volumes очень тяжело отобразить преобладающие в реальности размытые, «мягкие» тени. По сути, для этого придется каждый источник света обработать несколько раз (чем больше — тем лучше будет результирующее качество), построив для него несколько теневых массивов и затем усреднив их. Понятно, что алгоритм этот очень неэффективен.    



Также shadow volumes плохо приспособлены для рендеринга теней на больших открытых пространствах. Тени за окном практически всегда размыты: слишком много отражающих свет объектов, плюс воздействие на лучи света преломляющей и рассеивающей земной атмосферы. Затем, тени на открытых пространствах могут быть практически бесконечными, а чем больше тень, тем больше пикселей потребуется закрасить видеочипу для её отображения.

Shadow mapping

6. Дополнительные методы


В современных играх помимо стандартной, полигональной технологии представления трехмерной графики используются и другие, альтернативные. У каждой из таких технологий – своя область применения, свои достоинства и недостатки.

(Вставить видео, как в Maya или другом редакторе они делаются)

NURBS


В природе отсутствуют идеально прямые линии и равномерные плоскости, она содержит различной формы и сложности кривые. Поэтому для моделирования растений, деревьев, животных и человека требовался метод, отличный от полигонального.
Эта метод разрабатывался начиная с 50-ого года инженерами, преследовавшими цель создать математическое описание поверхностей произвольной формы. Пионерами его создания явился Пьерре Безье из компании Renault. Его именем были названы B-splines, т.е. Кривые Безье, математически рассчитанные кривые, плавно соединяющие отдельные точки. Существует фундаментальная теорема о том, что любую полиномиально заданную кривую можно разбить на кривые Безье, а кривые Безье сами по себе достаточно легко поддаются алгоритмизации, поэтому идеально подходят для представления сложных кривых в компьютере. Сокращение же NURBS расшифровывается как Non-Uniform Rational B-Spline (Неравномерная рациональная кривая Безье), - это метод представления кривых, который получил дополнительную гибкость за счет узловых точек, находящихся на кривой. Некоторый из этих узлов можно как бы наделить б’ольшим весом так, что при изменении его координат, т.е при его перетаскивании в другое место за ним, как за магнитом потянутся другие точки. А если мы используем совокупность кривых, то получаем криволинейную поверхность. Графическая программа после просчета всех уравнений кривых, требуемых для формирования поверхности в заданной области, получает набор точек в трехмерном пространстве, из которых затем формируются полигоны.
В первую очередь NURBS играют громадную роль в автоматизации проектирования (CAD-системы), так как позволяют инженеру или дизайнеру создавать и визуализировать требуемые формы будущего изделия.
Также генерация поверхностей с помощью NURBS широко доступна в пакетах трехмерного моделировнаия. 3D-художник может поставить на поверхность столько опорных точек, сколько захочет, точнее на сколько хватит вычислительных ресурсов и памяти. Если он потом изменит положение одной из этих точек, все остальные точки поверхности будут рассчитаны так, чтобы в поверхности не образовалось разрывов. Именно поэтому простая поверхность с всего парой десятков опорных точек может стать красивым платьем принцессы с множеством живописных складок, которое меняет свою форму в такт ходьбе.{FF из ролика игромании за 06.07.06 «танцующие девушки»}
К сожалению, для NURBS пока нет аппартного ускорения и поэтому они редко используются в приложениях реального времени, хотя первая попытка интерактивного рендеринга с их помощью была предпринята рабочих станциях компании Silicon Graphics в 1989 году. Именно поэтому NURBS в компьютерных играх в рамках динамической обработки не используются. И, например, редко встречающиеся колыхания одежды или другой ткани обычно просчитаны заранее.

Voxel

Как известно, любая двумерная картинка, которая выводится на экран монитора, состоит из пикселей. Само слово pixel происходит от picture element – элемент изображения. Такое представление довольно естественно, ведь экран монитора также состоит из дискретных элементов, каждый из которых может принимать тот или иной цвет. А почему бы этот принцип попробовать не перенести в 3D? Ведь любой объект в реальном мире состоит из атомов, молекул. Только на моделирование каждой молекулы уйдут тысячилетия. Зато можно использовать структурные единицы значительно больших размеров в качестве геометрических примитивов для построения трехмерных сцен. Этот принцип лежит в основе так называемой воксельной графики.

Воксель – это, по сути, трехмерный пиксель (слово voxel образовано из VOlumized piXEL, то есть «объемный пиксель»). Как и пиксель, он имеет свой цвет. Иногда воксель называют квантом объема. Любой объект в 3D, как из кубиков, составляется из вокселей. При этом воксели, как правило, образуют только внешнюю поверхность объектов, внутренности не заполняются. Да и зачем обсчитывать то, что мы и так не видим? Так как каждый воксель передает свой цвет, необходимость в текстурах отпадает. Объекты из вокселей очень просто сделать разрушаемыми – ведь перемещение каждого элемента объекта при, скажем, взрыве рассчитывается по очевидным законам. Воксельные объекты очень просто анимировать – достаточно задать последовательность трехмерных кадров.
Само собой, качество конечной картинки зависит от размера и формы вокселей. Чем они меньше – тем лучше. В идеале, даже в сложных криволинейных поверхностях они вообще не должны быть заметны. Форма вокселей подбирается из соображений производительности. Лучше всего выглядят воксели-сферы. Но их отрисовка довольно требовательна к ресурсам. В первых играх, которые использовали воксельную технологию, они были просто кубиками или даже плоскостями, повернутыми к наблюдателю. Из-за этого порой была заметна зернистость изображения и даже просветы между кубиками.

( http://www.ag.ru/screenshots/comanche_maximum_overkill/)


В целом, воксельное представление трехмерного мира куда более естественно, чем полигональное. Картинка, полученная с использованием этой технологии, будет четкой и красивой. Это в теории. У вокселей есть два существенных недостатка. Первый заключается в том, что для хранения даже небольшой сцены высокого качества уходит огромное количество памяти и дискового пространства, так как каждый. Конечно, есть хитрости, которые позволяют уменьшить эту цифру в десятки раз. Так как в объектах очень много пустот, можно хранить не матрицу вокселей, а их список или данные о вокселях можно хранить в сжатом виде. И все равно – качественное представление трехмерного мира потребует больших ресурсов памяти. Второй недостаток – это все та же архитектура графических ускорителей, которая не приспособлена к воксельному представлению.
Компьютерных игр, целиком сделанных по воксельной технологии, очень мало. Самый известный пример полного применения технологии вокселей – игра Outcast, вышедшая в 1999 году. Эта игра вообще не поддерживала трехмерные ускорители, а использовала лишь ЦП, однако максимальное разрешение игры было 640*480. (видео из Outcast)

7. 3D API


В современных 3D-ускорителях содержится больше транзисторов, чем в центральных процессорах Например, в видеокарте GeForce 8800 GTX их почти 700 миллионов, в то время как у ЦП Intel Core 2 Duo не больше 300 миллионов. У каждой видеокарты есть свой ассемблер и специальные команды, адреса и интерфейсы, через которые им можно управлять. У каждого конкретного ускорителя свои особенности, свои дополнительные команды.

Далеко не факт, что программная последовательность для одного ускорителя будет работать на другом. Поэтому для упрощения программирования графики для GPU существуют 3D API (Application Program Interface - Программные Интерфейсы Приложения). Трехмерные программные интерфейсы приложения выполняют следующие функции:

- Взаимосвязь с ресурсами CPU и их памяти.

- Взаимосвязь с драйвером GPU

- Взаимосвязь с интерфейсом операционной системы, например с Windows API

- Предоставление библиотечных функций для создания трехмерной сцены

- Обеспечение через функции библиотеки полного прохождения конвейера рендеринга

OpenGL http://en.wikipedia.org/wiki/OpenGL



OpenGL (Open Graphics Library)    Трехмерный API OpenGL был создан летом 1992 года в недрах корпорации Silicon Graphics (теперь SGI) на базе библиотеки IRIS GL . Для поддержки и главное определения спецификации нового стандарта (который был и по сей день остается абсолютно свободным и бесплатным) сильные мира сего создали консорциум The OpenGL Architecture Review Board (ARB), в который вошли крупнейшие производители компьютеров и комплектующих.

OpenGL — это универсальная, аппаратно-независимая библиотека, которая поддерживает разнообразные 3D-объекты и конструкции, начиная с примитивов типа треугольника или линий и заканчивая NURBS.

Основной язык программирования, использующийся в паре с OpenGL – это C/C++, однако существуют адаптации и для других, например Java. Программист, использующий OpenGL, не может ограничится лишь описанием сцены, он должен создавать код, учитывающий многие детали, требуемые для ее рендеринга. От него требуется достаточно глубокое знание этапов визуализации сцены, зато архитектура OpenGL дает возможность реализовывать нестандартные и оригинальные алгоритмы рендеринга.

     И еще одна деталь: в OpenGL есть интересный механизм расширений, когда любой желающий может добавить в библиотеку какие-то функции, не реализованные в базовой версии API. Например, какая-нибудь функция расширения компании Nvidia имеет название, которое заканчивается NV. Очень часто наиболее используемые расширения по решению большинства представителей ARB могут быть включены в официальную спецификацию.

Также, начиная с версии 2.0 OpenGL получил встроенное дополнение под названием OpenGL Shader Language, что позволило программисту выбирать между использованием жестко прописанных функций, обеспечивающих работу вертексных и шейдерных блоков конвейера и программируемыми шейдерами.

Популярность OpenGL во многом сложилась за счет очень грамотно оформленной и доступной официальной документации. (показать все книги Red,Blue,Orange.. ) Важной особенностью OpenGL является кросс-платформенность, она доступна на многих операционных системах серий Mac OS, Windows, Linux, Unix и BSD. Это повлияло на то, что ядро OpenGL не поддерживает никаких функций обработки окон, вывода на экран или устройств ввода, для этого используются дополнительные библиотеки, например GLUT.



    Direct3D http://en.wikipedia.org/wiki/Direct3D_10


Direct3D – это элемент комплексной библиотеки DirectX, разработанной компанией Microsoft для расширения и универсализации мультимедийных возможностей разных версий ОС Windows, начиная с Win95.

   Этот API может работать в двух режимах: Retained Mode и Immediate Mode. В режиме Immediate Mode API общается с железом напрямую и дает наибольшую производительность. Retained Mode — режим абстракции,

программировать в котором значительно легче, но цена этому — производительность. Также существует режим HEL - Hardware Emulation Layer, при котором используется ресурсы только ЦП. Его наиболее заметный признак — всякое отсутствие фильтрации, как следствие — сильно пикселизованные текстуры.

Рассматривая различные версии Direct3D, важно упомянуть версию 8.0, которая добавила поддержку шейдерных операций, что в результате вылилось в создание отдельного языка под названием HLSL (High Level Shader Language), доступного в уже в 9-ой версии. Версия же 10, встроенная в операционную систему Vista, позволит сделать также программируемым целиком сам конвейер рендеринга, отсюда и следует унификация шейдерной архитектуры, размытие четких граней между пиксельными и вертексными шейдерами.

Преимущество по части популярности Direct3D перед OpenGL у разработчиков компьютерных игр образовалось в основном за счет исторических факторов: версии Direct3D, начиная с 5-ой были проще в использовании. OpenGL же требовал при создании на нем программы включения всех его элементов, даже если они не поддерживались аппаратно, поэтому приходилось дописывать множество дополнительных процедур.


   

Glide http://en.wikipedia.org/wiki/Glide_API

    В 1995 году на свет появился легендарный 3D-ускоритель 3dfx Voodoo. Это был первый специализированный ускоритель 3D-Графики для домашнего ПК и стоил он по тем временам немалых денег. Для него и был написан API Glide, который по сути являлся урезанной версией OpenGL, использовавший его базовые функции обработки геометрии, но его главными двумя отличиями была закрытость кода и полная ориентация только на архитектуры Voodoo. Эта строгая ориентация на только на видеокарты от 3dfx сделало его и более низкоуровневым, нежели OpenGL и Direct3d, что также давало большую потенциальную производительность для своего времени. Самые известные игры серидины 90-х, поддерживающие Glide: MechWarrior 2, Quake 1/2, Tomb Raider, Descent 2, MDK.


Заключение.



Показывается Мегаботан в больших очках и сверху надпись «мегаботан», сидящий в аудитории на большом вузовском. Он читает книгу «Вычислительная геометрия и алгоритмы машинной графики». Далее происходит приближение к его сумасшедшему выражению лица и к глазу, потом все резко отдаляется обратно и он уже сидит в виртуальной аудитории (требуется довести до ума одну из смоделированных [соответствующую снимаемой]). Вокруг летают и ходят трехмерные монстры (например, паук из матрицы, птеродактели какие-нибудь, можно из звездных войн модельки поиспользовать).


Смотрите также:
Тема № введение в компьютерную графику
223.81kb.
1 стр.
Введение в компьютерную графику
1435.67kb.
16 стр.
1. история 3Д графики 2
335.88kb.
1 стр.
1. история 3Д графики 2
371.5kb.
7 стр.
1. история 3Д графики 2
423.56kb.
7 стр.
Трехмерная графика
75.92kb.
1 стр.
Занятие Методы представления графических изображений
138.27kb.
1 стр.
Вопросы государственного экзамена по русскому языку 2010 г
46.52kb.
1 стр.
Контрольная работа №1 Тема контрольной работы №1 Базовые основы компьютерной
28.63kb.
1 стр.
Должностная инструкция дизайнера компьютерной графики отдела видеопроизводства
35.61kb.
1 стр.
Растровый графический редактор Gimp
152.42kb.
1 стр.
Xi биеннале графики стран Балтийского моря «Калининград – Кенигсберг 2013». Россия
49.71kb.
1 стр.