Aracılığıyla paylaş


Görünüm Penceresi ve Kırpma (Direct3D 9)

Kavramsal anlamda, görünüm penceresi, 3B bir sahnenin yansıtıldığı iki boyutlu (2B) bir dikdörtgendir. Direct3D'de dikdörtgen, sistemin işleme hedefi olarak kullandığı bir Direct3D yüzeyi içinde koordinatlar olarak bulunur. Projeksiyon dönüştürmesi köşeleri görünüm penceresi için kullanılan koordinat sistemine dönüştürür. Görünüm penceresi, bir sahnenin işlendiği bir işleme hedefi yüzeyinde derinlik değerleri aralığını belirtmek için de kullanılır (genellikle 0,0 - 1,0).

Görüntüleme Frustum

Görüntüleme frustum, görünüm penceresi kamerasına göre konumlandırılmış bir sahnede 3B ses düzeyidir. Ses düzeyinin şekli, modellerin kamera alanından ekrana nasıl yansıtıldığından etkilenir. En yaygın projeksiyon türü olan perspektif projeksiyonu, kameranın yakınındaki nesnelerin mesafe içindeki nesnelerden daha büyük görünmesini sağlamaktan sorumludur. Perspektif görüntüleme için, görüntüleme alanı bir piramit olarak görselleştirilebilir ve kamera, aşağıdaki çizimde gösterildiği gibi bu piramidin tepe noktasına yerleştirilebilir. Bu piramit bir ön ve arka kırpma düzlemi ile kesişmiştir. Ön ve arka kırpma düzlemleri arasındaki piramit içindeki hacim, görüş frustum'udur. Nesneler yalnızca bu birimde olduklarında görünür.

ön ve arka kırpma düzlemine sahip bir görüş frustumunun çizimi

Karanlık bir odada durduğunızı ve kare bir pencereden baktığınızı düşünüyorsanız, bir görüntüleme frustum'ını görselleştiriyorsunuz. Bu benzetmede, yakın kırpma düzlemi penceredir ve arka kırpma düzlemi, son olarak görüşünüzü kesendir: caddenin karşısındaki gökdelen, uzaklardaki dağlar veya hiç bir şey. Pencerede başlayan ve görüşünüzü kesintiye uğratan şeyle sona eren kesilmiş piramidin içindeki her şeyi görebilir ve başka hiçbir şey göremezsiniz.

Görüntüleme frustum, aşağıdaki diyagramda gösterildiği gibi fov (görüş alanı) ve z koordinatlarında belirtilen ön ve arka kırpma düzlemlerinin uzaklıkları ile tanımlanır.

görüntüleme frustum diyagramı

Bu diyagramda D değişkeni, kameradan geometri işlem hattının son bölümünde tanımlanan boşluğun başlangıcına olan uzaklıktır( görüntüleme dönüşümü). Bu, görüntüleme frustumunuzun sınırlarını yerleştirdiğiniz alandır. Bu D değişkeninin projeksiyon matrisini oluşturmak için nasıl kullanıldığı hakkında bilgi için bkz. Projeksiyon Dönüşümü (Direct3D 9)

Görünüm Penceresi Dikdörtgeni

görünüm penceresi dikdörtgenini C++ dilinde D3DVIEWPORT9 yapısını kullanarak tanımlarsınız. D3DVIEWPORT9 yapısı, IDirect3DDevice9 arabirimi tarafından kullanıma sunulan aşağıdaki görünüm penceresi işleme yöntemleriyle kullanılır.

D3DVIEWPORT9 yapısı, bir sahnenin işlendiği işleme hedef yüzeyinin alanını tanımlayan X, Y, Width, Height olmak üzere dört üye içerir. Bu değerler, aşağıdaki diyagramda gösterildiği gibi hedef dikdörtgene veya görünüm penceresi dikdörtgenine karşılık gelir.

Görünüm penceresi dikdörtgeninin diyagramı

X, Y, Genişlik, Yükseklik üyeleri için belirttiğiniz değerler, işleme hedefi yüzeyinin sol üst köşesine göre ekran koordinatlarıdır. Yapı, sahnenin işlendiği derinlik aralıklarını gösteren iki ek üye (MinZ ve MaxZ) tanımlar.

Direct3D, görünüm penceresi kırpma biriminin X'te -1,0 ile 1,0 arasında ve Y'de 1,0 ile -1,0 arasında olduğunu varsayar. Bunlar geçmişte uygulamalar tarafından en sık kullanılan ayarlardı. Görünüm penceresi en boy oranını, projeksiyon dönüşümünükullanarak kırpmadan önce ayarlayabilirsiniz.

Not

MinZ ve MaxZ, sahnenin işlendiği derinlik aralıklarını gösterir ve kırpma için kullanılmaz. Çoğu uygulama bu üyeleri 0.0 ve 1.0 olarak ayarlayarak sistemin derinlik arabelleğindeki derinlik değerlerinin tamamına işlemesini sağlar. Bazı durumlarda, diğer derinlik aralıklarını kullanarak özel efektler elde edebilirsiniz. Örneğin, bir oyunda uyarı görüntüsü oluşturmak için, sistemi ön planda bir sahnedeki nesneleri işlemeye zorlamak için her iki değeri de 0,0 olarak ayarlayabilir veya her zaman arka planda olması gereken bir nesneyi işlemek için ikisini de 1,0 olarak ayarlayabilirsiniz.

 

