Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

1

24.07.2008, 17:10

2D Sprites rendern probleme [gelöst]

Eigentlich ein ganz einfach zu lösendes Problem, was mir aber trotzdem kopfschmerzen bereitet. bisher hab ich meine sprites mit dynamischen vertexbuffern und D3DFVF_XYZRHW gerendert. Dieser weg ist mir aber nciht performant genug, deswegene wollte ich einen etwas abgeänderten weg über D3DFVF_XYZ gehen.

Die normale Technick, die man üblicherweise im Internet findet sagt dazu, dass man die Vertices im homogenen clipspace (is doch der wo alle vertices im bereich von -1 bis 1 sind wenn ich mich nicht irre) definiert und mit hilfe einer worldmatrix und einer orthognoalen projektionsmatrix rendert. ehrlich gesagt, finde ich das ein bisschen plöd^^. warum ncith einfach vorher schon screen-space koordinaten und per shader nur mit einer worldmatrix transformieren.
das problem ist, dass man nix sieht^^. hab ich da irgendwo nen großen denkfehler?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

24.07.2008, 21:58

So wie du willst, sollte das funktionieren. Habe das auch mal so gemacht.

Hast du aber auch alle Matrizen schön multipliziert? (World*View*Proj)
Dann das ganze Ding übergeben an den Shader und das läuft.

Zitat

D3DFVF_XYZRHW gerendert. Dieser weg ist mir aber nciht performant genug, deswegene wollte ich einen etwas abgeänderten weg über D3DFVF_XYZ gehen.


Afaik ist die erste Version schneller. Bin mir jetzt nicht mehr ganz sicher, aber ich habe glaube ich das mal getestet und gemerkt, dass es schneller ist.
Aber auch wenn nicht, wirst du nicht viel rausholen können.

Anonymous

unregistriert

3

25.07.2008, 09:06

drakon
doch da kann man einiges mit rausholen. Bei den RHWs muss man immer locken bevor man sie verschiebt, bei den non-RHWs transformiert man einfach die Matrix, was bei mehreren dutzend Vertices ordentlich performance rausholt.

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

25.07.2008, 09:45

Zitat

So wie du willst, sollte das funktionieren. Habe das auch mal so gemacht.

Hast du aber auch alle Matrizen schön multipliziert? (World*View*Proj)
Dann das ganze Ding übergeben an den Shader und das läuft.


view hab ich vernächlässigt, ist bei 0,0, in positive z-richtung sowieso ne einheitsmatruix^^.

ich habs auf zweilerei wegen probiert:

einmal ohne projektion und direkt mit den koordinaten, also das quad hatte folgende maße (reihenfolge stimmt, denn mit RHW gings)

0.0f, 0.0f bis 100.0f,100.0f

dann einfach nur mit einer worldmatrix im shader multipliziert, wobei in der wolrdmatrix nur folgendes stand:

Quellcode

1
2
3
4
1.0f   0.0f  0.0f  0.0f
0.0f   1.0f  0.0f  0.0f
0.0f   0.0f  1.0f  0.0f
10.0f 10.0f  0.0f  1.0f


d. h. ich habe nicht projeziert, bzw. sind die vertices schon von mir aus projeziert als ich sie definiert habe. diese matrix hab ich im shader mit der position wie ich sei gepostet hab multipliziert. die matrix ist aj richtig
man sieht schwarz :D

der zweite weg:

mit demselben quad nur halt noch in homogen clip space:

0.0f,0.0f -> 1.0f,1.0f

mit derselben transformationsmatrix, multipliziert mit einer orthogonalen Projektionsmatrix. diese hat die breite und höhe des Backbuffers und von 1.0f bis 1000.0f (die z-werte der vertices ist 2.0f!).

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

25.07.2008, 15:13

problem gelöst. es lag wirklich an einem denkfehler. ich hab da einiges vermixt. auf jeden fall klappt es jetzt. auch im shader war ein kleiner schusselfehler.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

25.07.2008, 17:02

Zitat von »"unsigned long"«

drakon
doch da kann man einiges mit rausholen. Bei den RHWs muss man immer locken bevor man sie verschiebt, bei den non-RHWs transformiert man einfach die Matrix, was bei mehreren dutzend Vertices ordentlich performance rausholt.


Jo, aber das sind ja Sprites, die unabhängig von einander sind. Und er wird ja kaum für jedes Sprite einen eigenen VB haben, und daher muss er sowieso alles nochmal füllen.
Und da bringt der Shader auch nicht sehr viel. (Habe es mal getestet, indem ich das per Instancing + Shader gelöst habe, dass der Shader mir die Vertices transformiert für jedes Sprite einzeln). Am Schluss ist es drauf rausgelaufen, dass beides in etwa gelich schnell ist. Und manchmal das einte, manchmal das andere schneller ist.

Man könnte aber mehr sparen, indem man hald einschränkungen in der Rotation macht, dann kann man Sprites rendern und mit nur einem Vektor die Position an den Shader übergeben und dann ist das ganze natürlich viel fixer. (ev. noch Rotation in Z übergeben). Aber wenn man die gleiche Funktionaltität haben will, dann kommts etwa auf s'gleiche raus.

EDIT:
Ich kann mich irren, aber ich habe sonst keine bessere/schnellere Möglichkeit gefunden. :(
Also wenn du noch einen Tipp hast, nur raus damit. :)

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

25.07.2008, 17:55

Zitat von »"drakon"«

jo, aber das sind ja Sprites, die unabhängig von einander sind. Und er wird ja kaum für jedes Sprite einen eigenen VB haben, und daher muss er sowieso alles nochmal füllen.


doch hab ich, pro sprite 1 vb. das einzige, wo ich mehrere vertexbuffer sparen könnte wäre alle sprites die ich render in einen packen und nach texturen sortieren und dann stückweise rendern. meinst du das?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

25.07.2008, 18:20

Zitat von »"TrommlBomml"«

Zitat von »"drakon"«

jo, aber das sind ja Sprites, die unabhängig von einander sind. Und er wird ja kaum für jedes Sprite einen eigenen VB haben, und daher muss er sowieso alles nochmal füllen.


doch hab ich, pro sprite 1 vb. das einzige, wo ich mehrere vertexbuffer sparen könnte wäre alle sprites die ich render in einen packen und nach texturen sortieren und dann stückweise rendern. meinst du das?


Jop. Genau das meine ich. Wobei du aber mit deiner Variante schauen musst, wenn du z.B ein Partikelsystem hast. ;)
Dann solltest du nicht diesselbe Sprite Klasse verwenden.

Jetzt ist hald nur die Frage, was performanter ist. Den Wenn du z.B viele Partikel hast diese entweder in einen VB füllen (jedes Frame) oder hald, wie du es machst für jeden Partikel einen VB. Ich würde mal so spontan auf ersteres tippen. :)
Da kommt man um einen direkten Vergleich wahrscheinlich nicht drum herum. Wobei SetStreamSource schon recht teuer ist und das einmalige locken + füllen im Vergleich zu ständigen SetStreamSource wahrscheinlich kaum noch was ausmacht.

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

9

25.07.2008, 19:53

Zitat von »"drakon"«

jop. Genau das meine ich. Wobei du aber mit deiner Variante schauen musst, wenn du z.B ein Partikelsystem hast.
Dann solltest du nicht diesselbe Sprite Klasse verwenden.


ne sicher nicht. da würde ich dann komplett was neues schreiben, wo dann nur 1 vb ist.

Werbeanzeige