Tessellation (Direct3D 9)
Tessellator Birimi
Tessellator ünitesi geliştirildi. Şimdi bunu kullanarak:
- Tüm yüksek sıralı temel öğelerinin uyarlamalı döşemesini gerçekleştirin.
- Yer değiştirme haritasından köşe başına yer değiştirme değerlerini arayın ve köşe gölgelendiricisine geçirin.
- Dikdörtgen yamalı tessellation desteği. Bu, D3DDECLMETHOD_PARTIALU veya D3DDECLMETHOD_PARTIALV kullanılarak köşe bildirimiyle belirtilir. Üçgen düzeltme eki çizmek için bu yöntemleri içeren bir köşe bildirimi kullanılırsa IDirect3DDevice9::D rawTriPatch başarısız olur. Köşe bildirimleri hakkında daha fazla bilgi için bkz. D3DVERTEXELEMENT9.
DirectX 8.x'te ORDER olarak adlandırılan şey gerçekten dereceydi. Direct3D 9'da derece artık D3DDEGREETYPEtarafından belirtilir.
// This used to be D3DORDERTYPE and D3DORDER*
typedef enum _D3DDEGREETYPE
{
D3DDEGREE_LINEAR = 1,
D3DDEGREE_QUADRATIC = 2,
D3DDEGREE_CUBIC = 3,
D3DDEGREE_QUINTIC = 5,
D3DDEGREE_FORCE_DWORD = 0x7fffffff,
} D3DDEGREETYPE;
Derece türündeki değişiklik iki yapıyı daha etkiledi.
typedef struct _D3DRECTPATCH_INFO
{
UINT StartVertexOffsetWidth;
UINT StartVertexOffsetHeight;
UINT Width;
UINT Height;
UINT Stride;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DRECTPATCH_INFO;
typedef struct _D3DTRIPATCH_INFO
{
UINT StartVertexOffset;
UINT NumVertices;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DTRIPATCH_INFO;
Sürücülerin yeni üst bilgilerle derlerken bu değişiklikten kaynaklanan derleme hatalarını düzeltmesi gerekir. Hiçbir işlevin değiştirilmesi gerekmez.
Uyarlamalı Mozaik
Uyarlamalı mozaik, N düzeltme ekleri, dikdörtgen düzeltme ekleri ve üçgen düzeltme ekleri dahil olmak üzere yüksek sıralı temel öğelere uygulanabilir. Bu özellik, D3DRS_ENABLEADAPTIVETESSELLATION tarafından etkinleştirilir ve göz boşluğundaki denetim köşesinin derinlik değerine göre bir düzeltme ekini uyarlamalı olarak tessellates.
4 vektörlü noktalı bir ürün gerçekleştirilerek göz boşluğuna (Zieye) dönüştürülen kontrol köşelerinin (Vi) z koordinatları (Zieye) derinlik değerleri olarak kullanılır. 4B vektör (Mdm), uygulama tarafından dört işleme durumu (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z ve D3DRS_ADAPTIVETESS_W) kullanılarak belirtilir. Bu 4 vektör, birleştirilmiş dünyanın üçüncü sütunu ve görünüm matrisleri olabilir. Zieye'ye ölçek uygulamak için de kullanılabilir.
Zieye'den bir tessellation düzeyi Ti hesaplama işlevinin (MaxTessellationLevel/Zieye) olduğu varsayılır. Bu, MaxTessellationLevel değerinin göz boşluğunda Z = 1'deki tessellation düzeyi olduğu anlamına gelir. MaxTessellationLevel, N düzeltme ekleri için IDirect3DDevice9::SetNPatchMode tarafından ayarlanan değere eşittir ve RT düzeltme ekleri için pNumSegs değerine eşittir. Döşeme düzeyi daha sonra, D3DRS_MINTESSELLATIONLEVEL ve D3DRS_MAXTESSELLATIONLEVEL iki ek işleme durumu tarafından tanımlanan ve sıkıştırılacak minimum ve maksimum döşeme düzeylerini tanımlayan değerlere sıkıştırılır. Bir yamanın kenarındaki her köşe için Ti'ler, bu kenar için bir döşeme düzeyi elde etmek üzere ortalama olarak alınır. Dikdörtgen yamalar, üçgen yamalar ve N yamalar için Ti hesaplama algoritması, mozaik düzeyini hesaplamak için hangi denetim köşelerinin kullanıldığına göre farklılık gösterir.
B-spline temeli olan dikdörtgen yamaları için en dıştaki dört denetim köşesi kullanılır. Örneğin, D3DORDER_CUBIC sırası ile: köşeler (1,1) ve (1,width-2) pNumSegs[0] ile kullanılır, köşeler (1,genişlik-2) ve (yükseklik-2,yükseklik-2) pNumSegs[1] ile, köşeler (yükseklik-2,genişlik-2) ve (1,genişlik-2) pNumSegs[2] ile, köşeler (2,1) ve (1,1) pNumSegs[3] ile kullanılır.
Üçgen yamalar için köşe yama köşeleri kullanılır. D3DORDER_CUBIC sırası ile: pNumSegs[0] ile köşeler (0) ve (9), pNumSegs[1] ile köşeler (9) ve (6) kullanılır ve pNumSegs[3] ile köşeler (6) ve (0) kullanılır.
N düzeltme ekleri için üçgen köşeler kullanılır.
Bezier tabanlı dikdörtgen ve üçgen yamaları için köşe denetimi köşeleri kullanılır.
Köşe başına mozaik oranı denetimi. Bir uygulama isteğe bağlı olarak köşe başına tek bir pozitif kayan nokta değeri sağlayabilir ve bu değer döşeme hızını denetlemek için kullanılabilir. Bu, kullanım dizininin 0 ve giriş türünün D3DDECLTYPE_FLOAT1 olması gereken D3DDECLUSAGE_TESSFACTOR kullanılarak sağlanır. Bu değer köşe başına mozaik düzeyiyle çarpılır.
Matematik
İki denetim köşesi (Ve1, Ve2) ile temsil edilen bir uç e için döşeme düzeyi (Te), aşağıda gösterildiği gibi hesaplanır:
Vertex Vi: (Xi, Yi, Zi, TFactori (optional)).
Ze1eye = Ve1 . Mdm
Ze2eye = Ve2 . Mdm
Te1 = MaxTessellationLevel * TFactore1 / Ze1eye
Te2 = MaxTessellationLevel * TFactore2 / Ze2eye
Te = ( Te1 + Te2 ) / 2;
if Te > D3DRS_MAXTESSELLATIONLEVEL || Te < 0, then Te = D3DRS_MAXTESSELLATIONLEVEL
if Te < D3DRS_MINTESSELLATIONLEVEL, then Te = D3DRS_MINTESSELLATIONLEVEL
D3DRS_ENABLEADAPTIVETESSELLATION TRUE olduğunda, üçgen temel öğeleri (üçgen listeleri, fanlar, şeritler) N yamaları olarak çizilir IDirect3DDevice9::SetNPatchMode değeri 1,0'dan küçük olarak ayarlamıştır.
API Değişiklikleri
Yeni işleme durumları:
D3DRS_ENABLEADAPTIVETESSELLATION // BOOL
D3DRS_MAXTESSELLATIONLEVEL // Float
D3DRS_MINTESSELLATIONLEVEL // Float
D3DRS_ADAPTIVETESS_X // Float
D3DRS_ADAPTIVETESS_Y // Float
D3DRS_ADAPTIVETESS_Z // Float
D3DRS_ADAPTIVETESS_W // Float
// D3DRS_MINTESSELLATIONLEVEL and D3DRS_MAXTESSELLATIONLEVEL
// cannot be less than 1
Ve varsayılan değerleri:
D3DRS_MAXTESSELLATIONLEVEL = 1.0f
D3DRS_MINTESSELLATIONLEVEL = 1.0f
D3DRS_ADAPTIVETESS_X = 0.0f
D3DRS_ADAPTIVETESS_Y = 0.0f
D3DRS_ADAPTIVETESS_Z = 1.0f
D3DRS_ADAPTIVETESS_W = 0.0f
D3DRS_ENABLEADAPTIVETESSELLATION = FALSE
Yeni donanım üst sınırı:
D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches
D3DDEVCAPS2_ADAPTIVETESSNPATCH // Can adaptively tessellate N-patches
İlgili konular