Пиксель туман (Direct3D 9)
Туман пикселей получает свое имя от того факта, что он вычисляется на основе пикселя в драйвере устройства. Это отличается от тумана вершин, вычисляемого конвейером во время преобразования и вычислений освещения. Туман пикселей иногда называется табличным туманом, так как некоторые водители используют предварительно вычисляемую таблицу подстановки для определения коэффициента тумана, используя глубину каждого пикселя для применения в вычислениях смешения. Его можно применять с помощью любой формулы тумана, определяемой членами перечисленного типа D3DFOGMODE. Реализация этих формул зависит от драйвера. Если драйвер не поддерживает сложную формулу тумана, она должна снизиться до менее сложной формулы.
Eye-Relative и глубину на основе Z
Чтобы облегчить графические артефакты, связанные с туманом, вызванные неравномерное распределение z-значений в буфере глубины, большинство аппаратных устройств используют относительную глубину глаз вместо значений глубины на основе z для пиксельного тумана. Глубина относительного взгляда, по сути, является элементом w из однородного набора координат. Microsoft Direct3D принимает обратный элемент RHW из координат пространства устройства для воспроизведения true w. Если устройство поддерживает туман относительно глаз, он задает флаг D3DPRASTERCAPS_WFOG в элементе RasterCaps структуры D3DCAPS9 при вызове метода IDirect3Device9::GetDeviceCaps. За исключением эталонного растризатора, программные устройства всегда используют z для вычисления эффектов тумана пикселей.
Если поддерживается туман относительного взгляда, система автоматически использует относительную глубину глаз, а не глубину на основе z, если указанная матрица проекции создает z-значения в мировом пространстве, эквивалентные w-значениям в пространстве устройства. Матрицу проекции можно задать путем вызова метода IDirect3Device9::SetTransform, используя значение D3DTS_PROJECTION и передав структуру D3DMATRIX, представляющую нужную матрицу. Если матрица проекции не соответствует этому требованию, эффекты тумана не применяются должным образом. Дополнительные сведения о создании соответствующей матрицы см. в преобразования проекции (Direct3D 9).
Direct3D использует матрицу проекции в текущий момент в вычислениях глубины на основе W. В результате приложение должно задать соответствующую матрицу проекции для получения требуемых функций на основе W, даже если он не использует конвейер преобразования Direct3D.
Direct3D проверяет четвертый столбец матрицы проекции. Если коэффициенты равны [0,0,0,1] (для аффинной проекции), система будет использовать значения глубины z для тумана. В этом случае необходимо также указать расстояния начала и конца для эффектов линейного тумана в пространстве устройства, который диапазон от 0,0 до пользователя и 1,0 в самой дальней точке.
Использование пиксельного тумана
Чтобы включить туман пикселей в приложении, выполните следующие действия.
- Включите смешение тумана, задав состояние отрисовки D3DRS_FOGENABLE TRUE.
- Задайте нужный цвет тумана в состоянии отрисовки D3DRS_FOGCOLOR.
- Выберите формулу тумана, которую следует использовать, задав состояние отрисовки D3DRS_FOGTABLEMODE соответствующему элементу перечисленного типа D3DFOGMODE.
- Задайте параметры тумана в нужном для выбранного режима тумана в связанных состояниях отрисовки. Сюда входят расстояния начала и конца для линейного тумана и плотности тумана для экспоненциального режима тумана.
В следующем примере показано, как выглядят эти шаги в коде.
// For brevity, error values in this example are not checked
// after each call. A real-world application should check
// these values appropriately.
//
// For the purposes of this example, g_pDevice is a valid
// pointer to an IDirect3DDevice9 interface.
void SetupPixelFog(DWORD Color, DWORD Mode)
{
float Start = 0.5f; // For linear mode
float End = 0.8f;
float Density = 0.66f; // For exponential modes
// Enable fog blending.
g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
// Set the fog color.
g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color);
// Set fog parameters.
if( Mode == D3DFOG_LINEAR )
{
g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
g_pDevice->SetRenderState(D3DRS_FOGEND, *(DWORD *)(&End));
}
else
{
g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
}
Некоторые параметры тумана требуются в качестве значений с плавающей запятой, даже если метод IDirect3Device9::SetRenderState принимает только значения DWORD во втором параметре. В предыдущем примере значения с плавающей запятой предоставляются для IDirect3Device9::SetRenderState без перевода данных путем приведения адресов переменных с плавающей запятой в виде указателей DWORD, а затем разыменовывать их.
Связанные разделы