Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Pokaż wątki - Ventor

Strony: [1]
1
DirectX / Wydajność statycznych buforów.
« dnia: Marzec 02, 2008, 20:16:57 »
Napotkałem dzisiaj na dziwny problem, choć może się okaże, że to całkiem normalne tylko ja żyję w nieświadomości ;)

Do tej pory robiłem tak, że każdy statyczny mesh miał swój VB i IB, oczwiście statyczne, D3DUSAGE_WRITEONLY, D3DPOOL_DEFAULT, bo tak mi było wygodniej. Cały czas byłem przekonany że nie jest to za bardzo wydajne rozwiązanie bo trzeba ciągle ustawiać SetStreamSource i SetIndices, a jak "głosi legenda" są to wywołania kosztowne (tak przynajmniej kiedyś czytałem :P)

Dzisiaj zabrałem się za optymalizację i zrobiłem jeden duży VB i IB (też statyczne), wrzuciłem tam całą statyczną geometrię i co się okazało - na pierwszy rzut oka bez zmian. Szukałem, kombinowałem z 16 i 32 bitowym IB, flagami, optymalizacją pod kątem cache i nic. Zainstalowałem PerfHUD-a i... ewidentnie widać że jest o kilka procent wolniej.

Pytanie brzmi: czy takie optymalizacje nadal się stosuje, czy może obecne sprzęty tak dobrze sobie radzą z przełączaniem VB/IB że nie warto? A może jednak nie powinno być wolniej i gdzieś robię błąd?

//Edit
Dodam jeszcze, że GPU jest dłużej bezczynny w przypadku jednego VB i IB, ale sterownik dłużej się wykonuje. Może problemem jest ustawianie przez sterownik offsetów w buforach, a w przypadku wielu buforów zawsze rysowane są całe i nie ma tego problemu?

2
Programowanie grafiki / Animacja na kościach
« dnia: Listopad 18, 2007, 16:26:16 »
Jako że blizej mi do Fixed Function niż shaderów, a właśnie chcę się trochę bliżej z nimi zapoznać przyszło mi dogłowy kilka pytań. Nie będę od razu wszystkich zadawał, bo niektóre wynikają z innych, więc część pewnie sama się wyjaśni.

Zacznę od animacji przy użyciu kości. W Fixed Function można zdefiniować 256 macierzy, a każdy wierzchołek morze mieć 3 wagi i 4 indexy do macierzy. Załóżmy, że chciałbym to samo odwzorować za pomocą Vertex Shadera. Problem w tym, że stałych jest 256 (VS 3.0) lub nawet mniej dla starszych wersji. Każda stała to 4 floaty, a na macierz potrzeba 16, więc na 256 stałych można zapisać 64 macierze (kości). Pomijając fakt, że kilka stałych jest potrzebnych np do świteł, jak rozwiązać problem jeżeli potrzebowałbym więcej niż 64 kości?

Przyszło mi do głowy kilka pomysłów. Po pierwsze można wysyłać macierz razem z danymi każdego wierzchołka, ale to oczywiście idiotyczny pomysł. Po drugie VS 3.0 ma dostęp do tekstur i możnaby w takiej teksturze zapisać macierze, ale co ze starszymi shaderami? Można też podzielić mesha na kawałki korzystające z mniejszej ilości kości, ale to rozwiązanie najmniej mi się podoba, bo psuje całą moją wizję świata ;) Istnieje jakieś inne rozwiązanie tego problemu?

Strony: [1]