Nokta Sprite'leri (Direct3D 9)
Direct3D 9'da nokta sprite desteği, noktaların (parçacık sistemleri) yüksek performanslı işlenmesini sağlar. Nokta sprite'leri, dokular tarafından tanımlanan rastgele şekillerin işlenmesini sağlayan genel noktaların genelleştirmeleridir.
- temel işleme denetimlerini noktası
- Nokta Boyutu Hesaplamaları
- Nokta İşleme
Nokta Temel İşleme Denetimleri
Direct3D 9, nokta spritelerinin (nokta temel öğeleri) işlenmesini denetlemek için ek parametreleri destekler. Bu parametreler noktaların değişken boyutta olmasını ve tam doku eşlemesinin uygulanmasını sağlar. Her noktanın boyutu, Direct3D tarafından hesaplanan uzaklık tabanlı bir işlevle birlikte uygulama tarafından belirtilen boyuta göre belirlenir. Uygulama nokta boyutunu köşe başına olarak veya köşe başına boyutu olmayan noktalara uygulanan D3DRS_POINTSIZE ayarlayarak belirtebilir. Nokta boyutu, uygulamanın dönüşüm sonrası esnek köşe biçimi (FVF) köşelerini geçirmesi dışında kamera alanı birimleriyle ifade edilir. Bu durumda uzaklık tabanlı işlev uygulanmaz ve nokta boyutu işleme hedefindeki piksel birimleriyle ifade edilir.
İşleme noktaları işlenirken hesaplanan ve kullanılan doku koordinatları D3DRS_POINTSPRITEENABLE ayarına bağlıdır. Bu değer TRUE olarak ayarlandığında, doku koordinatları her noktanın tüm dokuyu görüntüleyebilmesi için ayarlanır. Genel olarak, bu yalnızca noktalar bir pikselden önemli ölçüde büyük olduğunda kullanışlıdır. D3DRS_POINTSPRITEENABLE false olarak ayarlandığında, noktanın tamamı için her bir noktanın köşe doku koordinatı kullanılır.
Nokta Boyutu Hesaplamaları
Nokta boyutu D3DRS_POINTSCALEENABLE tarafından belirlenir. Bu değer FALSE olarak ayarlanırsa, uygulama tarafından belirtilen nokta boyutu ekran alanı (dönüştürüldükten sonra) boyutu olarak kullanılır. Ekran alanında Direct3D'ye geçirilen köşelerde, hesaplanan nokta boyutları yoktur; belirtilen nokta boyutu ekran alanı boyutu olarak yorumlanır.
D3DRS_POINTSCALEENABLE true ise, Direct3D ekran alanı noktası boyutunu aşağıdaki formüle göre hesaplar. Uygulama tarafından belirtilen nokta boyutu kamera alanı birimlerinde ifade edilir.
S = Vh * S i * sqrt(1/(A + B * D ₑ + C *( D ₑ² )))
Bu formülde S igiriş noktası boyutu köşe başına veya D3DRS_POINTSIZE işleme durumunun değeridir. D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B ve D3DRS_POINTSCALE_C nokta ölçek faktörleri A, B ve C noktalarıyla temsil edilir. V h görünüm penceresi yüksekliği, görünüm penceresi temsil eden D3DVIEWPORT9 yapısının Height üyesidir. D ₑ, gözden konuma olan uzaklık (menşedeki göz), noktanın göz boşluğu konumu alınıp (Xₑ, Yₑ, Zₑ) ve aşağıdaki işlemi gerçekleştirerek hesaplanır.
D ₑ = sqrt (Xₑ² + Y ₑ² + Z ₑ²)
En büyük nokta boyutu olan Pmₐₓ, D3DCAPS9 yapısının MaxPointSize üyesinin veya D3DRS_POINTSIZE_MAX işleme durumunun küçük olmasıyla belirlenir. En düşük nokta boyutu olan Pmin, D3DRS_POINTSIZE_MIN değeri sorgulanarak belirlenir. Bu nedenle son ekran-boşluk noktası boyutu olan S aşağıdaki şekilde belirlenir.
- Ss > Pmₐₓ ise, S = P mₐₓ
- S < Pdkise, S = P dk
- Aksi takdirde, S = S s
Nokta İşleme
Ekran alanı boyutu S olan P = ( X, Y, Z, W) ekran boşluk noktası, aşağıdaki dört köşenin dörtgeni olarak rasterleştirilir.
(( X + S/2, Y + S/2, Z, W), ( X + S/2, Y - S/2, Z, W), ( X - S/2, Y- S/2, Z, W), ( X - S/2, Y + S/2, Z, W))
Köşe rengi öznitelikleri her köşede yinelenir; bu nedenle her nokta her zaman sabit renklerle işlenir.
Doku dizinlerinin ataması, D3DRS_POINTSPRITEENABLE işleme durumu ayarı tarafından denetlenir. D3DRS_POINTSPRITEENABLE false olarak ayarlanırsa, köşe doku koordinatları her köşeye çoğaltılır. D3DRS_POINTSPRITEENABLE true olarak ayarlanırsa, dört köşedeki doku koordinatları aşağıdaki değerlere ayarlanır.
(0.F, 0.F), (0.F, 1.F), (1.F, 0.F), (1.F, 1.F)
Bu, aşağıdaki diyagramda gösterilmiştir.
(u,v) ve (x,y) koordinat değerleri için etiketli köşeler içeren kare diyagramı
Kırpma etkinleştirildiğinde, noktalar aşağıdaki şekilde kırpılır. Köşe, bir sahnenin işlendiği D3DVIEWPORT9 yapısının MinZ ve MaxZ derinlik değerleri aralığını aşarsa, nokta görünüm frustumunun dışında yer alır ve işlenmez. Nokta boyutu dikkate alınarak nokta X ve Y'de görünüm noktasının tamamen dışındaysa, nokta işlenmez; kalan noktalar işlenir. Nokta konumunun X veya Y'de görünüm penceresi dışında olması ve kısmen görünür olması mümkündür.
Noktalar, kullanıcı tanımlı klip düzlemlerine doğru şekilde kırpılabilir veya kırpılamayabilir. D3DCAPS9 yapısının PrimitiveMiscCaps üyesinde D3DPMISCCAPS_CLIPPLANESCALEDPOINTS ayarlanmamışsa noktalar, nokta boyutu yoksayılarak yalnızca köşe konumuna göre kullanıcı tanımlı klip düzlemlerine kırpılır. Bu durumda, köşe konumu klip düzlemlerinin içinde olduğunda ölçeklendirilmiş noktalar tamamen işlenir ve köşe konumu bir klip düzleminin dışında olduğunda atılır. Uygulamalar, maksimum nokta boyutu kadar büyük olan kırpma düzlemlerine kenarlık geometrisi ekleyerek olası yapıtları önleyebilir.
D3DPMISCCAPS_CLIPPLANESCALEDPOINTS biti ayarlanırsa, ölçeklendirilmiş noktalar kullanıcı tanımlı klip düzlemlerine doğru şekilde kırpılır.
Donanım köşesi işleme, nokta boyutunu destekleyemeyebilir veya desteklemeyebilir. Örneğin, D3DCAPS9 yapısının MaxPointSize üyesi 1.0 veya 0.0 olarak ayarlanmış bir donanım soyutlama katmanı (HAL) cihazındaki (D3DDEVTYPE_HAL) D3DCREATE_HARDWARE_VERTEXPROCESSING ile bir cihaz oluşturulursa, tüm noktalar tek bir pikseldir. 1,0'dan küçük piksel noktası spritelerini işlemek için FVF TL (dönüştürülmüş ve aydınlatılmış) köşeler veya yazılım köşesi işleme (D3DCREATE_SOFTWARE_VERTEXPROCESSING) kullanmanız gerekir; bu durumda Direct3D çalışma süresi nokta sprite işlemesine öykünüyor.
Köşe işleme yapan ve nokta spritlerini destekleyen bir donanım cihazı - MaxPointSize değeri 1,0f'den büyük olarak ayarlanmıştır- geçirgen olmayan sprite'ler için boyut hesaplaması gerçekleştirmek için gereklidir ve köşe başına veya TL köşeleri için D3DRS_POINTSIZED3DRS_POINTSIZE düzgün bir şekilde ayarlamak için gereklidir.
Noktalar, çizgiler ve üçgenler için işleme kuralları hakkında bilgi için bkz. Rasterleştirme Kuralları (Direct3D 9).
İlgili konular