Udostępnij za pośrednictwem


Sprites punktów (Direct3D 9)

Obsługa sprites punktów w direct3D 9 umożliwia wysokowydajne renderowanie punktów (układów cząstek). Sprites punktów to uogólnienia punktów ogólnych, które umożliwiają renderowanie dowolnych kształtów zgodnie z definicją tekstur.

Kontrolki renderowania pierwotnego punktu

Funkcja Direct3D 9 obsługuje dodatkowe parametry do kontrolowania renderowania sprites punktów (punkt pierwotny). Te parametry umożliwiają stosowanie punktów o zmiennym rozmiarze i zastosowanie pełnej mapy tekstury. Rozmiar każdego punktu jest określany przez określony przez aplikację rozmiar w połączeniu z funkcją opartą na odległości obliczoną przez funkcję Direct3D. Aplikacja może określić rozmiar punktu jako wierzchołek lub przez ustawienie D3DRS_POINTSIZE, które ma zastosowanie do punktów bez rozmiaru wierzchołka. Rozmiar punktu jest wyrażony w jednostkach przestrzeni kamery, z wyjątkiem tego, kiedy aplikacja przekazuje po transformacji wierzchołki elastycznego formatu wierzchołków (FVF). W takim przypadku funkcja oparta na odległości nie jest stosowana i rozmiar punktu jest wyrażony w jednostkach pikseli na obiekcie docelowym renderowania.

Współrzędne tekstury obliczane i używane podczas renderowania punktów zależą od ustawienia D3DRS_POINTSPRITEENABLE. Gdy ta wartość jest ustawiona na wartość true, współrzędne tekstury są ustawiane tak, aby każdy punkt wyświetlał pełną teksturę. Ogólnie rzecz biorąc, jest to przydatne tylko wtedy, gdy punkty są znacznie większe niż jeden piksel. Gdy D3DRS_POINTSPRITEENABLE jest ustawiona na wartość FALSE, współrzędna tekstury wierzchołka każdego punktu jest używana dla całego punktu.

Obliczenia dotyczące rozmiaru punktu

Rozmiar punktu jest określany przez D3DRS_POINTSCALEENABLE. Jeśli ta wartość jest ustawiona na wartość FALSE, rozmiar punktu określonego przez aplikację jest używany jako rozmiar miejsca na ekranie (po przekształceniu). Wierzchołki przekazywane do direct3D w przestrzeni ekranu nie mają obliczonych rozmiarów punktów; określony rozmiar punktu jest interpretowany jako rozmiar miejsca na ekranie.

Jeśli D3DRS_POINTSCALEENABLE jest true, funkcja Direct3D oblicza rozmiar punktu przestrzeni ekranu zgodnie z następującą formułą. Rozmiar punktu określonego przez aplikację jest wyrażony w jednostkach przestrzeni kamery.

S = Vh * S i * sqrt(1/(A + B * D ₑ + C *( D ₑ² ))))

W tej formule rozmiar punktu wejściowego, S i, jest albo na wierzchołek lub wartość stanu renderowania D3DRS_POINTSIZE. Czynniki skalowania punktów, D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B i D3DRS_POINTSCALE_C, są reprezentowane przez punkty A, B i C. Wysokość widoku, V h, to składowa wysokości D3DVIEWPORT9 struktury reprezentująca widokport. D ₑ, odległość od oka do pozycji (oko w punkcie początkowym), jest obliczana przez podjęcie pozycji przestrzeni wzrokowej punktu (Xₑ, Yₑ, Zₑ) i wykonanie następującej operacji.

D ₑ = sqrt (Xₑ² + Y ₑ² + Z ₑ²)

Maksymalny rozmiar punktu Pmₐₓ jest określany przez zmniejszenie rozmiaru elementu członkowskiego MaxPointSize struktury D3DCAPS9 lub stanu renderowania D3DRS_POINTSIZE_MAX. Minimalny rozmiar punktu Pminjest określany przez wykonywanie zapytań względem wartości D3DRS_POINTSIZE_MIN. W ten sposób ostateczny rozmiar punktu odstępu ekranu, S, jest określany w następujący sposób.

  • Jeśli Ss > Pmₐₓ, to S = P mₐₓ
  • jeśli S < Pmin, s = P min
  • W przeciwnym razie S = S

Renderowanie punktów

