Поделиться через


Окна просмотра и вырезки (Direct3D 9)

Концептуально, окно просмотра представляет собой двухмерный прямоугольник (2D), в который проецируется трехмерная сцена. В Direct3D прямоугольник существует в виде координат в поверхности Direct3D, которую система использует в качестве целевого объекта отрисовки. Преобразование проекции преобразует вершины в систему координат, используемую для окна просмотра. Окно просмотра также используется для указания диапазона значений глубины на целевой поверхности отрисовки, в которой будет отображаться сцена (обычно от 0,0 до 1.0).

Просмотр Frustum

Вид frustum — трехмерный том в сцене, расположенной относительно камеры окна просмотра. Форма тома влияет на то, как модели проецируются из пространства камеры на экран. Наиболее распространенный тип проекции, проекция перспективы, отвечает за то, что объекты рядом с камерой появляются больше, чем объекты на расстоянии. Для просмотра перспективы вид frustum можно визуализировать как пирамиду, с камерой, размещенной на кончике, как показано на следующем рисунке. Эта пирамида пересекается передней и задней вырезкой плоскости. Объем внутри пирамиды между передним и задним вырезкой плоскостей является просмотр frustum. Объекты видны только в томе.

illustration of a viewing frustrum with a front and back clipping plan

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

Вид frustum определяется fov (полем зрения) и расстоянием переднего и заднего вырезки плоскостей, указанными в z-координатах, как показано на следующей схеме.

diagram of the viewing frustum

На этой схеме переменная D — это расстояние от камеры к источнику пространства, определенного в последней части конвейера геометрии — преобразование просмотра. Это пространство, вокруг которого вы упорядочиете пределы просмотра frustum. Сведения о том, как эта переменная D используется для создания матрицы проекции, см. в разделе "Преобразование проекции" (Direct3D 9)

Видпорт Прямоугольник

Прямоугольник окна представления в C++ определяется с помощью структуры D3DVIEWPORT9. Структура D3DVIEWPORT9 используется со следующими методами обработки представления, предоставляемыми интерфейсом IDirect3Device9.

Структура D3DVIEWPORT9 содержит четыре элемента : X, Y, Width, Height , определяющие область целевой поверхности отрисовки, в которую будет отображаться сцена. Эти значения соответствуют прямоугольнику назначения или прямоугольнику окна представления, как показано на следующей схеме.

diagram of the viewport rectangle

Значения, заданные для элементов X, Y, Width, Height, — это координаты экрана относительно левого верхнего угла целевой поверхности отрисовки. Структура определяет два дополнительных элемента (MinZ и MaxZ), указывающие диапазоны глубины, в которые будет отображаться сцена.

Direct3D предполагает, что объем отрезки окна просмотра от -1.0 до 1.0 в X и от 1.0 до -1.0 в Y. Это были параметры, используемые чаще всего приложениями в прошлом. Вы можете настроить пропорции окна просмотра перед вырезки с помощью преобразования проекции.

Примечание.

MinZ и MaxZ указывают диапазоны глубины, в которые будет отображаться сцена, и не используются для вырезки. Большинство приложений установят для этих элементов значение 0.0 и 1.0, чтобы система отображала весь диапазон значений глубины в буфере глубины. В некоторых случаях можно добиться специальных эффектов с помощью других диапазонов глубины. Например, чтобы отобразить в игре отображение головы, можно задать для обоих значений значение 0,0, чтобы заставить систему отрисовки объектов в сцене на переднем плане, или можно задать для них значение 1.0 для отрисовки объекта, который всегда должен находиться в фоновом режиме.

 

Измерения, используемые в элементах X, Y, Width, Height в структуре D3DVIEWPORT9 для окна просмотра, определяют расположение и размеры окна просмотра на поверхности отрисовки. Эти значения находятся в координатах экрана относительно левого верхнего угла поверхности.

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

equation of the matrix that is applied to each vertex

Эта матрица масштабирует вершины в соответствии с измерениями окна просмотра и требуемым диапазоном глубины и преобразует их в соответствующее расположение на целевой поверхности отрисовки. Матрица также переворачивает координату y, чтобы отразить источник экрана в левом верхнем углу с увеличением вниз. После применения этой матрицы вершины по-прежнему однородные - то есть они по-прежнему существуют как вершины [x,y,z,w], и они должны быть преобразованы в неоднородные координаты перед отправкой в растризатор.

Примечание.

Матрица масштабирования окна просмотра включает элементы MinZ и MaxZ структуры D3DVIEWPORT9 для масштабирования вершин, чтобы соответствовать диапазону глубины [MinZ, MaxZ]. Это представляет другую семантику от предыдущих выпусков DirectX, в которых эти элементы использовались для вырезки.

 

Примечание.

Приложения обычно задают для MinZ и MaxZ значение 0.0 и 1.0 соответственно, чтобы система отображала весь диапазон глубины. Однако для достижения определенных результатов можно использовать другие значения. Например, можно задать для обоих значений значение 0,0, чтобы принудительно перевести все объекты на передний план или задать для отображения всех объектов в фоновом режиме оба значения 1.0.

 

Очистка окна просмотра

