Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа1.doc
Скачиваний:
17
Добавлен:
01.05.2014
Размер:
743.94 Кб
Скачать
    1. Трехмерный звук и персональные компьютеры

Сейчас выпускается достаточно много процессоров обработки сигналов (DSP) различными фирмами, это позволяет создавать относительно недорогие звуковые карты, которые способны в реальном времени реализовывать бифонические процессоры и цифровые фильтры, необходимые для качественного моделирования человеческого слухового аппарата. Таким образом, 3-х мерный звук из экзотики превращается в стандартную функцию практически любой современной звуковой карты среднего ценового диапазона. В дополнение к цифровым имитирующим фильтрам такие звуковые карты позволяют реализовывать эффект Доплера (смещение высоты звука движущегося источника), придающий еще большую реалистичность компьютерным играм. Некоторые звуковые карты с DSP (www.sblive.com) имеют богатый набор звуковых эффектов, ревербераторов и фильтров, иногда существенно улучшающих звучание компакт дисков. Любители домашней компьютерной звукозаписи также имеют возможность поэкспериментировать с 3-х мерным звуком. Практически для всех популярных программ редактирования звуковых файлов имеются так называемые plug-ins, поддерживающие создание объемно звучащих произведений.

  1. Разработка3d приложения

    1. Постановка задачи

Разработать приложение для ОС Windows, которое:

  • Демонстрирует возможности современных ПК по построению трехмерных сцен в реальном времени.

  • Демонстрирует технологию 3Dзвука, т.е. создание виртуального источника звука вокруг слушателя с использованием конфигурации колонок 2.0 или 5.1.

  • Позволяет интерактивно взаимодействовать с 3Dсценой.

  • Должно работать на наиболее распространенном аппаратном обеспечении современных IBMPC. Т.е. не требовать специализированных видео или звуковых адаптеров.

    1. Обзор возможных вариантов исполнения и выбор из них оптимального

      1. Что выбираем?

Мой выбор заключается в выборе API, используя который я буду писать 3Dприложение. Т.к. по условию программа должна работать на наиболее распространенном аппаратном обеспечении, то такие специализированныеAPI, как R-Redline, S3D Toolkit,Glideне подходят. Выбирать я буду из двух наиболее распространенныхAPI:Direct3DиOpenGL.

      1. Сравниваемые параметры

  1. Поддерживаемые операционные системы и языки программирования.

  2. Производительность получаемых программ.

  3. Архитектура и расширяемость.

  4. Функциональность.

  5. Удобство использования. Размер и читаемость кода программы.

      1. СравнениеDirect3DиOpenGl

  1. Поддерживаемые операционные системы и языки программирования.

DirectXработает только на ОС семействаWindows. Последняя 10ая версия библиотеки работает только сWindowsVistaи не поддерживает более старые версии ОС.Microsoftне планирует переноситьDirectXна другие платформы в будущем. Приложения, использующиеDirectXможно разрабатывать только вMicrosoftVisualStudio. Но существует неофициальный проект JEDI – заголовочные файлы для работы с DirectX в Delphi.

Так как исходные коды OpenGLоткрыты, существует большое множество портов и реализаций этой библиотеки под разные ОС и языки программирования.

ОС под которыми работает OpenGL: Windows, Linux, MacOS, Silicon Graphics Workstations, BeOS.

Языки на которых можно писать под OpenGL: ADA, Fortran, Haskell, Java, Perl, Pike, Python, Ruby,VisualC++,VisualBasic.

  1. Производительность получаемых программ.

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

  1. Архитектура и расширяемость.

Ключевая особенность OpenGL - простота. Ядро OpenGL контролирует процесс обработки примитивов (то есть треугольников). Для передачи данных используется процедурная модель, фактически - вызовы функций. В каждый момент времени состояние OpenGL определяется через набор переменных, задающих параметры обработки (например, накладывать текстуру или не накладывать). Каждый новый переданный треугольник проходит обработку в соответствии с текущим состоянием. Такой механизм весьма эффективен, а код обычно короток и прост. Хотя ядро OpenGL процедурное, в использовании OpenGL совместно с объектно-ориентированными технологиями сложностей обычно не возникает: все зависит от выбора программиста.

