Autor Wątek: BlossomRenderFactory - moj pierwszy powazny silnik graficzny  (Przeczytany 9040 razy)

Offline Ventor

  • Użytkownik

# Marzec 24, 2008, 14:47:14
GF 6600, Pentium D 820:
High - czarny ekran, ale pokazuje 12 fps
Medium - 30 fps
Low - 40 fps

GF7600GT, AMD 64 X2 3800:
High - 38 fps
Medium - 110 fps
Low - 140 fps

Według mnie bardzo słabo, bo przecież geometrii tu prawie nie ma, żadnych kolizji, fizyki, animacji, AI dźwięku itp. W grze to będzie piękny slideshow - popracuj nad wydajnością. Poza tym na high w 1280x1024 pokazuje się czarny ekran, w 800x600 działa (20fps). Zgaduję, że nie starczyło pamięci (128MB) na rendertargety, a gdzie jeszcze tekstury i bardziej skomplikowana geometria? Jak zrobisz tekstury managed to zupełnie dobijesz wydajność. Następna sprawa to efekt rozmycia - nie wiem czy to celowe czy nie, ale wygląda tragicznie. Zamiast zniwelować efekt aliasingu jeszcze bardziej go uwydatnia.

Nie obraź się, ale jedyne co mi się podoba to mały rozmiar exeka, widać że nie ma w nim niepotrzebnych śmieci ;)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

maxest

  • Gość
# Marzec 24, 2008, 15:13:23
Cytuj
OK, dobry powód. Smiley
A precyzujac jeszcze bardziej, mam osobne render target'y dla: ambient'a (w tym swiatlo kierunkowe - sloneczne), jednego "glownego" swiatla, osmiu "gorszej jakosci" swiatel punktowych, jeden dla mgly i jeden ktory laczy wszystkie pozostale. Poki co uzywam tylu tych render target'ow bo tak mi po prostu wygodnie :)

Cytuj
A tu nie masz jeszcze żadnego postprocessu. Wink
Jak powiedziale, "potem" bedzie :). A tymczasem mam juz po prostu pod niego "fundamenty" przygotowane :)

Cytuj
I tak jakiś taki za długi ten shader, nawet jeżeli miałbyś tam XPSM i mgłę. Smiley
To filtrowanie tyle "kosztuje" :)

Cytuj
To że ktoś inny skopał coś w kodzie nie oznacza wcale, że Ty też musisz. Wink
Ale zawsze moge sie tym jakos pocieszac :D

Cytuj
geometrii tu prawie nie ma, żadnych kolizji, fizyki, animacji, AI dźwięku itp
Dodanie geometrii to nie problem - i tak tutaj zabojczy jest fillrate co z reszta widac przy roznych rozmiarach render target'ow i innej rozdzielczosci ekranu
Kolizja + fizyka z reguly jest liczona na CPU, a ten tutaj sie "obija" ;)
Z AI i dzwiekiem podobnie.

Cytuj
Następna sprawa to efekt rozmycia - nie wiem czy to celowe czy nie, ale wygląda tragicznie. Zamiast zniwelować efekt aliasingu jeszcze bardziej go uwydatnia.
O jakie rozmycie konkretnie Ci chodzi?

Offline Charibo

  • Redaktor

# Marzec 24, 2008, 15:27:18
Cytuj
A precyzujac jeszcze bardziej, mam osobne render target'y dla: ambient'a (w tym swiatlo kierunkowe - sloneczne), jednego "glownego" swiatla, osmiu "gorszej jakosci" swiatel punktowych, jeden dla mgly i jeden ktory laczy wszystkie pozostale. Poki co uzywam tylu tych render target'ow bo tak mi po prostu wygodnie
Nie prościej i wygodniej blendować to z buforem ramki od razu? Ustawiasz 3 Render State-y i masz ;) A jak chcesz więcej świateł, to możesz pobawić się DS-em.

Co do Shadowmap -> na pewno szybciej byłoby użyć HSM - masz filtrowanie PCF za darmo i porównanie samo się odbywa :)

Offline Ventor

  • Użytkownik

