Entwickler-Ecke

Multimedia / Grafik - Texture im richtigen Seitenverhältnis zeichnen


John117 - Sa 27.05.17 15:02
Titel: Texture im richtigen Seitenverhältnis zeichnen
Hallo Leute,

ich habe ein Problem, jedesmal wenn ich eine Texture als Post Processing Effect auf einem Quad zeichne, ist die Texture immer gestreckt. Daher dachte ich mir, das ich das Problem mit einer Manipulation der World Matrix im Shader lösen kann. Nur leider komme ich rein rechnerisch nicht auf den Lösungsweg, wie ich mir z.B. bei einem Querformat Bild (16:9) die Höhe so errechne, dass das Seitenverhältnis wieder stimmt :(

So weit bin ich bis jetzt gekommen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
                float r1 = texture.Size.Width / texture.Size.Height; // The aspect ratio you want your viewport to have
                float r2 = this.renderTarget.Width / this.renderTarget.Height;

                if (r1 > r2)
                {
                    // Viewport is wider than screen, fit on X
                    float f = 2.0f - r1;
                    this.world.M22 = 1.0f - f;
                }
                else
                {
                    // Screen is wider than viewport, fit on Y
                }


Ich hoffe mir kann Jemand hier weiterhelfen? :)

Grüße
John


Delete - Sa 27.05.17 15:27

- Nachträglich durch die Entwickler-Ecke gelöscht -


Th69 - Sa 27.05.17 15:28

Hallo und :welcome:

wenn die Textur ein unterschiedliches Ratio im Vergleich zum RenderTarget hat, dann wirst du die Textur immer so skalieren müssen, daß sie entweder nur in der Breite oder in der Höhe passgenau in das RenderTarget paßt (und der Rest ist eben leer (schwarz), wie z.B. bei der Darstellung eines 16:9 Films auf einem 4:3 Bildschirm).

Du mußt also das Maximum aus Breiten- und Höhenverhältnis als Skalierungsfaktor nehmen:

C#-Quelltext
1:
2:
3:
4:
var ratioWidth = texture.Size.Width / renderTarget.Width;
var ratioHeight = texture.Size.Height / renderTarget.Height;

var scale = Math.Max(ratioWidth, ratioHeight);

Und dann die skalierte Textur entsprechend in der X- oder Y-Position mittig verschieben (zentrieren).

PS: Sollte dies wirklich ein Doppel-Account sein, so werden wir entsprechend unser Richtlinien [https://www.entwickler-ecke.de/sites.php?id=9]
Zitat:
2.5 Mehrfach-Accounts
Pro Person ist nur ein Benutzer-Account gestattet. Bei Bekanntwerden von Doppel- oder Mehrfach-Accounts werden alle bis auf einen gelöscht.

entsprechend reagieren.


John117 - Sa 27.05.17 18:36

Hallo TH69,

das war auch meine Absicht gewesen, die Textur nur entweder in der Breite oder Höhe zu skalieren, da man die andere Seite ja logischerweiße nicht anpassen muss.

Das Problem ist jetzt, das ein Factor von 3.30343f bei Deinem Lösungsweg rauskommt und wenn ich den mit dem Y Wert multipliziere, wird das Bild ja bis außerhalb des RenderTargets gestreckt, der Wert muss ja kleiner als 1 werden und nicht größer!? :O

Und da es sich um die World Matrix handelt, muss ja beim skylieren auch nichts verschoben werden, weil ja vom Mittelpunkt aus skaliert wird.

Sonst noch irgendwelche Ideen? :(

Grüße
John

ps. Und zu den bodenlosen und unverschämten Vorwürfen, das dies ein zweit Account ist, bin ich echt fassungslos. Ich kam hier zum ersten Mal in das Forum, weil ich eigentlich nur selten Hilfe in DirectX brauche und mir, was dieses Problem anging, im GameDev Forum niemand weiter helfen konnte, ich mich an dieses Forum gewandt habe!


Delete - Sa 27.05.17 18:53

- Nachträglich durch die Entwickler-Ecke gelöscht -


Christian S. - Sa 27.05.17 19:06

Um das hier noch mal klar zu machen: Begründete Hinweise auf Doppelaccounts sind über den virtuellen Ansprechpartner oder per PN an mich gerne gesehen. Das hier jetzt aber jeder Neuling im C#-Bereich unter Generalverdacht gestellt wird und das auch noch öffentlich, darf nicht sein und wird von uns auch nicht zugelassen werden. Nichts davon hat in den öffentlichen, fachbezogenen Themen etwas zu suchen!


John117 - Sa 27.05.17 19:08

Dankeschön Christian,

ich fühle mich inzwischen schon richtig belästigt vom ihm und würde am liebsten mein Account schließen und in ein anderes Forum gehen, weil ich mich überhaupt nicht mehr wohl fühle und regelrecht als dumm bezeichnet werde, nur weil ich etwas mal nicht weiß und Hilfe brauche -.- :(


Delete - Sa 27.05.17 19:21

- Nachträglich durch die Entwickler-Ecke gelöscht -


Christian S. - Sa 27.05.17 19:45

Wenn Du nachprüfbare Gründe hast, teile sie per Kontakt zum Team oder per PN mit. Ich habe keine Lust, dass Du mit Deinen Anschuldigungen fachbezogene Topics störst. Ich möchte das hier auch nicht weiter diskutieren, sondern hier soll es jetzt bitte um die oben stehende Frage gehen. Ich hoffe, ich habe mich klar ausgedrückt.


Th69 - So 28.05.17 08:39

Hallo John117,

dann dividiere durch den Skalierungsfaktor oder vertausche texture und renderTarget in dem Code.

PS: Und wenn du schon einen Beitrag dazu in einem anderen Forum erstellt hast, dann gib bitte den Link dazu hier an (s. "3.10 Crosspostings" in den Richtlinien [https://www.entwickler-ecke.de/sites.php?id=9]).


John117 - So 28.05.17 14:30

Hallo TH69,

alles versucht, kein vernüftiges Ergebnis, entweder wird das Bild sehr gequetcht oder es wird zu stark über den Rand hinaus gestreck :(

Grüße
John

ps.

Hier der Link zum GameDev Forum:
https://www.gamedev.net/topic/688920-draw-texture-with-right-aspect-ratio/

Muss aber dazu sagen, das wir dort erst versucht haben das Problem über eine orthographic Projections Matrix zu lösen, das hat aber nicht funktioniert und dann habe ich versucht auf anderen Wegen an die Sache heranzugehen (Viewport, World Matrix manipulation), aber danach hat sich Niemand mehr gemeldet :(


Th69 - Mo 29.05.17 11:00

Kannst du nicht mal an den Beispieldaten überprüfen, ob die Formel paßt? Evtl. einfach mal konstante Werte einsetzen, um zu sehen, ob das Bild dann korrekt dargestellt wird.