DirectX основан на модели COM (Component Object Model). Такая архитектура имеет как достоинства, так и недостатки. В частности, код, в котором используются вызовы DirectX, обычно не является идеалом легко читаемого и понимаемого. Поэтому даже рисование простого треугольника требует огромного объема кода. Разработчики Microsoft, конечно, понимают это, поэтому для упрощения программирования ими создана отдельная библиотека DirectX Common Files, которая скрывает часто используемый код.

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

Этот процесс выглядит следующим образом: как только производитель выпускает видеокарту с поддержкой определенной полезной функции, он включает ее в свою реализацию OpenGL (которая обычно входит в поставку драйвера). Для программиста эта возможность становится доступной, если он специальным образом запросит данное расширение. Конечно, такой путь не универсален: на другой видеокарте сделать это не получится из-за различий в интерфейсе. Поэтому существуют расширения, одобренные ARB, - при их использовании можно надеяться, что они будут работать на видеокартах различных производителей. Такие расширения являются кандидатами на включение в последующие версии OpenGL.

Данный механизм выглядит (и на самом деле является) неудобным. В DirectX все проще: функциональность либо поддерживается данной версией библиотеки, либо не поддерживается. Если нет - придется надеяться и ждать следующей версии. Однако случаи, когда аппаратные функции не используются из-за того, что не были включены в версию DirectX, довольно редки - как уже говорилось, Microsoft тесно работает с производителями игрового (и не только) "железа". С другой стороны, ждать версий DirectX приходится около года, а в это время новые функции уже доступны через расширения OpenGL.

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

Серьезным достоинством OpenGL является прежде всего то, что это "открытый стандарт". Любая компания, имеющая аппаратную платформу, может купить лицензию у SGI и затем сделать собственную реализацию OpenGL. Изменения в OpenGL предлагаются, обсуждаются и утверждаются представителями различных компаний. Что касается DirectX, то здесь ситуация прямо противоположная. Только Microsoft может вносить какие-либо изменения в библиотеку. Иначе говоря, именно Microsoft в конечном итоге определяет все пути развития библиотеки, и если путь был выбран неверно, это может быть исправлено только в новой версии.

  1. Функциональность.

И OpenGL, иDirect3Dиспользуют в своей работе стандартную схему 3Dконвейера. Основное различие между ними состоит в способе представления примитивов в нутрии конвейера. В таблице 1 сравнивается наличие функций в библиотеках. Так как возможностей у обеих библиотек очень много, то в таблице представлены только те, по которым они различаются.

Таблица 1. Сравнение функций API OpenGL 1.2, Direct3D 7 и 8.

Функции

OpenGL 1.2 Core

Direct3D 7

Direct3D 8

Система

Поддержка операционных систем

Windows (9x, NT, 2000), MacOS, BeOS, *nix, others

Windows (9x, 2000, CE)

Windows (9x, 2000, XP)

Разработчик / владелец

OpenGL ARB

Microsoft

Microsoft

СпецификацияAPI

OpenGL Specification

SDK/DDK Docs, DDK Reference

SDK Documentation

Механизм API

Библиотеки и расширения

COM

COM

Программная эмуляция технологий, не поддерживаемых видеокартой

+

-

-

Механизм расширений

+

-

+

Доступность исходных кодов

+

+

-

Моделирование

Функциональная интерполяция вершин полигонов

-

+

+

Программируемая интерполяция вершин полигонов

-

-

+

Параметрические примитивы кривых

+

-

+

Параметрические примитивы поверхностей

+

-

+

Отображение списков иерархий

+

-

-

Рендеринг

Двустороннее освещение

+

-

-

Атрибуты рендеринга точки

+

-

+

Атрибуты рендеринга линии

+

-

-

Программируемые пиксельные шейдеры

-

-

+

Triadic Texture Blending Operations

-

-

+

Cube Environment Mapping

-

+

+

Объемные текстуры

+

-

+

Мультитекстурный каскад

-

+

+

Временный регистр текстур

-

-

+

Адресация зеркальных текстур

-

+

+

