Warsztat » Forum

[DirectX] Narzut BeginPass / EndPass

Apr 23, 2009 | Kot |
20 wypowiedzi na 2 stronach:
1 2
Krzysiek K.
Apr 26, 2009

Odp: Narzut BeginPass / EndPass

Cytat:
Nie  - bo są kolejkowane.

Też chciałem się do tego przyczepić, ale tego nie zrobiłem bo to, co zostało powiedziane, nie wyklucza kolejkowania - karta w pewnym momencie będzie musiała opróżnić potoki żeby zmienić shader. :)

Cytat:
Nie tylko Present.

W wersji posta dla zwykłych zjadaczy chleba pominąłem Locki i tym podobne. :)

Cytat:
Reasumując, mam rozumieć, że poniższa konstrukcja jest optymalna i Warsztat recommended :)

Powinno działać ładnie. :)
Kot
Apr 26, 2009

Odp: Narzut BeginPass / EndPass

Dziękuję Krzyśku i dziękuję za wszystkie odpowiedzi.
upshader
Apr 27, 2009

Odp: Narzut BeginPass / EndPass

Cytat:

Cytat:

Zmiana shaderow jest jedna z najkosztowniejszych operacji jakie mozesz wykonac na karcie, poniewaz karta, w uproszczeniu, musi skonczyc renderowac, zmienic wewnetrzne stany i dopiero po dluzszej chwili zaczyna znowu pracowac
Nie  - bo są kolejkowane.

st3tc'u po czym Ty w takim razie polecasz grupowac obiekty?
Regedit
Apr 28, 2009

Odp: Narzut BeginPass / EndPass

Koszt przełączania poszczególnych ustawień urządzenia D3D znajdziecie bardzo dokładnie rozpisany w DX SDK, rozdział "Accurately Profiling Direct3D API Calls", punkt ostatni - "Appendix".

Niestety używając efektów FX trudno grupować, podobnie jak trudno robić tylko jeden Begin i wszystkie obiekty, bo mamy tutaj ustawienia trojakiego rodzaju:

1. Wybór tego a nie innego FX-a, który determinuje wpisany w nim Vertex Shader, Pixel Shader i wpisane na sztywno ustawienia urządzenia.
2. Parametry przekazywane do FX-a, wg których możnaby grupować - np. tekstura.
3. Parametry przekazywane do FX-a, które zawsze zmieniają się dla kolejnych obiektów - np. macierz świata.

Mając to na uwadze można spróbować zakombinować jakoś tak:

Kod: foreach (Encje pogrupowane wg efektów)
{
  Efekt->Begin(); Efekt->BeginPass(); // Dla mnie to jedno bo zawsze mam tylko 1 przebieg
  foreach (Encje pogrupowane wg tekstur czy czegoś takiego)
  {
    Efekt->SetTexture(...); // itp...
    Efekt->CommitChanges();
    foreach (Poszczególne encje w tej podgrupie)
    {
      Efekt->SetMatrix(...); // itp...
      encja.Draw();
    }
  }
  Efekt->EndPass(); Efekt->End();
}


Czy to "robi sens"? :) A może da się to zrobić jakoś lepiej?

Czy DirectX jest na tyle głupi że jeśli przestawiamy SetVertexShader, SetFVF, SetStreamSource itp. na wartość taką samą jaka była ustawiona, to i tak jest duży narzut czasu? Jeśli tak, to może warto zrobić własną nakładkę na urządzenie pilnującą przestawiania tylko tych stanów które naprawdę się zmieniają, a z FX-ami połączyć ją implementując interfejs ID3DXEffectStateManager?

EDIT: OK, odpowiedź na to pytanie już znalazłem w tym "My own little DirectX FAQ". Brzmi ona: jeśli urządzenie nie jest utworzone z flagą D3DCREATE_PUREDEVICE, nadmiarowe zmiany stanu są ignorowane. Jednak nadal otwarta pozostaje kwestia, jak optymalnie rysować korzystając z FX-ów.
Strony:
1 2