Punkt odstępu ekranu, P = ( X, Y, Z, W) rozmiaru miejsca na ekranie S jest rasteryzowany jako czworokąt z następujących czterech wierzchołkó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), ( X - S/2, Y + S/2, Z, W))

Atrybuty koloru wierzchołka są duplikowane w każdym wierzchołku; dlatego każdy punkt jest zawsze renderowany przy użyciu stałych kolorów.

Przypisanie indeksów tekstury jest kontrolowane przez ustawienie stanu renderowania D3DRS_POINTSPRITEENABLE. Jeśli D3DRS_POINTSPRITEENABLE jest ustawiona na wartość FALSE, współrzędne tekstury wierzchołka są duplikowane w każdym wierzchołku. Jeśli D3DRS_POINTSPRITEENABLE jest ustawiona na wartość true, współrzędne tekstury na czterech wierzchołkach są ustawione na następujące wartości.

(0.F, 0.F), (0.F, 1.F), (1.F, 0.F), (1.F, 1.F)

Jest to pokazane na poniższym diagramie.

diagram kwadratu z oznaczonymi wierzchołkami dla wartości współrzędnych (u,v) i (x,y)

Po włączeniu wycinków punkty są przycinane w następujący sposób. Jeśli wierzchołek przekracza zakres wartości głębokości — MinZ i MaxZ struktury D3DVIEWPORT9 — do której ma być renderowana scena, punkt istnieje poza obszarem frustum widoku i nie jest renderowany. Jeśli punkt, biorąc pod uwagę rozmiar punktu, jest całkowicie poza portem widoków w X i Y, punkt nie jest renderowany; pozostałe punkty są renderowane. Istnieje możliwość, że pozycja punktu znajduje się poza portem widokowym w X lub Y i nadal jest częściowo widoczna.

Punkty mogą być lub nie mogą być poprawnie przycięte do zdefiniowanych przez użytkownika płaszczyzn klipów. Jeśli D3DPMISCCAPS_CLIPPLANESCALEDPOINTS nie jest ustawiona w członku PrimitiveMiscCaps struktury D3DCAPS9, punkty są przycinane do płaszczyzn klipów zdefiniowanych przez użytkownika tylko na podstawie położenia wierzchołka, ignorując rozmiar punktu. W takim przypadku punkty skalowane są w pełni renderowane, gdy położenie wierzchołka znajduje się wewnątrz płaszczyzn klipów i odrzucane, gdy położenie wierzchołka znajduje się poza płaszczyzną klipu. Aplikacje mogą zapobiegać potencjalnym artefaktom przez dodanie geometrii obramowania do płaszczyzn klipów, które są tak duże, jak maksymalny rozmiar punktu.

Jeśli D3DPMISCCAPS_CLIPPLANESCALEDPOINTS bit jest ustawiony, punkty skalowane są poprawnie przycięte do zdefiniowanych przez użytkownika płaszczyzn klipów.

Przetwarzanie wierzchołków sprzętowych może lub nie obsługuje rozmiaru punktu. Jeśli na przykład urządzenie zostało utworzone przy użyciu D3DCREATE_HARDWARE_VERTEXPROCESSING na urządzeniu warstwy abstrakcji sprzętu (HAL) (D3DDEVTYPE_HAL), które ma składową maxPointSize struktury D3DCAPS9 ustawioną na 1.0 lub 0.0, wszystkie punkty są pojedynczym pikselem. Aby renderować wierzchołki punktów pikseli mniejsze niż 1.0, należy użyć wierzchołków FVF TL (przekształcone i oświetlone) lub przetwarzania wierzchołków oprogramowania (D3DCREATE_SOFTWARE_VERTEXPROCESSING), w tym przypadku czas wykonywania Direct3D emuluje renderowanie sprite punktu.

Urządzenie sprzętowe, które przetwarza wierzchołki i obsługuje sprites punktów — MaxPointSize ustawione na wartość większą niż 1,0f — jest wymagane do wykonania obliczeń dotyczących rozmiaru nietransformowanych sprites i jest wymagane do prawidłowego ustawienia wierzchołków na wierzchołki lub D3DRS_POINTSIZED3DRS_POINTSIZE dla wierzchołków TL.

Aby uzyskać informacje o regułach renderowania punktów, linii i trójkątów, zobacz Reguły rasteryzacji (Direct3D 9).

potoku wierzchołka