Texture "Wrapping"

-

+

+

Туман, зависимый от расстояния

-

+

+

Рельефное текстурирование

-

+

+

Двукратное сглаживание текстур

-

+

+

Четырехкратное сглаживание текстур

-

+

+

Add Signed Texture Blend

-

+

+

Буфер кадра

Аппаратно зависимый Z Buffer

+

-

-

Полноэкранное сглаживание

+

+

+

Размытие движения

+

-

+

Глубина резко изображаемого пространства

+

-

+

Накопительный буфер

+

-

-

Разное

Picking Support

+

-

-

Поддержка многомониторных систем

-

+

+

Стерео рендеринг

+

+

-

Хотя чистый OpenGL 1.2 (без расширений) сильно уступает по возможностям Direct3D версии 8 и тем более версиям 9 и 10, все функции современных видеокарт в OpenGLможно использовать через подключаемые сторонние библиотеки.

  1. Удобство использования. Размер и читаемость кода программы.

Сравним текст программ на OpenGL Direct3D. Обе программы делают одно и тоже, а именно рисуют один-единственный треугольник c углами разных цветов.

Таблица 2. Сравнение исходного кода простейшей программы для разных библиотек.

OpenGL

Direct3D

Очистка экрана:

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_TRIANGLES);

glColor3d(1,0,0);

glVertex3d(1,2,3);

glColor3d(0,1,0);

glVertex3d(4,5,6);

glColor3d(0,0,1);

glVertex3d(7,8,9);

glEnd();

glVertex3d – функция, которая создает вершины нашего треугольника

glColor3d принимает на вход цветовые компоненты RGB, и все вершины, идущие после него и до следующего вызова glColor, будут иметь соответствующий цвет.

Очистка экрана:

d3d_Device->Clear (0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB (0, 0, 0), 0, 0);

В D3D перед рисованием необходимо подготовить специальную структуру данных:

struct CUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD color;};

CUSTOMVERTEX g_Vertices[] =

{

{1, 2, 3, 1, 0xffff0000},

{4, 5, 6, 1, 0xff00ff00},

{7, 8, 9, 1, 0xff0000ff},

};

LPDIRECT3DVERTEXBUFFER8 p_VertexBuffer = NULL;

Эта структура содержит и координаты вершин, и их цвета

d3d_Device->CreateVertexBuffer (3*sizeof(CUSTOMVERTEX),

0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &p_VertexBuffer);

VOID* pVertices;

p_VertexBuffer->Lock (0, sizeof(g_Vertices), (BYTE**)&pVertices, 0);

memcpy (pVertices, g_Vertices, sizeof(g_Vertices));

p_VertexBuffer->Unlock();

CreateVertexBuffer - выделяет место на устройстве под три вершины

Lock() –блокирует буфер

memcpy() – копирует буфер в буфер видеокарты

Unlock() – разблокирует буфер

d3d_Device->BeginScene ();

d3d_Device->SetVertexShader (D3DFVF_CUSTOMVERTEX);

d3d_Device->SetStreamSource (0, p_VertexBuffer, sizeof(CUSTOMVERTEX));

d3d_Device->DrawPrimitive (D3DFVF_XYZRHW | D3DFVF_DIFFUSE, 0, 1);

d3d_Device->EndScene ();

SetVertexShader() определяет тип вершин.

SetStreamSource() задает поток для дальнейшей работы.

DrawPrimitive - рисует примитивы на экране

Видно, что код OpenGLв несколько раз меньше, ноDirect3Dпозволяет работать на более низком уровне, т.е. более точно управлять железом.

DirectX очень удобен для любителей объектно-ориентированного программирования и COM в частности. COM в DirectX используется для внесения изменений в библиотеку (в новых версиях) без изменения существующего кода. В OpenGL такого нет, но это вряд ли можно назвать серьезным недостатком.

Объем кода, необходимого для написания простой программы на DirectX, весьма велик (варьируется от 200 до 800 строк). Microsoft активно пытается уменьшить этот показатель, но он, тем не менее, достаточно велик. В OpenGL все существенно проще - для решения такой же задачи необходимо менее 50 строк кода.