KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Прочая околокомпьтерная литература » Журнал Компьютерра - Журнал «Компьютерра» №45 от 01 декабря 2005 года

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Журнал Компьютерра, "Журнал «Компьютерра» №45 от 01 декабря 2005 года" бесплатно, без регистрации.
Перейти на страницу:

Для начала очистим фон. В OpenGL для этого потребуется написать следующую строку:

glClear(GL_COLOR_BUFFER_BIT);

где glClear() - функция, предназначенная для очистки буферов, а константа GL_COLOR_BUFFER_BIT указывает, что именно нужно очистить.

Для аналогичной операции в D3D нужно написать

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

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

Вот рабочее пространство и готово, можно приступать к рисованию. В 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).

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*