Очистка окна просмотра сбрасывает содержимое прямоугольника окна представления на целевой поверхности отрисовки. Он также может очистить прямоугольник в поверхностях буфера глубины и наборов элементов.

Используйте IDirect3Device9::Clear , чтобы очистить окно просмотра. Метод принимает один или несколько прямоугольников, определяющих области на поверхности, очищаемые. Установка параметра Count значение 1, а параметр pRects — адрес одного прямоугольника, охватывающего всю область просмотра, очищает весь окно просмотра. Другим способом очистки всего окна просмотра является установка параметра pRects значение NULL , а параметр Count — 0.

IDirect3Device9 ::Clear можно использовать для очистки битов наборов элементов в буфере глубины. Просто задайте параметр Flags, чтобы определить, как IDirect3DDevice9::Clear работает с целевым объектом отрисовки и любыми связанными буферами глубины или наборов элементов. Флаг D3DCLEAR_TARGET очищает окно просмотра с помощью произвольного цвета RGBA, предоставленного в аргументе Color (это не цвет материала). Флаг D3DCLEAR_ZBUFFER очищает буфер глубины до произвольной глубины, указанной в Z: 0.0, является ближайшим расстоянием, и 1.0 является самым дальним. Флаг D3DCLEAR_STENCIL сбрасывает биты набора элементов в значение, указанное в аргументе набора элементов. Можно использовать целые числа, которые варьируются от 0 до 2n-1, где n — глубина бита буфера наборов элементов.

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

Настройка окна просмотра для вырезки

Результаты матрицы проекции определяют объем вырезки в пространстве проекции следующим образом:

-wc<= xc<= wc

-wc= yc<<= w c

0 <= zc<= wc

Где: x, y, z и w представляют координаты вершин после применения преобразования проекции. Все вершины, имеющие компонент x-, y или z вне этих диапазонов, обрезаются, если вырезка включена (поведение по умолчанию).

За исключением буферов вершин, приложения позволяют включить или отключить вырезку путем состояния отрисовки D3DRS_Cпакет интерфейса пользователя PING. Сведения об обрезке буферов вершин создаются во время обработки. Дополнительные сведения см. в разделе "Обработка вершин фиксированной функции" (Direct3D 9) и программируемая обработка вершин (Direct3D 9).

Direct3D не обрезает преобразованные вершины примитива из буфера вершин, если он не поступает из IDirect3Device9::P rocessVertices. Если вы выполняете собственные преобразования и требуется Direct3D для отрезки, не следует использовать буферы вершин. В этом случае приложение проходит по данным для его преобразования. Direct3D пересекает данные во второй раз, чтобы закрепить его, а затем драйвер отрисовывает данные, которые неэффективны. Таким образом, если приложение преобразует данные, также следует обрезать данные.

Когда устройство получает предварительно преобразованные и освещенные вершины (вершины T&L), которые должны быть обрезаны, для выполнения операции обрезки вершин вершин обратно преобразуются в пространство вырезки с помощью взаимной однородной w (RHW) вершины и сведений о представлении. Затем выполняется вырезка. Не все устройства способны выполнять это обратное преобразование, чтобы обрезать вершины T&L.

Возможность устройства D3DPMISCCAPS_Cпакет интерфейса пользователя TLVERTS указывает, может ли устройство обрезать вершины T&L. Если эта возможность не задана, приложение отвечает за вырезку вершин T&L, которые он намерен отправить на устройство для отрисовки. Устройство всегда может обрезать вершины T&L в режиме обработки вершин программного обеспечения (независимо от того, создано ли устройство в режиме обработки вершин программного обеспечения или переключится в режим обработки вершин программного обеспечения).

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

Для достижения этого в C++можно использовать следующие параметры для членов структуры D3DVIEWPORT9.

D3DVIEWPORT9 viewData = { 0, 0, width, height, 0.0f, 1.0f };

После установки значений в структуре D3DVIEWPORT9 примените параметры окна просмотра к устройству путем вызова метода IDirect3Device9::SetViewport. В следующем примере кода показано, как может выглядеть этот вызов.

HRESULT hr;

hr = pd3dDevice->SetViewport(&viewData);
if(FAILED(hr))
    return hr;

Если вызов выполнен успешно, параметры окна просмотра задаются и вступают в силу при следующем вызове метода отрисовки. Чтобы внести изменения в параметры окна просмотра, просто обновите значения в структуре D3DVIEWPORT9 и вызовите IDirect3Device9::SetViewport еще раз.

Примечание.

Элементы структуры D3DVIEWPORT9 MinZ и MaxZ указывают диапазоны глубины, в которые будет отображаться сцена, и не используются для вырезки. Большинство приложений устанавливают для этих элементов значение 0.0 и 1.0, чтобы система отображала весь диапазон значений глубины в буфере глубины. В некоторых случаях можно добиться специальных эффектов с помощью других диапазонов глубины. Например, чтобы отобразить в игре отображение головы, можно задать для обоих значений значение 0,0, чтобы заставить систему отрисовки объектов в сцене на переднем плане, или можно задать для них значение 1.0 для отрисовки объекта, который всегда должен находиться в фоновом режиме.

 

Начало работы