# Marzec 24, 2008, 15:50:23
Cytat: maxest
Cytuj
geometrii tu prawie nie ma, żadnych kolizji, fizyki, animacji, AI dźwięku itp
Dodanie geometrii to nie problem - i tak tutaj zabojczy jest fillrate co z reszta widac przy roznych rozmiarach render target'ow i innej rozdzielczosci ekranu
Kolizja + fizyka z reguly jest liczona na CPU, a ten tutaj sie "obija" ;)
Z AI i dzwiekiem podobnie.
Pewnie, że teraz CPU się nudzi, bo nic nie robi. Jak dasz mu trochę do policzenia i zoptymalizujesz renderowanie to sytuacja się odwróci.

Cytat: maxest
Cytuj
Następna sprawa to efekt rozmycia - nie wiem czy to celowe czy nie, ale wygląda tragicznie. Zamiast zniwelować efekt aliasingu jeszcze bardziej go uwydatnia.
O jakie rozmycie konkretnie Ci chodzi?



//Edit
Cytat: Krzysiek K.
Cytuj
O jakie rozmycie konkretnie Ci chodzi?
Domyślam się że o wszechobecny bilinear przy finalnym rozciąganiu rendertargeta na cały ekran przez co, jak już pisałem, nie masz szans uzyskać porządnego obrazu. :)
Rendertarget jest rozciągany chyba tylko na medium i low, a mi chodzi o high, jak na screenie.
« Ostatnia zmiana: Marzec 24, 2008, 16:02:19 wysłana przez Ventor »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 24, 2008, 15:53:16
Cytuj
A precyzujac jeszcze bardziej, mam osobne render target'y dla: ambient'a (w tym swiatlo kierunkowe - sloneczne), jednego "glownego" swiatla, osmiu "gorszej jakosci" swiatel punktowych, jeden dla mgly i jeden ktory laczy wszystkie pozostale. Poki co uzywam tylu tych render target'ow bo tak mi po prostu wygodnie :)
To już nie jest dobry powód i nie ważna jak to wygodne, jest to ekstremalnie niewydajne. Powinieneś to załatwić max dwoma rendertargetami (nie licząc shadowmap), albo nawet jednym bądź wcale, jak nie masz HDR'a. :)

Cytuj
To filtrowanie tyle "kosztuje" :)
Szkoda tylko, że jakoś efektów tego filtrowania nie widać. ;)

Cytuj
O jakie rozmycie konkretnie Ci chodzi?
Domyślam się że o wszechobecny bilinear przy finalnym rozciąganiu rendertargeta na cały ekran przez co, jak już pisałem, nie masz szans uzyskać porządnego obrazu. :)

Cytuj
A jak chcesz więcej świateł, to możesz pobawić się DS-em.
Nawet go nie namawiaj. On i taj kuż ma tyle rendertargetów, ile chyba w żadnym Deferred Shadingu nie było. ;)

Cytuj
Co do Shadowmap -> na pewno szybciej byłoby użyć HSM - masz filtrowanie PCF za darmo i porównanie samo się odbywa :)
Filtrowanie masz za darmo, ale tylko na GeForce'ach i Radeonach od SM 4.0, więc warto, ale i tak najlepiej zaimplementować na wypadek braku sprzętowego PCF jakiś własny sposób zmiękczania. :)

maxest

  • Gość
# Marzec 24, 2008, 17:09:46
Ventor: prawde mowiac nie bardzo wiem z jakiego "fragmentu" sceny pochodzi ten wycinek na screen'ie. Ten fragment zostal przez Ciebie powiekszony czy jak?

Cytuj
Nawet go nie namawiaj. On i taj kuż ma tyle rendertargetów, ile chyba w żadnym Deferred Shadingu nie było. Wink
Postaram sie je ograniczyc :)

Cytuj
Szkoda tylko, że jakoś efektów tego filtrowania nie widać. Wink
Oj widac - gdybym je usunal cien wygladalby zdecydowanie gorzej

