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

1

07.11.2010, 21:39

Kleinsten Bildausschnitt finden

Hallo zusammen, um Bilder zu speichern, möchte ich den k l e i n s t e n rechteckigen Bildausschnitt in Pixelkoordinaten (RECT) bestimmen in dem alle 3D-Objekte liegen.

Dieser sollte
a) schon beim Zeichnen der Objekte oder
b) nach dem Zeichnen
bestimmt werden.

Bei b) geht es wohl nur über den Backbuffer, oder?
Bei a) scheint es komplizierter zu sein, weil man die ganzen Transformationsmatrizen und die Auflösung des Zeichenbereichs berücksichtigen muss.

Kennt jemand für a) oder b) eine gute Lösung?

Vielen Dank für Vorschläge!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

07.11.2010, 22:19

Projizier die Bounding Boxen aller Objekte und berechne dir ein Bounding Rectangle in dem alle projizierten Boxen enthalten sind. Wenn du's ganz exakt willst wirst du wohl alle Vertices projizieren müssen...

3

08.11.2010, 01:15

Hallo dot,
vielen Dank für deine Antwort!

Angenommen man wolle den kleinsten Ausschnitt genau bestimmen. Müsste man dann jeden Vertex-Positions-Vektor einzeln mit den Matrizen in die Screenkoordinaten transformieren und damit das Bounding-Rectangle bestimmen?

Oder könnte man irgendwie auf die Xs- und Ys-Koordinate zwischen Pipeline und Rasterizer (unter Punkt 7 im folgenden Dokument) zugreifen?

http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx

Sind die Xs und Ys nach den Transformationen tatsächlich schon die Pixelkoordinaten des Zeichenbereichs, die man direkt zur Bestimmung des kleinsten Bildausschnittes (RECT) verwenden kann?

Wäre es alternativ möglich und effizienter stattdessen den Backbuffer auszulesen und jeweils von den 4 Rändern kommend nach dem ersten gemalten Pixel zu suchen?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »stoic« (08.11.2010, 01:20)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

08.11.2010, 01:21

Angenommen man wolle den kleinsten Ausschnitt genau bestimmen. Müsste man dann jeden Vertex-Positions-Vektor einzeln mit den Matrizen in die Screenkoordinaten transformieren und damit das Bounding-Rectangle bestimmen?

exakt

Oder könnte man irgendwie auf die Xs- und Ys-Koordinate zwischen Pipeline und Rasterizer (unter Punkt 7 im folgenden Dokument) zugreifen?

Nein. Aber in Direct3D10+ könnte man sich die StreamOutput Stage zu Nutze machen um die Grafikkarte für diese Berechnungen zu verwenden.

Sind die Xs und Ys nach den Transformationen tatsächlich schon die Pixelkoordinaten des Zeichenbereichs, die man direkt zur Bestimmung des kleinsten Bildausschnittes (RECT) verwenden kann?

Ja sind sie aber da du darauf nicht zugreifen kannst hilft dir das wohl kaum...

5

08.11.2010, 15:15

Na den Backbuffer locken und die Pixel durchlaufen soltle am einfachsten sein. Du brauchst dazu nichtmal zugriff auf alle Objekte, musst also wirklich nur an einer Stelle dein Programm ändern was immer gut ist.
Du musst das ganze halt auf eine eindeutige Hintergrundfarbe rendern, oder den Stencilbuffer benutzen.

Andere Frage: Wofür? Du sagst was von wegen speichern. Wo ist das Problem, ein komplettes Screenshot zu speichern? Oder willst du z.B. Sprites Rendern und automatisch zuschneiden?
Lieber dumm fragen, als dumm bleiben!

6

08.11.2010, 19:25

Wofür?



Es soll eine große Anzahl von Bildern automatisch zugeschnitten und gespeichert werden. Eine flüssige Animation ist dabei nicht so relevant, wohl aber das exakte Zuschneiden.

Ich hatte irgendwann mal gelesen, dass es beim Auslesen des Backbuffers unter DirectX9 zu Performance-Problemen kommt und es aus irgendwelchen Gründen nicht so sicher funktioniert. Deshalb hatte ich auch eine rechnerische Lösung in Erwägung gezogen.
Die Performance-Probleme sehe ich allerdings eher im Speicherprozess. Bleibt die Frage, ob es sicher funktioniert. Hast du das schon mal probiert?

7

09.11.2010, 10:02

Das es nicht sicher funktionieren soll, hab ich noch nie gehört.
Das es "langsam" ist nunja: Man sollte es nicht unnötig machen, aber wie schon gesagt, wenn du das Bild eh speichern willst, fällt das gar nicht auf. Außerdem, wie willst du das Bild speichern, wenn du die Größe von Hand ausrechnest? Das Bild muss ja irgendwie von der Grafikkarte auf die Festplatte kommen, um die Zeit kommst du also auf keinem Weg herum.
Probiert hab ich es noch nicht, aber ich wüsste nicht, warum es nicht funktionieren sollte.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige