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

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

1

08.12.2013, 12:48

Problem mit Instanced Rendering

Hallo

Ich habe folgendes Problem:
Ich Zeichne einen Würfel bestehend aus Würfeln.
Die Anzahl der Würfel pro Kantenlänge ist variabel.
Wenn ich pro Kante z.B. 10 angebe werden 10*10*10=1000 Würfel gezeichnet.
Da es sich immer um das gleiche Mesh handelt benutze ich Instanced Rendering.
Dem Shader übergebe ich für jeden Würfel eine ModelView- und eine Normal-Matrix.
Um bei dem oben genannten Beispiel zu bleiben also 1000 mal MVM und 1000 mal NM.
Ich habe jetzt das Problem das bei n Würfel pro Kante der Aufbau der 2*n Matrizen mehr Zeit in Anspruch nimmt als das Rendern, wenn n die Anzahl 20 überschreitet.
(Bei n=20 habe ich immerhin schon 20*20*20=8000 also 8000 MVM und 8000 NM die in einer Schleife aufgebaut werden)
Um das Ganze zu optimieren will ich jetzt das immer 2 Würfel die selben Matrizen benutzen.
Ich würde also nur die Hälfte der Matrizen benötigen.
Um das zu erreichen habe ich meinen Code so gelassen wie er ist (übergebe also bei n=10 immer noch 2000 Matrizen) und habe nur den Devisor mit glVertexAttributeDevisor von 1 auf 2 gesetzt.
Nach meinem Verständnis sollten jetzt zwei Instanzen (Würfel) immer mit der selben MVM und NM gerendert werden bevor auf die Nächste MVM und NM umgeschaltet wird.
Das Problem ist das jetzt nur noch die Hälfte aller Würfel gezeichnet wird. Also bei n=10 nur noch 500 anstatt 1000. Mein großer Würfel der aus Würfeln besteht ist Halbiert.
Diesen Effekt kann ich mir nicht erklären.
Wenn jemand eine Idee hat wäre ich dankbar.

Lg

Stef
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

08.12.2013, 20:10

Diesen Effekt kann ich mir nicht erklären.


Evtl weil immer zwei Würfel genau auf der selben Position landen?
@D13_Dreinig

3

08.12.2013, 22:09

DIe Idee beim Instancing ist doch, dass du möglichst wenig Werte an die Grafikkarte übergeben musst. Ein Würfel ist jetzt aber so ziemlich das simpelste, was man überhaupt nur rendern kann. Da ist es nicht sehr verwunderlich, dass die ganze Zeit dafür drauf geht, mit den Matrizen zu hantieren.

Schnapp dir mal ein realistisches Objekt. Mit tausend Polygonen oder so. Denn im Moment macht es halt wenig Unterschied, ob du Matrizen übergibst, oder gleich fertig transformierte Punkte.

Und was soll deine Optimierung bringen? Wieso würde man 2 mal den selben Würfel rendern wollen?
Lieber dumm fragen, als dumm bleiben!

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

4

08.12.2013, 23:08

Diesen Effekt kann ich mir nicht erklären.


Evtl weil immer zwei Würfel genau auf der selben Position landen?

:dash: Oh Hilfe ist das Peinlich !!!
Natürlich ist die Translation die aus den vielen kleinen Würfeln einen Großen macht in der ModelView-Matrix drin.
Deshalb werden in der tat immer zwei Würfel übereinander gerendert wenn diese sich eine MVM teilen.

vielen Dank :S
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

5

08.12.2013, 23:18

Und was soll deine Optimierung bringen? Wieso würde man 2 mal den selben Würfel rendern wollen?

Natürlich wollte ich nicht zweimal den selben Würfel übereinander zeichnen.
Ursprünglich wollte ich das jeder Würfel eine eigene Drehung hat.
Dann hatte ich gedacht das es nicht so schlimm ist wenn 2 oder mehr Würfel die gleiche Drehung haben wenn ich dadurch Matrizen spare.
Wie David_pb schon festgestellt hat war die Idee natürlich völliger Mist.
Die Tatsache das jeder Würfel zwingend eine eigene Translation/MVM benötigt (um einen großen Würfel zu formen) ist mir irgendwie entfallen.

Na ja ... Das ganze Leben ist eine Lernkurve ... :)
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

Werbeanzeige