Görünüm penceresi için D3DVIEWPORT9 yapısının X, Y, Genişlik, Yükseklik üyelerinde kullanılan boyutlar, işleme hedef yüzeyinde görünüm penceresi konumunu ve boyutlarını tanımlar. Bu değerler, yüzeyin sol üst köşesine göre ekran koordinatlarındadır.

Direct3D, köşeleri, işlenen bir sahneyi hedef yüzeyde uygun konuma sığdırmak üzere ölçeklendirmek için görünüm penceresi konumunu ve boyutlarını kullanır. Direct3D, bu değerleri dahili olarak her köşeye uygulanan aşağıdaki matrise ekler.

Her köşeye uygulanan matrisin denklemi

Bu matris köşeleri görünüm penceresi boyutlarına ve istenen derinlik aralığına göre ölçeklendirir ve bunları render-target yüzeyinde uygun konuma çevirir. Matris ayrıca y koordinatını sol üst köşedeki ekran kaynağını yansıtacak şekilde çevirir ve y aşağı doğru artar. Bu matris uygulandıktan sonra, köşeler hala homojendir; yani hala [x,y,z,w] köşeler olarak bulunurlar ve rasterleştiriciye gönderilmeden önce homojen olmayan koordinatlara dönüştürülmeleri gerekir.

Not

Görünüm penceresi ölçeklendirme matrisi, derinlik aralığına [MinZ, MaxZ] uyacak şekilde köşeleri ölçeklendirmek için D3DVIEWPORT9 yapısının MinZ ve MaxZ üyelerini içerir. Bu, bu üyelerin kırpma için kullanıldığı önceki DirectX sürümlerinden farklı semantiği temsil eder.

 

Not

Uygulamalar, sistemin derinlik aralığının tamamına işlenmesine neden olmak için genellikle MinZ ve MaxZ'yi sırasıyla 0,0 ve 1,0 olarak ayarlar. Ancak, belirli etkilere ulaşmak için diğer değerleri kullanabilirsiniz. Örneğin, tüm nesneleri ön plana zorlamak için her iki değeri de 0,0 olarak ayarlayabilir veya tüm nesneleri arka planda işlemek için her ikisini de 1,0 olarak ayarlayabilirsiniz.

 

Görünüm Penceresi Temizleme

Görünüm penceresi temizleniyorsa, işleme hedefi yüzeyindeki görünüm penceresi dikdörtgeninin içeriği sıfırlanır. Ayrıca derinlik ve kalıp arabellek yüzeylerindeki dikdörtgeni de temizleyebilir.

IDirect3DDevice9::Clearkullanarakgörünümü temizleyin. yöntemi, temizlenen yüzeydeki alanları tanımlayan bir veya daha fazla dikdörtgeni kabul eder. Count parametresini 1 olarak, pRects parametresini ise görünüm penceresi alanının tamamını kapsayan tek bir dikdörtgenin adresine ayarlamak, görünüm görüntüsünün tamamını temizler. Görünüm kümesinin tamamını temizlemenin bir diğer yolu da pRects parametresini NULL ve Count parametresini 0 olarak ayarlamaktır.

IDirect3DDevice9::Clear, derinlik arabelleği içindeki stencil bitlerini temizlemek için kullanılabilir. IDirect3DDevice9::Clear işleme hedefi ve ilişkili derinlik veya kalıp arabellekleriyle nasıl çalıştığını belirlemek için Flags parametresini ayarlamanız yeterlidir. D3DCLEAR_TARGET bayrağı, Color argümanında belirtilen rastgele bir RGBA rengi kullanarak görünüm penceresini temizler (bu, malzeme rengi değildir). D3DCLEAR_ZBUFFER bayrağı, derinlik arabelleğini, Z'de belirttiğiniz rastgele bir derinliğe temizleyecektir: 0.0 en yakın mesafeyi ve 1.0 en uzak mesafeyi temsil eder. D3DCLEAR_STENCIL bayrağı, şablon bitlerini, Stencil bağımsız değişkeninde belirttiğiniz değere sıfırlar. 0 ile 2n-1 arasında değişen tamsayıları kullanabilirsiniz; burada n kalıp arabelleği bit derinliğidir.

Bazı durumlarda, işleme hedefinin ve derinlik arabellek yüzeylerinin yalnızca küçük bölümlerine işleyebilirsiniz. Net yöntemler, yüzeylerinizin birden çok alanını tek bir çağrıda temizlemenizi de sağlar. Bunu yapmak için Count parametresini temizlenmiş olmasını istediğiniz dikdörtgen sayısına ayarlayın ve pRects parametresindeki bir dikdörtgen dizisinde ilk dikdörtgenin adresini belirtin.

Kırpma için Görünüm Penceresini Ayarla

Projeksiyon matrisinin sonuçları, projeksiyon alanında kırpma hacmini şu şekilde belirler:

-wc<= xc<= wc

-wc<= yc<= wc

0 <= zc<= wc

Burada: x, y, z ve w, projeksiyon dönüşümü uygulandıktan sonra köşe koordinatlarını temsil eder. Kırpma etkinse (varsayılan davranış) bu aralıkların dışında x, y veya z bileşenine sahip tüm köşeler kırpılır.

Köşe arabellekleri dışında, uygulamalar D3DRS_CLIPPING işleme durumu yoluyla kırpmayı etkinleştirir veya devre dışı bırakır. İşlem sırasında köşe arabellekleri için kırpma bilgileri oluşturulur. Daha fazla bilgi için bkz. Sabit İşlev Köşesi İşleme (Direct3D 9) ve Programlanabilir Köşe İşleme (Direct3D 9).

Direct3D, IDirect3DDevice9::ProcessVerticesgelmediği sürece bir ilkel öğeye ait dönüştürülmüş köşeleri köşe arabelleğinden kırpmaz. Kendi dönüşümlerinizi yapıyorsanız ve kırpmayı yapmak için Direct3D'ye ihtiyacınız varsa köşe arabelleklerini kullanmamalısınız. Bu durumda, uygulama verileri dönüştürmek için inceler. Direct3D, verileri kırpmak için ikinci kez çapraz geçişler ve ardından sürücü verileri işleyip verimsiz hale getirir. Bu nedenle, uygulama verileri dönüştürürse, verileri de kırpmalıdır.

Cihaz, kırpılması gereken önceden dönüştürülmüş ve aydınlatılmış köşeleri (T&L köşeleri) aldığında, köşeler, kırpma işlemini gerçekleştirmek amacıyla köşelerin karşılıklı homojen w (RHW) ve görünüm alanı bilgileri kullanılarak kırpma alanına tekrar dönüştürülür. Kırpma işlemi daha sonra gerçekleştirilir. T&L köşelerini kırpmak için tüm cihazlar bu geri dönüşümü gerçekleştiremez.

D3DPMISCCAPS_CLIPTLVERTS cihaz özelliği, cihazın T&L köşelerini kırpıp kırpamayacağını gösterir. Bu özellik ayarlanmamışsa uygulama, işlenecek cihaza aşağı göndermek istediği T&L köşelerini kırpmakla sorumludur. Cihaz her zaman T&L köşelerini yazılım köşesi işleme modunda kırpabilmektedir (cihazın yazılım köşesi işleme modunda oluşturulduğundan veya yazılım köşesi işleme moduna geçtiğinden bağımsız olarak).

Bir işleme cihazı için görünüm penceresi parametrelerini yapılandırmanın tek gereksinimi, görünüm penceresi kırpma hacmini ayarlamaktır. Bunu yapmak için kırpma hacmi ve işleme hedef yüzeyi için kırpma değerlerini başlatır ve ayarlarsınız. Görünüm portu genellikle render-target yüzeyinin tam alanına işlenmek üzere ayarlanır, ancak bu bir gereksinim değildir.

C++'ta bunu başarmak için D3DVIEWPORT9 yapısının üyeleri için aşağıdaki ayarları kullanabilirsiniz.

D3DVIEWPORT9 viewData = { 0, 0, width, height, 0.0f, 1.0f };

D3DVIEWPORT9 yapısındaki değerleri ayarladıktan sonra, IDirect3DDevice9::SetViewport yöntemini çağırarak cihaza viewport parametrelerini uygulayın. Aşağıdaki kod örneği, bu çağrının nasıl görünebileceğini gösterir.

HRESULT hr;

hr = pd3dDevice->SetViewport(&viewData);
if(FAILED(hr))
    return hr;

Çağrı başarılı olursa, görünüm penceresi parametreleri ayarlanır ve bir sonraki işleme yöntemi çağrıldığında etkili olur. Görünüm penceresi parametrelerinde değişiklik yapmak için D3DVIEWPORT9 yapısındaki değerleri güncelleştirin ve IDirect3DDevice9::SetViewport yeniden çağırın.

Not

D3DVIEWPORT9 yapısı üyeleri MinZ ve MaxZ, sahnenin işlendiği ve kırpma için kullanılmadığı derinlik aralıklarını gösterir. Çoğu uygulama, sistemin derinlik arabelleğinde bulunan derinlik değerlerinin tamamını kapsamlı bir şekilde işleyebilmesi için bu üyeleri 0.0 ve 1.0 olarak ayarlar. Bazı durumlarda, diğer derinlik aralıklarını kullanarak özel efektler elde edebilirsiniz. Örneğin, bir oyunda uyarı görüntüsü oluşturmak için, sistemi ön planda bir sahnedeki nesneleri işlemeye zorlamak için her iki değeri de 0,0 olarak ayarlayabilir veya her zaman arka planda olması gereken bir nesneyi işlemek için ikisini de 1,0 olarak ayarlayabilirsiniz.

 

Başlarken