Cytuj
Filtrowanie masz za darmo, ale tylko na GeForce'ach i Radeonach od SM 4.0, więc warto, ale i tak najlepiej zaimplementować na wypadek braku sprzętowego PCF jakiś własny sposób zmiękczania.
I pewnie dla R32F nie zadziala? Bo zdaje sie ze tex2Dproj wykonuje hardware'owy shadow mapping tylko gdy probkowana tekstura jest tekstura glebi

Offline yomyn

  • Użytkownik
    • yomyn::dev

# Marzec 24, 2008, 17:47:56
GF 7300GT 1,25 GB RAM, 2GHz
High - ~30
Medium - ~60
Low - ~80

-yomyn

Offline Ventor

  • Użytkownik

# Marzec 24, 2008, 18:37:35
Cytat: maxest
Ventor: prawde mowiac nie bardzo wiem z jakiego "fragmentu" sceny pochodzi ten wycinek na screen'ie. Ten fragment zostal przez Ciebie powiekszony czy jak?
Tak, powiększyłem. Chodzi mi o to, że cała scena wygląda jak by była zblurowana i dla kontrastowych krawędzi wygląda to beznadziejnie, a reszta jest niewyraźna. Na prawdę lepiej byłoby bez tego efektu, a jeżeli chcesz zrobić wygładzanie to tylko multisampling.

Ogólnie, pomijając już to wygładzanie, wydaje mi się, że rzuciłeś się na efekty, których nie potrafisz optymalnie wykorzystać. Rozumiem, że pierwszy raz je robisz, ale to nie znaczy, że trzeba je od razu do silnika pakować. Efekt jest teraz taki, że silnik jest wolny (przy większej ilości geometri, obliczeń na CPU itp, będzie tylko gorzej), wygląda średnio, wymaga szybkiego sprzętu z dużą ilością pamięci, a optymalizować pewnie nie masz ochoty bo za dużo byś musiał robić od nowa.


Offline waco2504

  • Użytkownik

# Marzec 24, 2008, 19:26:40
AMD HD2900XT, 2GBRAM, 3,15GHz (dualcore)

High - ~95
Medium - ~245
Low - ~335

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 24, 2008, 19:56:13
Cytuj
Oj widac - gdybym je usunal cien wygladalby zdecydowanie gorzej
W takim razie proponuję jeszcze raz podejśc do problemu. :)

Cytuj
I pewnie dla R32F nie zadziala? Bo zdaje sie ze tex2Dproj wykonuje hardware'owy shadow mapping tylko gdy probkowana tekstura jest tekstura glebi
Pewnie nie zadziała. O ile wiem, to działa tylko dla formatów depth/stencilowych.

