Вершинный туман (Direct3D 9)

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

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

Примечание

При использовании шейдера вершин необходимо использовать вершинный туман. Это достигается с помощью шейдера вершин для записи интенсивности тумана на вершину в регистр Офог. После завершения построителя текстуры данные Офог используются для линейной интерполяции с помощью цвета тумана. Эта интенсивность недоступна в шейдере пикселей.

Range-Based туман

Примечание

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

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

схема двух точек зрения и их влияние на туман для двух объектов

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

Если текущее устройство поддерживает туман на основе диапазонов, то _ при вызове метода IDirect3DDevice9:: жетдевицекапс будет задано значение D3DPRASTERCAPS Фогранже в элементе растеркапс D3DCAPS9 . Чтобы включить туман на основе диапазона, установите _ для состояния отрисовки D3DRS Ранжефоженабле значение true.

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

Использование вершинного тумана

Чтобы включить вершину тумана в приложении, выполните следующие действия.

  1. Включите смешение тумана, задав _ для D3DRS Фоженабле значение true.
  2. Задайте цвет тумана в _ состоянии рендеринга D3DRS фогколор.
  3. Выберите нужную формулу тумана, задав _ для состояния отрисовки D3DRS фогвертексмоде элемент перечисляемого типа D3DFOGMODE .
  4. Задайте необходимые параметры тумана для выбранной формулы тумана в состояниях рендеринга.

В следующем примере, написанном на C++, показано, как эти шаги могут выглядеть в коде.

// 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 SetupVertexFog(DWORD Color, DWORD Mode, BOOL UseRange, FLOAT Density)
{
    float Start = 0.5f,    // Linear fog distances
          End   = 0.8f;
 
    // Enable fog blending.
    g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
 
    // Set the fog color.
    g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color);
    
    // Set fog parameters.
    if(D3DFOG_LINEAR == Mode)
    {
        g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
        g_pDevice->SetRenderState(D3DRS_FOGEND,   *(DWORD *)(&End));
    }
    else
    {
        g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
    }

    // Enable range-based fog if desired (only supported for
    //   vertex fog). For this example, it is assumed that UseRange
    //   is set to a nonzero value only if the driver exposes the 
    //   D3DPRASTERCAPS_FOGRANGE capability.
    // Note: This is slightly more performance intensive
    //   than non-range-based fog.
    if(UseRange)
        g_pDevice->SetRenderState(D3DRS_RANGEFOGENABLE, TRUE);
}

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

Типы туманов