Zasadniczo chcę wyeliminować potrzebę generowania spójnego szumu z procesora do GPU. Stamtąd chcę również wygenerować teren dla trójwymiarowego świata, używając tego hałasu jako gęstości w punktach wokseli. Następnie chcę wziąć te gęstości i poligonizować (generować wierzchołki) je reprezentując teren świata.
W porządku. Ale chcę też dynamicznie deformować świat w czasie rzeczywistym. Gdy dojdę do tego punktu, mam problem z próbą przywrócenia wierzchołków z powrotem do procesora, aby wykonać takie czynności, jak wykrywanie kolizji i wszystkie obliczenia w grach, które chcę brać pod uwagę na procesorze, a nie na GPU.
Pytanie brzmi: w jaki sposób mogę uzyskać podzbiór wierzchołków z powrotem do procesora, aby między innymi poradzić sobie z kolizjami?
I jeszcze jedno pytanie: czy istnieje prosty sposób na pobranie zestawu wierzchołków i wygenerowanie z nich indeksów na GPU?
Jestem zdezorientowany, a także tego, jakiego rodzaju shaderów powinienem używać do tych różnych rzeczy. Słyszę o ludziach, którzy używają modułu cieniującego piksele do zbierania gęstości, a następnie używają modułu cieniującego geometrię do radzenia sobie z generowaniem terenu z wierzchołków, a następnie w jakiś sposób włączają moduł cieniujący wierzchołek do wykonywania deformacji dynamicznych.
Używam C # 4.0, .NET 4.0 i XNA Game Studio 4.0.
Odpowiedzi:
Ponieważ XNA nie obsługuje shaderów geometrii, odpowiem tak, jakbyś używał DX 10. Zasadniczo masz trzy opcje.
Shadery geometrii Shadery geometrii mogą faktycznie modyfikować i dodawać wierzchołki do bufora wierzchołków. Możesz to odczytać z powrotem do procesora. Nie zagłębiłem się w to, ale jest to na pewno możliwe.
Po prostu użyj procesora Po drugie, dlaczego po prostu nie obliczasz tego na procesorze? Fakt, że działa on na GPU w modułach cieniujących, sugeruje, że twój algorytm deformacji jest zlokalizowany, tj. Możesz łatwo wygenerować tylko części zapasowe do kontroli kolizji.
Na przykład jakiś czas temu stworzyłem grę żeglarską. Ocean użył shaderów wierzchołków i geometrii do deformowania wody za pomocą fal. Użyłem tego samego algorytmu obliczonego na procesorze tylko w kilku punktach pod łodzią do ruchu łodzi na falach. Jestem pewien, że możesz zrobić coś podobnego dla swojej mapy wokseli.
Shadery pikseli Ostatnia opcja, o której wspomniałeś w swoim pytaniu: wygeneruj gęstość w module cieniującym i zapisz go do tekstury 3D. Możesz uzyskać do niego dostęp z procesora i shaderów dość nieszkodliwie. Moduł cieniujący pikseli jest idealny do tego zadania, ale ta metoda ma wiele narzutów. Renderowanie tekstury objętości, a także próbkowanie z wewnątrz wierzchołka i geo. shadery i konieczność odczytywania tekstury na procesorze.
Nie znam specyfiki twojego projektu, ale zawsze używałbym do tego CPU. Z całą pewnością oblicz również gęstości shaderów, ale trzymaj się karty graficznej do renderowania.
źródło