Köşe Sisi (Direct3D 9)
Sistem köşe fogging gerçekleştirdiğinde, bir poligondaki her köşeye sis hesaplamaları uygular ve ardından rasterleştirme sırasında sonuçları çokgenin yüzüne eşler. Köşe sis efektleri Direct3D aydınlatma ve dönüşüm motoru tarafından hesaplanır. Daha fazla bilgi için bkz. Fog Parameters (Direct3D 9).
Uygulamanız dönüştürme ve aydınlatma için Direct3D kullanmıyorsa, uygulamanın sis hesaplamaları yapması gerekir. Bu durumda, hesaplanan sis faktörünü her köşe için belirtik rengin alfa bileşenine yerleştirin. Aralık tabanlı, hacimli veya başka bir şekilde istediğiniz formülleri kullanabilirsiniz. Direct3D, sağlanan sis faktörünü kullanarak her bir poligonun yüzü arasında ara değer oluşturur. Kendi dönüşüm ve aydınlatma işlemlerini gerçekleştiren uygulamaların kendi köşe sis hesaplamalarını da yapması gerekir. Sonuç olarak, böyle bir uygulama yalnızca sis karıştırmayı etkinleştirmeli ve Sis Karıştırma (Direct3D 9) ve Sis Rengi (Direct3D 9)'de açıklandığı gibi sis rengini ilişkili işleme durumlarında ayarlamalıdır.
Not
Köşe gölgelendiricisi kullanırken köşe sisi kullanmanız gerekir. Bu, köşe başına sis yoğunluğunu oFog yazmacına yazmak için köşe gölgelendiricisi kullanılarak gerçekleştirilir. Piksel gölgelendiricisi tamamlandıktan sonra oFog verileri sis rengiyle doğrusal olarak ilişkilendirmek için kullanılır. Bu yoğunluk bir piksel gölgelendiricisinde kullanılamaz.
Range-Based Sis
Not
Direct3D, yalnızca Direct3D dönüştürme ve aydınlatma motoru ile köşe sis kullanırken aralık tabanlı sis hesaplamaları kullanır. Bunun nedeni, cihaz sürücüsünde piksel sisinin uygulanmasıdır ve şu anda piksel başına aralık tabanlı sisi destekleyen bir donanım yoktur. Uygulamanız kendi dönüşüm ve aydınlatmasını gerçekleştiriyorsa, aralık tabanlı veya başka bir şekilde kendi sis hesaplamalarını gerçekleştirmesi gerekir.
Bazen sis kullanmak, nesnelerin sis rengiyle hiçbir şekilde karıştırılmamasına neden olan grafik yapıtlara neden olabilir. Örneğin, iki görünür nesnenin bulunduğu bir sahne düşünün: biri sisten etkilenecek kadar uzak ve diğeri etkilenmeyecek kadar yakın. Görüntüleme alanı yerinde döndürülürse, nesneler sabit olsa bile görünür sis efektleri değişebilir. Aşağıdaki diyagramda böyle bir durumun yukarıdan aşağıya görünümü gösterilmektedir.
İki bakış açısının
Aralık tabanlı sis, sis etkilerini belirlemenin başka, daha doğru bir yoludur. Aralık tabanlı siste Direct3D, sis hesaplamaları için görüş noktasından köşeye olan gerçek uzaklığı kullanır. Direct3D, sahne içindeki köşenin derinliği yerine iki nokta arasındaki mesafe arttıkça sinin etkisini artırır ve böylece dönme yapıtlarından kaçınır.
Geçerli cihaz aralık tabanlı sisi destekliyorsa, IDirect3DDevice9::GetDeviceCaps yöntemini çağırdığınızda D3DCAPS9 RasterCaps üyesindeki D3DPRASTERCAPS_FOGRANGE değerini ayarlar. Aralık tabanlı sis özelliğini etkinleştirmek için D3DRS_RANGEFOGENABLE işleme durumunu TRUE olarak ayarlayın.
Aralık tabanlı sis, dönüştürme ve aydınlatma sırasında Direct3D tarafından hesaplanır. Direct3D dönüştürme ve aydınlatma altyapısını kullanmayan uygulamaların kendi köşe sis hesaplamalarını da yapması gerekir. Bu durumda, her köşe için belirtik bileşenin alfa bileşeninde aralık tabanlı sis faktörünü sağlayın.
Köşe Sisi Kullanma
Uygulamanızda köşe sisini etkinleştirmek için aşağıdaki adımları kullanın.
- D3DRS_FOGENABLE true olarak ayarlayarak sis karıştırmayı etkinleştirin.
- D3DRS_FOGCOLOR işleme durumunda sis rengini ayarlayın.
- D3DRS_FOGVERTEXMODE işleme durumunu numaralandırılmış D3DFOGMODE türünün bir üyesine ayarlayarak istediğiniz sis formülünü seçin.
- İşleme durumlarında seçilen sis formülü için sis parametrelerini istediğiniz gibi ayarlayın.
C++ ile yazılan aşağıdaki örnek, bu adımların kodda nasıl görünebileceğini gösterir.
// 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::SetRenderState yöntemi yalnızca ikinci parametredeki DWORD değerlerini kabul etse de bazı sis parametreleri kayan nokta değerleri olarak gereklidir. Bu ö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 bu yöntemlere kayan nokta değerlerini başarıyla sağlar.
İlgili konular