Sabit İşlev FVF Kodları (Direct3D 9)
FVF kodu, tek bir veri akışında araya kaydedilen köşelerin içeriğini açıklar. Genellikle sabit işlev köşesi işleme işlem hattı tarafından işlenecek verileri belirtir. Bu eski stilde bir köşe bildirimidir; geçerli köşe bildirim stilini görmek için bkz. D3DVERTEXELEMENT9.
Direct3D uygulamaları, model köşelerini çeşitli yollarla tanımlayabilir. Esnek köşe biçimleri veya esnek köşe biçim kodları olarak da bilinen esnek köşe tanımları desteği, uygulamanızın yalnızca ihtiyaç duyduğu köşe bileşenlerini kullanmasını mümkün hale getirerek kullanılmayan bileşenleri ortadan kaldırır. Uygulamanız yalnızca gerekli köşe bileşenlerini kullanarak bellek tasarrufu yapabilir ve modelleri işlemek için gereken işlem bant genişliğini en aza indirir. köşelerinizin nasıl biçimlendirildiğini D3DFVF kodlarının birleşimini kullanarak açıklarsınız.
FVF belirtimi, D3DFVF_PSIZE tarafından belirtilen nokta boyutu biçimlerini içerir. Bu boyut, dönüştürülemeyen ve aydınlatılmamış (TL) köşeler için kamera alanı birimlerinde ve TL köşeleri için cihaz alanı birimlerinde ifade edilir.
IDirect3DDevice9 arabiriminin işleme yöntemleri, C++ uygulamalarına bu bayrakların bir bileşimini kabul eden yöntemler sağlar ve bunları kullanarak ilkellerin nasıl işleneceğini belirler. Temel olarak, bu bayraklar sisteme hangi köşe bileşenlerinin (konum, köşe karıştırma ağırlıkları, normal, renkler ve doku koordinatlarının sayısı ve biçimi) bildirir. Uygulamanız, direct3D'nin bunlara uygulanmasını istediğiniz işleme işlem hattının hangi bölümlerini dolaylı olarak kullanır. Buna ek olarak, belirli bir köşe biçimi bayrağının varlığı veya yokluğu sisteme bellekte hangi köşe bileşeni alanlarının bulunduğunu ve hangilerini atladığınızı bildirir.
Cihaz sınırlamalarını belirlemek için, D3DCAPS9FVFCaps üyesindeki D3DFVFCAPS_DONOTSTRIPELEMENTS ve D3DFVFCAPS_TEXCOORDCOUNTMASK değerlerini bir cihazı sorgulayabilirsiniz.
Doku koordinatları farklı biçimlerde bildirilebilir ve dokuların en az bir koordinat veya en fazla dört doku koordinatı kullanılarak ele alınmasına olanak sağlar (2B yansıtılan doku koordinatları için). Daha fazla bilgi için bkz. doku koordinat biçimleri (Direct3D 9) . Köşe biçiminizin kullandığı doku koordinat biçimlerini tanımlayan bit desenleri oluşturmak için D3DFVF_TEXCOORDSIZEN makro kümesini kullanın.
Hiçbir uygulama her bileşeni kullanmaz. Karşılıklı homojen W (RHW) ve köşe normal alanları birbirini dışlar. Çoğu uygulama sekiz doku koordinatı kümesinin tamamını da kullanmaya çalışmaz, ancak Direct3D bu kapasiteye sahiptir. Diğer bayraklarla hangi bayrakları kullanabileceğiniz konusunda çeşitli kısıtlamalar vardır. Örneğin, D3DFVF_XYZ ve D3DFVF_XYZRHW bayraklarını birlikte kullanamazsınız, çünkü bu durum uygulamanızın hem çevrilmemiş hem de dönüştürülmüş köşelerle bir köşenin konumunu tanımladığını gösterir.
Dizine alınan köşe karıştırmayı kullanmak için, D3DFVF_LASTBETA_UBYTE4 bayrağı FVF bildiriminin sonunda görünmelidir. Bu bayrağın varlığı beşinci karıştırma ağırlığının float yerine DWORD olarak ele alınacağını gösterir. Daha fazla bilgi için bkz. Dizinli Köşe Karıştırma (Direct3D 9).
Aşağıdaki kod örnekleri, D3DFVF_LASTBETA_UBYTE4 bayrağını kullanan bir FVF kodu ile olmayan kod arasındaki farkı gösterir. Dört karıştırma dizinleri kullanıldığında bayrak D3DFVF_XYZB3 vardır çünkü dördüncü elde etmek için her zaman ilk üçünün toplamını bir numaradan çıkarırsınız (blend₄ = 1 - (blend₁ + blend₂ + blend₃)).
#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB3|D3DFVF_NORMAL|D3DFVF_TEX1)
struct BLENDVERTEX
{
D3DXVECTOR3 v; // Referenced as v0 in the vertex shader
FLOAT blend1; // Referenced as v1.x in the vertex shader
FLOAT blend2; // Referenced as v1.y in the vertex shader
FLOAT blend3; // Referenced as v1.z in the vertex shader
// v1.w = 1.0 - (v1.x + v1.y + v1.z)
D3DXVECTOR3 n; // Referenced as v3 in the vertex shader
FLOAT tu, tv; // Referenced as v7 in the vertex shader
};
Aşağıda tanımlanan FVF, D3DFVF_LAST_UBYTE4 bayrağını kullanır.
#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 |D3DFVF_NORMAL|D3DFVF_TEX1)
struct BLENDVERTEX
{
D3DXVECTOR3 v; // Referenced as v0 in the vertex shader
FLOAT blend1; // Referenced as v1.x in the vertex shader
FLOAT blend2; // Referenced as v1.y in the vertex shader
FLOAT blend3; // Referenced as v1.z in the vertex shader
// v1.w = 1.0 - (v1.x + v1.y + v1.z)
DWORD indices; // Referenced as v2.xyzw in the vertex shader
D3DXVECTOR3 n; // Referenced as v3 in the vertex shader
FLOAT tu, tv; // Referenced as v7 in the vertex shader
};
İlgili konular