Szerokość a skok (Direct3D 9)
Chociaż terminy szerokość i wysokość są często używane nieformalnie, mają bardzo ważne i wyraźnie różne znaczenie. W związku z tym należy zrozumieć znaczenie dla każdej z nich oraz interpretować wartości używane przez funkcję Direct3D do ich opisania.
Funkcja Direct3D używa struktury D3DSURFACE_DESC do przenoszenia informacji opisujących powierzchnię. Między innymi ta struktura jest definiowana tak, aby zawierała informacje o wymiarach powierzchni, a także o tym, jak te wymiary są reprezentowane w pamięci. Struktura używa składowych Height i Width do opisania logicznych wymiarów powierzchni. Oba elementy członkowskie są mierzone w pikselach. W związku z tym wartości Height i Width dla powierzchni 640 x 480 są takie same, niezależnie od tego, czy jest to powierzchnia 8-bitowa, czy 24-bitowa powierzchnia RGB.
Gdy zablokujesz powierzchnię przy użyciu metody IDirect3DSurface9::LockRect, metoda wypełnia strukturę D3DLOCKED_RECT zawierającą skok powierzchni i wskaźnik do zablokowanych bitów. Wartość w elemencie Pitch opisuje skok pamięci powierzchni, nazywany również krokiem. Pitch to odległość w bajtach między dwoma adresami pamięci reprezentującymi początek jednej linii mapy bitowej i początek następnej linii mapy bitowej. Ponieważ wysokość jest mierzona w bajtach, a nie pikselach, powierzchnia 640x480x8 ma zupełnie inną wartość skoku niż powierzchnia o tych samych wymiarach, ale innym formacie pikseli. Ponadto wartość skoku czasami odzwierciedla bajty zarezerwowane przez funkcję Direct3D jako pamięć podręczną, więc nie można bezpiecznie założyć, że wysokość jest pomnożona przez liczbę bajtów na piksel. Zamiast tego zwizualizuj różnicę między szerokością a skokami, jak pokazano na poniższym diagramie.
Na tym diagramie bufor frontu i bufor wsteczny są zarówno 640x480x8, a pamięć podręczna to 384x480x8.
Podczas bezpośredniego uzyskiwania dostępu do powierzchni należy zachować ostrożność w pamięci przydzielonej do wymiarów powierzchni i pozostać poza dowolną pamięcią zarezerwowaną dla pamięci podręcznej. Ponadto w przypadku zablokowania tylko części powierzchni należy pozostać w obrębie prostokąta określonego podczas blokowania powierzchni. Wykonanie tych wytycznych nie będzie miało nieprzewidywalnych wyników. Podczas renderowania bezpośrednio do pamięci powierzchni należy zawsze użyć skoku zwróconego przez metodę IDirect3DSurface9::LockRect. Nie zakładaj skoku opartego wyłącznie na trybie wyświetlania. Jeśli aplikacja działa na niektórych kartach wyświetlania, ale wygląda na inne, może to być przyczyną problemu.
Aby uzyskać więcej informacji, zobacz Uzyskiwanie dostępu do pamięci powierzchni bezpośrednio (Direct3D 9).
Tematy pokrewne
-
powierzchni Direct3D