Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Donanım katmanı, birincil yüzeye yerleştirilebilir özel bir video belleği alanıdır. Katman görüntülendiğinde hiçbir kopya gerçekleştirilmemiştir. Katman işlemi, birincil yüzeydeki veriler değiştirilmeden donanımda gerçekleştirilir.
Katmanlar yüksek kare hızına sahip video içeriği için verimli olduğundan, windows'un önceki sürümlerinde video kayıttan yürütme için donanım katmanlarının kullanılması yaygındı. Windows 7'den itibaren Direct3D 9, donanım katmanlarını destekler. Bu destek öncelikli olarak video kayıttan yürütmeye yöneliktir ve önceki DirectDraw API'lerinden bazı açılardan farklıdır:
- Katman küçültülemez, yansıtılamaz veya kaldırılamaz.
- Kaynak renk tuşları ve alfa karıştırma desteklenmez.
- Katman donanımı destekliyorsa katman esnetilebilir. Aksi takdirde, esnetme desteklenmez. Uygulamada, tüm grafik sürücüleri esnetmeyi desteklemez.
- Her cihaz en fazla bir katman destekler.
- Katman, hedef renk anahtarı kullanılarak gerçekleştirilir, ancak Direct3D çalışma zamanı rengi otomatik olarak seçer ve hedef dikdörtgeni çizer. Direct3D, pencerenin konumunu otomatik olarak izler ve PresentEx çağrıldığında katman konumunu güncelleştirir.
Donanım Katman Yüzeyi Oluşturma
Yer paylaşımı desteğini sorgulamak için IDirect3D9::GetDeviceCapsöğesini arayın. Sürücü donanım katmanını destekliyorsa D3DCAPS_OVERLAY bayrağı D3DCAPS9 ayarlanır. Caps üyesi.
Belirli bir görüntüleme modu için belirli bir katman biçiminin desteklenip desteklenmediğini öğrenmek için IDirect3D9ExOverlayExtension::CheckDeviceOverlayTypeöğesini arayın.
Katman oluşturmak için IDirect3D9Ex::CreateDeviceEx çağırın ve D3DSWAPEFFECT_OVERLAY değiştirme efektini belirtin. Arka arabellek, donanım destekliyorsa RGB olmayan bir biçim kullanabilir.
Yer paylaşımlı yüzeylerin sınırlamaları şunlardır:
- Uygulama birden fazla katman değiştirme zinciri oluşturamaz.
- Katman pencereli modda kullanılmalıdır. Tam ekran modunda kullanılamaz.
- Katman değiştirme efekti, IDirect3DDevice9Ex arabirimiyle kullanılmalıdır. IDirect3DDevice9için desteklenmez.
- Çoklu örnekleme kullanılamaz.
- D3DPRESENT_DONOTFLIP ve D3DPRESENT_FLIPRESTART bayrakları desteklenmez.
- Katman yüzeyi için sunu istatistikleri kullanılamaz.
Donanım esnetmeyi desteklemiyorsa, pencerenin herhangi bir boyuta yeniden boyutlandırılabilmesi için görüntüleme modu kadar büyük bir takas zinciri oluşturmanız önerilir. Değiştirme zincirini yeniden oluşturma, ciddi işleme yapıtlarına neden olabileceğinden pencerenin yeniden boyutlandırılması için en uygun yöntem değildir. Ayrıca GPU'nun katman belleğini yönetme şekli nedeniyle değiştirme zincirinin yeniden oluşturması, bir uygulamanın video belleğinin bitmesine neden olabilir.
Yeni D3DPRESENT_PARAMETERS Bayrakları
Yer paylaşımları oluşturmak için aşağıdaki D3DPRESENT_PARAMETERS bayrakları tanımlanır.
| Bayrak | Açıklama |
|---|---|
| D3DPRESENTFLAG_OVERLAY_LIMITEDRGB | RGB aralığı 16-235 arasındadır. Varsayılan değer 0-255'tir. D3DOVERLAYCAPS_LIMITEDRANGERGB özelliğini gerektirir. |
| D3DPRESENTFLAG_OVERLAY_YCbCr_BT709 | YUV renkleri BT.709 tanımını kullanır. Varsayılan değer BT.601'dir. D3DOVERLAYCAPS_YCbCr_BT709 özelliğini gerektirir. |
| D3DPRESENTFLAG_OVERLAY_YCbCr_xvYCC | Genişletilmiş YCbCr (xvYCC) kullanarak verilerin çıktısını alın. D3DOVERLAYCAPS_YCbCr_BT601_xvYCC veya D3DOVERLAYCAPS_YCbCr_BT709_xvYCC özelliğini gerektirir. |
Donanım Katmanlarını Kullanma
Katman yüzeyini görüntülemek için uygulama IDirect3DDevice9Ex::P resentEx çağırır. Direct3D çalışma zamanı hedef renk anahtarını otomatik olarak çizer.
Yer paylaşımları için aşağıdaki PresentEx bayrakları tanımlanır.
| Bayrak | Açıklama |
|---|---|
| D3DPRESENT_UPDATECOLORKEY | Masaüstü Pencere Yöneticisi (DWM) bileşimi devre dışı bırakıldıysa bu bayrağı ayarlayın. Bu bayrak Direct3D'nin renk anahtarını yeniden çizmesine neden olur. DWM etkinse bu bayrak gerekli değildir çünkü Direct3D renk anahtarını DWM'nin yeniden yönlendirme için kullandığı yüzeye bir kez çizer. |
| D3DPRESENT_HIDEOVERLAY | Yer paylaşımını gizler. |
| D3DPRESENT_UPDATEOVERLAYONLY | İçeriği değiştirmeden yer paylaşımını güncelleştirir. Bu bayrak, video duraklatılırken pencere hareket ederse kullanışlıdır. |
Bir uygulama aşağıdaki durumları işlemeye hazır olmalıdır:
- Katman başka bir uygulama tarafından kullanılıyorsa PresentEx D3DERR_NOTAVAILABLEdöndürür.
- Pencere başka bir monitöre taşınırsa, uygulamanın değiştirme zincirini yeniden oluşturması gerekir. Aksi takdirde, uygulama katmanı farklı bir monitörde görüntülemek için PresentEx çağırırsa, PresentEx D3DERR_INVALIDDEVICEdöndürür.
- Görüntü modu değişirse Direct3D katmanı geri yüklemeyi dener. Yeni mod katmanı desteklemiyorsa, PresentEx D3DERR_UNSUPPORTEDOVERLAYdöndürür.
Örnek Kod
Aşağıdaki örnekte katman yüzeyinin nasıl oluşturulacağı gösterilmektedir.
const UINT VIDEO_WIDTH = 256;
const UINT VIDEO_HEIGHT = 256;
HRESULT CreateHWOverlay(
HWND hwnd,
IDirect3D9Ex *pD3D,
IDirect3DDevice9Ex **ppDevice
)
{
*ppDevice = NULL;
D3DCAPS9 caps;
ZeroMemory(&caps, sizeof(caps));
HRESULT hr = pD3D->GetDeviceCaps(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
&caps
);
if (FAILED(hr))
{
return hr;
}
// Check if overlay is supported.
if (!(caps.Caps & D3DCAPS_OVERLAY))
{
return D3DERR_UNSUPPORTEDOVERLAY;
}
D3DOVERLAYCAPS overlayCaps = { 0 };
IDirect3DDevice9Ex *pDevice = NULL;
IDirect3D9ExOverlayExtension *pOverlay = NULL;
// Check specific overlay capabilities.
hr = pD3D->QueryInterface(IID_PPV_ARGS(&pOverlay));
if (SUCCEEDED(hr))
{
hr = pOverlay->CheckDeviceOverlayType(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
VIDEO_WIDTH,
VIDEO_HEIGHT,
D3DFMT_X8R8G8B8,
NULL,
D3DDISPLAYROTATION_IDENTITY,
&overlayCaps
);
}
// Create the overlay.
if (SUCCEEDED(hr))
{
DWORD flags = D3DCREATE_FPU_PRESERVE |
D3DCREATE_MULTITHREADED |
D3DCREATE_SOFTWARE_VERTEXPROCESSING;
D3DPRESENT_PARAMETERS pp = { 0 };
pp.BackBufferWidth = overlayCaps.MaxOverlayDisplayWidth;
pp.BackBufferHeight = overlayCaps.MaxOverlayDisplayHeight;
pp.BackBufferFormat = D3DFMT_X8R8G8B8;
pp.SwapEffect = D3DSWAPEFFECT_OVERLAY;
pp.hDeviceWindow = hwnd;
pp.Windowed = TRUE;
pp.Flags = D3DPRESENTFLAG_VIDEO;
pp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
pp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
hr = pD3D->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
NULL, flags, &pp, NULL, &pDevice);
}
if (SUCCEEDED(hr))
{
(*ppDevice) = pDevice;
(*ppDevice)->AddRef();
}
SafeRelease(&pD3D);
SafeRelease(&pDevice);
SafeRelease(&pOverlay);
return hr;
}
İlgili konular