Z - buffer býva označovaný ako aj Depth buffer alebo W-buffer. Uchováva Z vzdialenosť od kamery. Jeho funkciu nalepšie pochopíte na tomto príklade: Predstavte si, že máte 2 zelené trojuholníky. Pohľad kamery predstavuje šípka. Pri pohľade spredu sa časť z nich navzájom prekrýva. Ako potom zistíte, ktorému trojuholníku partí zobrazená časť miesta, kde sa prekrývajú? A práve na to je tu Z-Buffer. Zistí, že prekrývajúce sa pixely ľavého trojuholníka sú bližšie ku kamere, tak vyrenderuje iba tie. O tom, že to je v skutočnosti tak, svedčí pohľad zhora. Týmto spôsobom vyhodnocuje Direct3D každý pixel. Na záver zobrazí iba viditeľné (s najmenšou Z vzdialenosťou) pixle, a tým šetrí výkonom systému. Zabráni sa tak zbytočnému viacnásobnému prekresleniu 1 pixelu.

Z-buffer podporuje takmer každá 3D karta (zo súčasne vyrábaných každá). Líšia sa iba jeho veľkosťou. Najpoužívanejší je 16 bitový. Novšie karty podporujú aj 24 alebo 32 bitový. Ak použijete nesprávny typ Z-bufferu, Direct3D sa bude snažiť použiť iný, alebo ho úplne zakáže. Na overenie, či graf. karta podporuje túto vlastnosť použite funkciu CheckDeviceFormat. Pokiaľ Direct3D vráti hodnotu D3D_OK máte zaručené, že hardvér to podporuje.

D3DWindow.EnableAutoDepthStencil = 1
 
'Zistime, ci graficka karta podporuje Z-Buffer
If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Nastavenie_obrazovky.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16) = D3D_OK Then
'ak ano ,pouzijeme 16 bitovy Z-Buffer
D3DWindow.AutoDepthStencilFormat = D3DFMT_D16
 
End If
 
'Zistime, ci graf. karta podporuje aj ine formaty Z - Bufferu
If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Nastavenie_obrazovky.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16) = D3D_OK Then
Debug.Print "16 bit Z-Buffers (D3DFMT_D16)"
End If
 
If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Nastavenie_obrazovky.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16_LOCKABLE) = D3D_OK Then
Debug.Print "Uzamknutelny 16 bit Z-Buffers (D3DFMT_D16_LOCKABLE)"
End If
 
If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Nastavenie_obrazovky.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24S8) = D3D_OK Then
Debug.Print "32 bit rozdelny na 24 bit Depth a 8 bit stencil buffer(D3DFMT_D24S8)"
End If
 
If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Nastavenie_obrazovky.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24X4S4) = D3D_OK Then
Debug.Print "32 bit rozdeleny na 24 bit depth, 4 bit stencil a 4 bit volny (D3DFMT_D24X4S4)"
End If
 
If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Nastavenie_obrazovky.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24X8) = D3D_OK Then
Debug.Print "24 bit Z-Buffer (D3DFMT_D24X8)"
End If
 
If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Nastavenie_obrazovky.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32) = D3D_OK Then
Debug.Print "32 bit Z-buffer (D3DFMT_D32)"
End If

Z - buffer musí byť povolený pri vytváraní D3DDevice a to nastavením EnableAutoDepthStencil na hodnotu 1. Zisťovať, či grafická karta podporuje 16 bitový Z-Buffer je už dnes prakticky zbytočné. Skôr sa treba zamerať na podporu iných formátov. DirectX8 využíva väčšinu moderných technológií, čo môžeme využiť aj my.

Treba ešte spomenúť, že pri čistení obrazovky treba vyprázdniť aj Z - buffer.

Priložené súbory: