Чтение онлайн

на главную - закладки

Жанры

Журнал «Компьютерра» №45 от 01 декабря 2005 года
Шрифт:

Вот рабочее пространство и готово, можно приступать к рисованию. В OGL все примитивы для обрисовки должны находиться между вызовами glBegin и glEnd, некоторым их аналогом в D3D являются d3d_Device-›BeginScene и d3d_Device-›EndScene . В случае с OGL уже можно привести фрагмент кода, выполняющий нашу задачу:

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);

glVertex3d - это вершины нашего треугольника, Название функции интуитивно понятно, но 3d, как ни странно, не означает «трехмерный»; точнее, 3 - как раз означает, а вот d - это тип аргументов (double). GL_TRIANGLES указывает, что все последующие вершины будут последовательно образовывать треугольники (если бы у нас было не три, а шесть вершин - получилось бы два треугольника). glColor3d принимает на вход цветовые компоненты RGB, и все вершины, идущие после него и до следующего вызова glColor, будут иметь соответствующий цвет.

В 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;

Эта структура содержит и координаты вершин, и их цвета. p_VertexBuffer - указатель на нашу структуру, для хранения вершин.

Теперь напишем следующее:

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

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

VOID* pVertices;

p_VertexBuffer-›Lock (0, sizeof(g_Vertices), (BYTE**) amp;pVertices, 0);

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

p_VertexBuffer-›Unlock;

CreateVertexBuffer - выделяет место на устройстве под три вершины (3*sizeof(CUSTOMVERTEX),) и присваивает его нашему указателю (p_VertexBuffer). Далее «запираем» (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 задает поток для дальнейшей работы. Здесь 0 - номер потока, второй параметр - данные, которые присваиваются к этому потоку, и третий параметр - размер, занимаемый в памяти одной вершиной. DrawPrimitive - рисует примитивы на экране, принимает на вход (в порядке следования) тип примитивов для отрисовки, индекс первой вершины, с которой нужно начать рисование, и количество примитивов в последовательности.

ТЕХНОЛОГИИ: Весь фокус в фокусе

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

В этом году группа из шести исследователей - Рена Н’ (да-да, именно такая фамилия, он держит фотокамеру на снимке справа), Марка Левоя, Мэтью Брэди, Марка Хоровитца, Пата Генрегана и основателя студии «Дюваль Дизайн» Рене Дюваля - предложила работающий прототип «фотокамеры будущего». Новый фотоаппарат, утверждают разработчики, позволяет делать специальные «четырехмерные» фотоснимки, из которых путем вычислений можно получать самые обычные цифровые отпечатки, но точку фокусировки можно менять уже после съемки.

Звучит невероятно? Однако это истинная правда. Более того, с такими снимками можно ознакомиться на сайте разработчиков. Снаружи чудо-камера выглядит точно так же, как и обычная цифровая, и все отличие заключено в оптической системе и алгоритме работы встроенного программного обеспечения. Группа экспериментировала со специально переделанной среднеформатной камерой Kodak DCS 645M, используя 16,6-мегапиксельную цифровую матрицу Kodak KaF-16802CE. Выбор столь дорогого образца разработчики объясняют просто: чтобы получить доступ к матрице, нужна была модель со съемной задней панелью. Такая конструкция бывает только у профессиональных фотокамер, в которых предусмотрена возможность замены не только объектива, но и «задника» с пленкой или CCD-матрицей.

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

Как было сказано, на снимке получается массив кусочков изображения, каждый из которых формируется отдельной микролинзой. Для этого разработчикам пришлось решить немало технологических проблем. Одна из них состояла в том, что при изменении точки фокусировки объектива (а он, разумеется, остался прежним) изображения, формируемые микролинзами на полупроводниковой матрице, могут либо уменьшаться, либо, наоборот, наползать друг на друга. Чтобы этого не случилось, матрицу с линзами расположили в фокальной плоскости объектива, сдвинув CCD-сенсор назад, для чего пришлось перестроить весь «регистрирующий» узел фотокамеры («задник»), а объектив зафиксировать в положении «бесконечность».

После съемки очередного кадра в дело вступает процессор фотокамеры, который из массы микроизображений формирует единственное, суммируя по определенному правилу информацию, полученную сенсором от каждой микролинзы. То есть контроль над изображением фактически забирается у оптической системы и отдается программе. В результате картинка на матрице уже не является конечной, это как бы массив информации об исходном изображении, в котором координаты конкретной точки указывают, откуда и под каким углом пришел луч, а яркость точки - соответственно яркость луча. О цвете точки мы не говорим, так как CCD-матрица представляет собой массив триад, где каждый полупроводниковый детектор имеет фильтр своего цвета. То есть каждая линза - это одна точка будущей фотографии, а координаты реальных точек детектора под микролинзой означают угол, под которым луч падает на микролинзу. Таким образом, разработчики говорят о четырехмерности имеющегося массива информации, поскольку каждая точка имеет четыре параметра: координаты X и Y на матрице, яркость и координаты линзы. Притом надо понимать, что никакая точка снимка уже не хранит информацию о конкретной точке исходного изображения.

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

Популярные книги

Путь Шамана. Шаг 6: Все только начинается

Маханенко Василий Михайлович
6. Мир Барлионы
Фантастика:
фэнтези
рпг
попаданцы
9.14
рейтинг книги
Путь Шамана. Шаг 6: Все только начинается

Экспедиция

Павлов Игорь Васильевич
3. Танцы Мехаводов
Фантастика:
героическая фантастика
альтернативная история
аниме
5.00
рейтинг книги
Экспедиция

Хочу тебя навсегда

Джокер Ольга
2. Люби меня
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Хочу тебя навсегда

Новый Рал

Северный Лис
1. Рал!
Фантастика:
фэнтези
попаданцы
5.70
рейтинг книги
Новый Рал

Ледяное проклятье

Михайлов Дем Алексеевич
4. Изгой
Фантастика:
фэнтези
9.20
рейтинг книги
Ледяное проклятье

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан

Тринадцатый

NikL
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
6.80
рейтинг книги
Тринадцатый

Ливонская партия

Ланцов Михаил Алексеевич
3. Иван Московский
Фантастика:
альтернативная история
5.00
рейтинг книги
Ливонская партия

Целитель. Книга третья

Первухин Андрей Евгеньевич
3. Целитель
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Целитель. Книга третья

Оружейникъ

Кулаков Алексей Иванович
2. Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Оружейникъ

Кодекс Охотника. Книга III

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Девяностые приближаются

Иванов Дмитрий
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Девяностые приближаются

Новый Рал 5

Северный Лис
5. Рал!
Фантастика:
попаданцы
5.00
рейтинг книги
Новый Рал 5