Cytuj
(przy większej ilości geometri, obliczeń na CPU itp, będzie tylko gorzej)
Większa ilość geometrii aż tak bardzo tu myślę nie zaszkodzi (tyle co zje fillrate'u), bo i tak zamęczane są rendertargety. :)

Offline Mattrick

  • Użytkownik

# Marzec 24, 2008, 20:19:35
Galaxy 8600 GE, 2 gb Kinston + Celeron D 3,2:
high: 40 - 50
medium: ~110
low: ~150

Offline Ventor

  • Użytkownik

# Marzec 24, 2008, 20:59:59
Cytat: Krzysiek K.
Cytuj
(przy większej ilości geometri, obliczeń na CPU itp, będzie tylko gorzej)
Większa ilość geometrii aż tak bardzo tu myślę nie zaszkodzi (tyle co zje fillrate'u), bo i tak zamęczane są rendertargety. :)
No ale lepiej na pewno nie będzie. Nie zapominaj też, że większa ilość geometrii potrzebuje więcej pamięci i przede wszystkim więcej tekstur. Rendertargety chyba już się nie mieszczą w 128MB (dla 1280x1024), a tekstury są trzy: diffuse, normal i specular, czyli tak na prawdę na jeden obiekt. Można je zrobić managed, ale to jeszcze bardziej dobije wydajność.

maxest

  • Gość
# Marzec 24, 2008, 21:43:34
Cytuj
Rendertargety chyba już się nie mieszczą w 128MB (dla 1280x1024)
Bo ja wiem... u mnie na rozdzialce 1280x800 jeden render target ma 4mb. Fakt faktem ze PIX liczy kazdy x2 (dla tekstury i dla powierzchni - pierwszej mipmapy. Swoja droga ktos moze orientuje sie czy to faktycznie liczy sie jako 8 mb?). I sumujac wszystkie zasoby jakie wyswietla PIX to na pewno nie wyjdzie ponad 128MB... moze jest jakis inny powod dla ktorego nie udaje sie zainicjalizowac urzadzenia...

Jeszcze taka mala rzecz odnosnie render target'ow... bo chcialem robic tak, ze dla kazdego "pelnego" (mesh_light.vs/ps) swiatelka chcialem robic osobny render target i potem laczyc wynik (przez bledning addytywny) w finalnym render targecie i ren render target wyswietlac. To oczywiscie pochlania pamiec, jak w koncu zdazylem dostrzec :). I jak mowicie, moglbym od razu robic blending addytywny i wszystko laczyc i miec ledwie jeden render target (a w zasadzie dwa, bo drugi dla shadow mapy :)). Tyle ze problem jest taki, ze chce miec przezroczystosc. I na razie mam tak, ze ustawiam jeden render target, renderuje obiekty (przezroczyste na koncu), potem drugi tak samo itd itp. Bo przeciez nie moge ustawic niejako "jednoczesnie" blendingu addytywnego (do sumowania wynikow poszczegolnych swiatel) z blendingiem ktory wykonuje przezroczystosc... Macie na to jakies rozwiazanie?
« Ostatnia zmiana: Marzec 24, 2008, 22:06:22 wysłana przez maxest »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 24, 2008, 23:08:10
Cytuj
Bo ja wiem... u mnie na rozdzialce 1280x800 jeden render target ma 4mb. Fakt faktem ze PIX liczy kazdy x2 (dla tekstury i dla powierzchni - pierwszej mipmapy. Swoja droga ktos moze orientuje sie czy to faktycznie liczy sie jako 8 mb?).
Mipmapy siłą rzeczy są mniejsze niż pierwszy poziom, poza tym rendertargety non-power-of-two na większości sprzętów nie wspierają mipmap. Jeżeli kodujesz w OpenGL, to może jakimś trafem do każdego rendertargetu automatycznie przez przypadek Ci się dodatkowo wygenerował osobny z/stencil? :)

Cytuj
Bo przeciez nie moge ustawic niejako "jednoczesnie" blendingu addytywnego (do sumowania wynikow poszczegolnych swiatel) z blendingiem ktory wykonuje przezroczystosc... Macie na to jakies rozwiazanie?
Możesz użyć "uniwersalnej" formy blendingu:
Color = Src + Dst*Alpha

W shaderze obliczasz już odpowiednio przemnożony kolor, a do alphy pakujesz współczynnik, przez który ma być przemnożona aktualna wartość piksela. Jak widać w zależności od pixel shadera można osiągnąć i blending addytywny i klasyczny alpha-blending.

maxest

  • Gość
# Marzec 24, 2008, 23:32:35
Cytuj
Mipmapy siłą rzeczy są mniejsze niż pierwszy poziom, poza tym rendertargety non-power-of-two na większości sprzętów nie wspierają mipmap. Jeżeli kodujesz w OpenGL, to może jakimś trafem do każdego rendertargetu automatycznie przez przypadek Ci się dodatkowo wygenerował osobny z/stencil? Smiley
Nie kodze tego w OGL (poza tym PIX raczej by mi nie wyswietlil info o OGL'u :D). I nie jest to na pewno osobny z/stencil. Czego dowodem jest fakt chociazby uzycia R32F. Uzywam go dla shadow mapy. I na liscie statystyk mam go podanego dwa razy. Pierwszy jako tekstura, gdzie obok zaznaczone jest "Mips: 1", a raz jako powierzchnie. Obydwa te zasoby maja ten sam rozmiar

Cytuj
Możesz użyć "uniwersalnej" formy blendingu:
Color = Src + Dst*Alpha
Sprobuje sie tym pobawic i zrobic calosc na jednym render target'cie. Zobaczymy co z tego wyjdzie :)