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


начало работы с этапом растеризатора

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

Настройка окна просмотра

Окно просмотра сопоставляет позиции вершин (в клиповом пространстве) с целевыми позициями отрисовки. На этом шаге объемные позиции масштабируются в объемное пространство. Целевой объект отрисовки ориентирован с осями Y, указывающими вниз; Для этого необходимо, чтобы координаты Y были перевернуты во время масштабирования окна просмотра. Кроме того, экстенты x и y (диапазон значений x и y) масштабируются в соответствии со следующими формулами:

X = (X + 1) * Viewport.Width * 0.5 + Viewport.TopLeftX
Y = (1 - Y) * Viewport.Height * 0.5 + Viewport.TopLeftY
Z = Viewport.MinDepth + Z * (Viewport.MaxDepth - Viewport.MinDepth) 

В руководстве 1 создается окно просмотра 640 × 480 с помощью D3D11_VIEWPORT и путем вызова ID3D11DeviceContext::RSSetViewports.

    D3D11_VIEWPORT vp[1];
    vp[0].Width = 640.0f;
    vp[0].Height = 480.0f;
    vp[0].MinDepth = 0;
    vp[0].MaxDepth = 1;
    vp[0].TopLeftX = 0;
    vp[0].TopLeftY = 0;
    g_pd3dContext->RSSetViewports( 1, vp );

В описании окна просмотра указывается размер окна просмотра, диапазон для сопоставления глубины (с помощью MinDepth и MaxDepth) и расположение верхней левой части окна просмотра. Значение MinDepth должно быть меньше или равно MaxDepth; Диапазон для MinDepth и MaxDepth составляет от 0,0 до 1,0 включительно. Окно просмотра обычно сопоставляется с целевым объектом отрисовки, но это необязательно. Кроме того, окно просмотра не обязательно иметь тот же размер или положение, что и целевой объект отрисовки.

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

Максимальное количество окне просмотра (и прямоугольников ножниц), которые можно привязать к этапу растеризатора в любой момент времени, равно 16 (определяется D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE).

Установка прямоугольника ножницы

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

Чтобы включить прямоугольник ножницы, используйте элемент ScissorEnableD3D11_RASTERIZER_DESC1). Прямоугольник ножницы по умолчанию представляет собой пустой прямоугольник; то есть все значения прямоугольника имеют значение 0. Другими словами, если вы не настроили прямоугольник ножницы и ножницы включены, вы не будете отправлять пиксели на этап слияния вывода. Наиболее распространенной настройкой является инициализация прямоугольника ножницы размером окна просмотра.

Чтобы задать для устройства массив прямоугольников ножниц, вызовите ID3D11DeviceContext::RSSetScissorRects с D3D11_RECT.

  D3D11_RECT rects[1];
  rects[0].left = 0;
  rects[0].right = 640;
  rects[0].top = 0;
  rects[0].bottom = 480;

  g_pd3dContext->RSSetScissorRects( 1, rects );

Этот метод принимает два параметра: (1) количество прямоугольников в массиве и (2) массив прямоугольников.

Конвейер использует индекс прямоугольника ножницы по умолчанию во время растеризации (по умолчанию используется прямоугольник нулевого размера с отключенной обрезкой). Чтобы переопределить это, укажите семантику SV_ViewportArrayIndex для компонента вывода GS в объявлении сигнатуры вывода GS. Это приведет к тому, что этап GS помечает этот выходной компонент GS как компонент, созданный системой, с этой семантикой. Этап растеризатора распознает эту семантику и будет использовать параметр, к которому он присоединен, в качестве индекса прямоугольника ножницы для доступа к массиву прямоугольников ножниц. Не забудьте сообщить этапу растеризатора использовать прямоугольник ножницы, который вы определяете, включив значение ScissorEnable в описании растеризатора перед созданием объекта растеризатора.

Установка состояния растеризатора

Начиная с Direct3D 10, состояние растеризатора инкапсулируется в объект состояния растеризатора. Можно создать до 4096 объектов состояния растеризатора, которые затем можно задать для устройства, передав дескриптор объекту состояния.

Используйте ID3D11Device1::CreateRasterizerState1 , чтобы создать объект состояния растеризатора на основе описания растеризатора (см . D3D11_RASTERIZER_DESC1).

    ID3D11RasterizerState1 * g_pRasterState;

    D3D11_RASTERIZER_DESC1 rasterizerState;
    rasterizerState.FillMode = D3D11_FILL_SOLID;
    rasterizerState.CullMode = D3D11_CULL_FRONT;
    rasterizerState.FrontCounterClockwise = true;
    rasterizerState.DepthBias = false;
    rasterizerState.DepthBiasClamp = 0;
    rasterizerState.SlopeScaledDepthBias = 0;
    rasterizerState.DepthClipEnable = true;
    rasterizerState.ScissorEnable = true;
    rasterizerState.MultisampleEnable = false;
    rasterizerState.AntialiasedLineEnable = false;
    rasterizerState.ForcedSampleCount = 0;
    g_pd3dDevice->CreateRasterizerState1( &rasterizerState, &g_pRasterState );

Этот пример набора состояний выполняет, пожалуй, самую простую настройку растеризатора:

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

Кроме того, основные операции растеризатора всегда включают в себя следующее: обрезка (в области представления), деление перспективы и масштаб окна просмотра. После успешного создания объекта состояния растеризатора задайте для него устройство следующим образом:

    g_pd3dContext->RSSetState(g_pRasterState);

Множественная дискретизация

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

Для использования множественной выборки задайте поле enable в описании растеризации, создайте целевой объект отрисовки с несколькими выборками и либо считайте целевой объект отрисовки с помощью шейдера, чтобы разрешить выборки в один цвет пикселей, либо вызовите ID3D11DeviceContext::ResolveSubresource для разрешения примеров с помощью карта видео. Наиболее распространенным сценарием является рисование одного или нескольких целевых объектов отрисовки с несколькими выборками.

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

Тестирование глубины зависит от множественной выборки:

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

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

Этап растеризации