Aracılığıyla paylaş


Piksel Sis (Direct3D 9)

Piksel sis, cihaz sürücüsünde piksel bazında hesaplandığından adını alır. Bu, dönüştürme ve aydınlatma hesaplamaları sırasında işlem hattı tarafından hesaplanan köşe sisinden farklıdır. Bazı sürücüler, karıştırma hesaplamalarında uygulanacak her pikselin derinliğini kullanarak sis faktörünü belirlemek için önceden hesaplanmış bir arama tablosu kullandığından piksel sisi bazen tablo sisi olarak adlandırılır. D3DFOGMODE numaralandırılmış türü üyeleri tarafından tanımlanan herhangi bir sis formülü kullanılarak uygulanabilir. Bu formüllerin uygulamaları sürücüye özeldir. Bir sürücü karmaşık bir sis formülünü desteklemiyorsa, daha az karmaşık bir formüle düşürülmelidir.

Eye-Relative ve Z Tabanlı Derinlik karşılaştırması

Derinlik arabelleğindeki z değerlerinin eşit olmayan şekilde dağıtılmasının neden olduğu sisle ilgili grafik yapıtlarını hafifletmek için çoğu donanım cihazı piksel sisi için z tabanlı derinlik değerleri yerine gözle göreli derinlik kullanır. Gözle göreli derinlik temelde homojen bir koordinat kümesindeki w öğesidir. Microsoft Direct3D, rhw öğesinin karşılıklı değerini true w'yi yeniden oluşturmak için ayarlanan bir cihaz alanı koordinatından alır. Bir cihaz gözle ilgili sisi destekliyorsa, IDirect3DDevice9::GetDeviceCaps yöntemini çağırdığınızda D3DCAPS9 yapısının RasterCaps üyesinde D3DPRASTERCAPS_WFOG bayrağını ayarlar. Başvuru rasterleştiricisi dışında yazılım cihazları piksel sis efektlerini hesaplamak için her zaman z kullanır.

Göz göreli sis desteklendiğinde, sağlanan projeksiyon matrisi dünya uzayında cihaz alanında w değerlerine eşdeğer z değerleri üretirse sistem otomatik olarak z tabanlı derinlik yerine göz göreli derinliği kullanır. IDirect3DDevice9::SetTransform yöntemini çağırarak, D3DTS_PROJECTION değerini kullanarak ve istenen matrisi temsil eden bir D3DMATRIX yapısı geçirerek projeksiyon matrisini ayarlarsınız. Projeksiyon matrisi bu gereksinimle uyumlu değilse, sis efektleri düzgün uygulanmaz. Uyumlu matris oluşturma hakkında ayrıntılı bilgi için bkz. Projeksiyon Dönüşümü (Direct3D 9) .

Direct3D, w tabanlı derinlik hesaplamalarında şu anda ayarlanmış projeksiyon matrisini kullanır. Sonuç olarak, bir uygulamanın Direct3D dönüştürme işlem hattını kullanmasa bile istenen w tabanlı özellikleri almak için uyumlu bir projeksiyon matrisi ayarlaması gerekir.

Direct3D, projeksiyon matrisinin dördüncü sütununu denetler. Katsayılar [0,0,0,1] ise (bir afin projeksiyonu için) sistem sis için z tabanlı derinlik değerlerini kullanır. Bu durumda, cihaz alanında doğrusal sis efektleri için başlangıç ve bitiş uzaklıklarını da belirtmeniz gerekir. Bu, kullanıcıya en yakın noktada 0,0, en uzak noktada ise 1,0 aralığındadır.

Piksel Sis Kullanma

Uygulamanızda piksel sisini etkinleştirmek için aşağıdaki adımları kullanın.

  1. D3DRS_FOGENABLE işleme durumunu TRUE olarak ayarlayarak sis karıştırmayı etkinleştirin.
  2. İstenen sis rengini D3DRS_FOGCOLOR işleme durumunda ayarlayın.
  3. D3DRS_FOGTABLEMODE işleme durumunu D3DFOGMODE numaralandırılmış türün ilgili üyesine ayarlayarak kullanılacak sis formülünü seçin.
  4. İlişkili işleme durumlarında seçilen sis modu için sis parametrelerini istediğiniz gibi ayarlayın. Buna doğrusal sis için başlangıç ve bitiş uzaklıkları ve üstel sis modu için sis yoğunluğu dahildir.

Aşağıdaki örnekte bu adımların kodda nasıl görünebileceği gösterilmektedir.

// 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));
    }

IDirect3DDevice9::SetRenderState yöntemi ikinci parametrede yalnızca DWORD değerlerini kabul etse de bazı sis parametreleri kayan nokta değerleri olarak gereklidir. Yukarıdaki örnek, kayan nokta değişkenlerinin adreslerini DWORD işaretçileri olarak dönüştürerek ve sonra bunların başvurularını kaldırarak veri çevirisi olmadan IDirect3DDevice9::SetRenderState kayan nokta değerlerini sağlar.

Sis Türleri