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


Методы буфера элементов (Direct3D 9)

Приложения используют буфер наборов элементов для маскирования пикселей на изображении. Маска определяет, рисуется ли пиксель. Ниже показаны некоторые из наиболее распространенных эффектов.

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

Сведения о буфере набора элементов внедрены в данные z-buffer. Приложение может использовать метод IDirect3D9::CheckDeviceFormat для проверка для поддержки наборов элементов оборудования, как показано в следующем примере кода.

// Reject devices that cannot perform 8-bit stencil buffering. 
// The following example assumes that pCaps is a valid pointer 
// to an initialized D3DCAPS9 structure. 

if( FAILED( m_pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal,
                                       pCaps->DeviceType,  
                                       Format,  
                                       D3DUSAGE_DEPTHSTENCIL, 
                                       D3DRTYPE_SURFACE,
                                       D3DFMT_D24S8 ) ) )
return E_FAIL;

IDirect3D9::CheckDeviceFormat позволяет выбрать устройство для создания на основе возможностей этого устройства. В этом случае устройства, не поддерживающие 8-разрядные буферы наборов элементов, отклоняются. Обратите внимание, что это только одно возможное использование для IDirect3D9::CheckDeviceFormat; дополнительные сведения см. в разделе "Определение поддержки оборудования" (Direct3D 9).

Как работает буфер набора элементов

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

  1. Выполните побитовую операцию AND значения ссылки на набор элементов с маской набора элементов.
  2. Выполните битовую операцию AND значения буфера набора элементов для текущего пикселя с маской набора элементов.
  3. Сравните результат шага 1 с результатом шага 2 с помощью функции сравнения.

Эти шаги показаны в следующем примере кода.

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
StencilBufferValue

— содержимое буфера элементов для текущего пикселя. В этом примере кода используется символ амперсанда (&) для представления побитовой операции AND.

StencilMask

представляет значение маски набора элементов и

StencilRef

представляет значение ссылки на набор элементов.

CompFunc

— это функция сравнения.

Текущий пиксель записывается на целевую поверхность, если тест набора элементов проходит и игнорируется в противном случае. Поведение сравнения по умолчанию заключается в записи пикселя независимо от того, как каждая побитовая операция оказывается (D3DCMP_ALWAYS). Это поведение можно изменить, изменив значение состояния отрисовки D3DRS_STENCILFUNC, передав элемент перечисленного типа D3DCMPFUNC , чтобы определить нужную функцию сравнения.

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

Примеры

В следующих примерах кода демонстрируется настройка буфера элементов.

// Enable stencil testing
pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);

// Specify the stencil comparison function
pDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);

// Set the comparison reference value
pDevice->SetRenderState(D3DRS_STENCILREF, 0);

//  Specify a stencil mask 
pDevice->SetRenderState(D3DRS_STENCILMASK, 0);

По умолчанию эталонное значение набора элементов равно нулю. Любое целочисленное значение допустимо. Direct3D выполняет побитовое значение и значение ссылки на набор элементов и значение маски набора перед тестом набора элементов.

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

// A write mask controls what is written
pDevice->SetRenderState(D3DRS_STENCILWRITEMASK, D3DSTENCILOP_KEEP);
// Specify when to write stencil data
pDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);

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

NewStencilBufferValue = (StencilBufferValue & ~StencilWriteMask) | 
                        (StencilWriteMask & StencilOp(StencilBufferValue))

Конвейер пикселей