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

15.11.2008, 16:27

Offset Projektionsmatrix?

Ich versuche ein eigentlich meiner Meinung nach einfaches problem zu lösen. ich möchte die projektionsmatrix verschieben, d. h. dass sie nicht vom Zentrum des Bildschirmes projeziert, sondernauf Zentral auf einen benutzerdefinierten Teilausschnitt. Beispielsweise nur das obere linke Viertel. Mir reicht eine Verschiebung, skalierung soll vernächlässigt werden. Nochmal verbildlicht:


(Link)


(Link)


Das Seitenverhältnis soll so bleiben, es kann dieses Rechteck nur beliebig groß (0 < x < ScreenWidth; 0 < y < ScreenHeight) und beliebig positionierbar sein. und der Projektionsursprung soll immer im Zentrum des gegebenen AUsschnittes liegen.

meine bisherigen Ansätze:
- D3DXMatrixPerpectiveFoVLH + Eigene Verschiebungsmatrix, scheitern am finden der richtigen Werte für die Verschiebung je nach gewünschtem Zentrum.
- D3DXMatrixPerspectiveOffCenterLH: jegliche überlegungen und umsetzungen haben auch nicht funktioniert.

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

2

15.11.2008, 17:09

Kenn mich jetzt nicht so gut aus, aber könntest du nicht einfach erst alles
auf ne Textur/Surface rendern und dann halt in der Mitte anzeigen lassen ?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

15.11.2008, 17:42

http://msdn.microsoft.com/en-us/library/bb174469(VS.85).aspx ?
@D13_Dreinig

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

15.11.2008, 18:13

Zitat von »"DataByte"«

Kenn mich jetzt nicht so gut aus, aber könntest du nicht einfach erst alles
auf ne Textur/Surface rendern und dann halt in der Mitte anzeigen lassen ?


ja die idee ist mir auch gekommen, hätte noch einige andere vorteile für den zweck den ich habe. doch mir wurde bisgher davon abgeraten da rendertarget-wechsel mit das kostspieligste an wechseln sein soll.

Zitat von »"David_ob"«

http://msdn.microsoft.com/en-us/library/bb174469(VS.85).aspx ?


ja das war mein aller aller erster ansatz, der meiner meinung nach auch nichts anderes hat als diesen ausschnitt zu rendern, so wie wenn man bei Present ein nur das obere linke viertel als dest-rect verwendet und dito für den backbuffer.
so sah es zumindest aus, testen werd ichs definitv.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

15.11.2008, 19:04

Was du suchst, ist das hier:
http://msdn.microsoft.com/en-us/library/bb205353(VS.85).aspx

6

16.11.2008, 01:19

Zitat von »"TrommlBomml"«


ja die idee ist mir auch gekommen, hätte noch einige andere vorteile für den zweck den ich habe. doch mir wurde bisher davon abgeraten da rendertarget-wechsel mit das kostspieligste an wechseln sein soll.

Du musst dabei immer überlegen, wie oft du das benutzt. Wenn du so eine Art Splitscreen machen willst, wirst du das ja nur 1-4 mal pro Frame aufrufen, da merkst du überhaupt gar nichts davon, auch wenn es 100 mal langsamer wäre als ein Texturwechsel.
Lieber dumm fragen, als dumm bleiben!

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

7

16.11.2008, 11:02

Zitat von »"TrommlBomml"«

ja das war mein aller aller erster ansatz, der meiner meinung nach auch nichts anderes hat als diesen ausschnitt zu rendern, so wie wenn man bei Present ein nur das obere linke viertel als dest-rect verwendet und dito für den backbuffer.
so sah es zumindest aus, testen werd ichs definitv.


Doch, es ist anders, Present skaliert den BackBuffer so, dass er ins Fenster / Dest-Rect passt, SetViewport skaliert die Geometrie so, dass sie in das enstprechende BackBuffer-Rechteck passt, das macht schon bezüglich Auflösung einen großen Unterschied (in ersterem Fall hilft dir bei der Verpixelung auch kein Anti-Aliasing mehr).

Ich habe die Vermutung, dass du dein Problem mit zu vielen Mittel auf einmal angehst. SetViewport sollte in der Tat die richtige Wahl sein, wenn ich das richtig verstehe, dass du nur in den entsprechenden Teil des BackBuffers rendern willst. Aber zum Zentrieren darfst du dann nichts mehr tun, die Projektion wird automatisch auf den Viewport zentriert. Dein Problem ist dann nur noch die Skalierung, wenn du tatsächlich, wie in deiner Skizze, das Bild zurecht schneiden möchtest, anstatt es in den Viewport zu "zwängen". Eine entsprechende Skalierungsmatrix hast du ja flott, multipliziert mit der Projektionsmatrix sollte das dein Problem endgültig lösen.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

8

17.11.2008, 19:01

ja klappt wirklich, wirst recht haben, dass ich da wohl ein wenig zu viel von allem gemacht habe. die 2d-geometrie läuft sowieso über vortransformiert, da ändert sich nix an skalierung. und 3d-gebilde passen auch. nur komm ich mit der ursprünglichen idee, dem multiviews nicht wirklich zu rande. mache ich irgendwas falsch? sprites o. ä. werden bei mehr als 1 view nicht dargestellt. pseudo-code:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
clearbackbuffer();
setaviewport();
beginscene();
rendersomesprites();
endscene();

setanotherviewport();
beginscene();
rendersomesprites();
endscene();

present();

Werbeanzeige