Konsole im DirectX Programm



  • Warum so unfreundlich? Dann antworte lieber gar nicht.

    Die frage war ja auch nicht was, sondern wie.



  • Ich sehe das weniger als Unfreundlich. Er hat dir ja gesagt wie.

    Render dein Spiel und das UI, render ein transparentes graues Quadrat drüber.

    Den Inhalt deines Konsolen Fensters speicherst du als std::string in std::vector.

    Zum Rendern nimmste die die Breite und die Höhe deines Ausgabefensters und rechnest dir aus wieviele Zeilen in die Höhe reingehen, wenn du Monospaced Schriftarten wie Courier verwendest kannst du auch ausrechnen wieviele Zeichen in die Breite pro Zeile reingehen. Dann fängste beim letzten string an und arbeitest dich solange zum 1. vor bis deine Zeilen ausgeschöpft sind oder die Strings alle sind. Je hübscher du es haben willst umso aufwendiger wird es natürlich. Halbe Zeilen zu rendenr oder nicht Monospaced Schriftarten zu verwenden erhöht natürlich den Aufwand den du hast um die Schrift passend zu rendern.

    Zu deinem 3. Problem kann ich nicht viel sagen. Such dir am besten ein Programm das Schriftarten auf Texturen Rendern kann und dir passende Texturkoordinaten gibt. Das geht schnell und du musst nurnoch die Textur laden und deine Rechtecke mit passenden Koordinaten versehen.



  • Xebov schrieb:

    Such dir am besten ein Programm das Schriftarten auf Texturen Rendern kann und dir passende Texturkoordinaten gibt

    BMFont
    http://www.angelcode.com/products/bmfont/



  • Wenn du eine möglichst effiziente Lösung suchst: Ich würde die Konsole wohl als Ringbuffer implementieren. Das is sehr kompakt und kommt ohne ständige Heapallokationen aus. Auch die Anzahl der maximal sichtbaren Buchstaben lässt sich wohl nach oben abgrenzen (insbesondere wenn du eine Monospace Font verwendest), sodass für die Glyphen ein VertexBuffer fixer Größe verwendet werden kann, der nicht unbedingt in jedem Frame neu befüllt werden muss...



  • Danke für die hilfe, das hat mir einige gute Denkanstöße gegeben 🙂

    Ich hab mir etwas hübsches für den Text überlegt, das klappt auch alles sehr gut.

    für den Grauen Hintergrund habe ich ein rechteck direkt vor die Kammeraposition gelegt und eine transparente Textur drauf gelegt...
    Macht man das so? Also z.b. in Spielen.. das Menü oder das GUI, wird das einfach im 3D raum vor die Kamera gesetzt? Klingt irgendwie so improvisiert...



  • Warum in 3D, du kannst das Quad doch einfach im Clipspace platzieren und fertig!?



  • ok.. das hört sich nach der Lösung an die ich mir am sinnvollsten vorgestellt, aber nicht gefunden habe.
    Wie genau mach ich das? also code.



  • Gegenfrage: Welcher Teil genau ist dir unklar?



  • Wie ich ein 3D objekt im Raum plaziere und darstelle ist mir klar.
    Aber wie zeichne ich ein Img oder ein 3D Objekt wie ein Rechteck mit Textur DIREKT auf die Schnittebene.
    gibts da einen DrawToClippingPlane Befehl oder sowas?



  • Fangen wir mal da an: Wie genau funktioniert denn das mit dem "platzieren im 3D Raum"? 😉



  • mit Matrizen Position/Rotation vorgeben, dann mit SetTransform diesen Ort/Ausrichtung setzen und das Zeichnen beginnen...

    m_d3ddev->SetTransform(D3DTS_WORLD, &((m_matSelectSize * matViewRot2 * matViewRot1) * matPos));
    	for(i = 0; i < m_mesh[0].numMaterials; i++)
    	{
    		m_d3ddev->SetMaterial(&m_mesh[0].meshMaterials[i]);
    		m_mesh[0].mesh->DrawSubset(i);
    	}
    

    lass mich raten...

    m_d3ddev->SetClipPlane
    

    Setzt den Zeichenbereich direkt zur Schnittebene?



  • Richtig

    Und was genau tun diese Matritzen jeweils?

    SetClipPlane tut was völlig anderes.



  • m_matSelectSize = größe des Auswahlvierecks
    matViewRot2 = zweite Rotationsachse des Betrachters
    matViewRot1 = erste Rotationsachse des Betrachters
    matPos = Position des Auswahlvierecks.

    Was letztendlich passiert ist das an der Position eines Ausgewählten Objektes ein Auswahlviereck entsteht das immer Parallel zur Clipplane steht.
    edit: sprich Translation und Rotation



  • Ich meinte was anderes: Wie genau kommen denn deine 3D Punkte auf 2D Pixelkoordinaten? Welche Rolle spielen World, View und Projection Matrix, also was genau tut die Transformationspipeline, was kommt hinten raus?



  • Das kann ich dir nicht wirklich beantworten...
    Ich weiß wie die Helligkeit, sprich Farbe der einzelnen Ebenen Zustande kommt,
    aber wie die Objekte ausgelesen werden, wie entschieden wird welche Faces gar nicht gezeichnet werden müssen, oder was überhaupt genau in der Pipeline passiert weiß ich nicht.



  • Darum geht's auch nicht. Beantworte einfach mal dir selbst und uns hier die Frage, was genau eigentlich World, View und Projection Matrix tun.



  • Die Viewmatrix beinhaltet einmal Position der Kamera, wo die Kamera hinzeigt und welche wo "oben" ist.

    Die Projektionsmatrix erstellt so wie ich das deute, den Sichtkegel.
    Ich gebe an die Größe des Screens (größe der Clipingebene, also das 2D feld das auf meinen Bildschirm geworfen wird), das field of view in rad, sowie den Sichtbereich mit min und max.
    Aus diesen beiden Matrizen kann man sehr gut den Sichtkegel bauen. Ich weiß wo er anfängt, wo er hinzeigt, wie sich die Sichtbereiche in Rad ausbreiten, etc...
    wie auf diesem bild gut sichtbar:
    http://directx9kick.uw.hu/files/01fig02.gif

    und die Weltmatrix müsste dann ja jetzt auch vom kartesischem Nullpunkt das darzustellende Objekt beschreiben. Wie ist es gedreht, wohin wird es verschoben etc.

    Seh ich das richtig das ich jetzt meine Projektionsmatrix/Viewmatrix vor dem ausgeben der ebene, direkt zu 0/0/0 schieben soll und dann die Ebene ohne Weltmatrix (oder Einheitsmatrix) ausgeben soll?



  • Ok, dir fehlt es offenbar an den mathematischen Grundlagen. Ich würde dir sehr empfehlen, dich damit zu beschäftigen.

    Aber gut, dann hier einfach der Trick: Du setzt World, View und Projection auf Identity, dann gehen deine Vertices direkt in den Clipspace. Der Punkt (-1, 1, 0) mapped dann auf die linke obere und (1, -1, 0) auf die rechte untere Ecke des Viewport auf der Near Plane. D.h. (-1, 1, 0), ( 1, 1, 0), ( 1,-1, 0), (-1,-1, 0) sind dann die Koordinaten der Eckpunkte eines bildfüllenden Vierecks auf der Near Plane im Uhrzeigersinn beginnend mit links oben...



  • ok das ist tatsächlich cool.
    Ich hatte nicht den Gedanken, dass ich zwischen den Objekten den Blickpunkt frei verändern kann...

    Es ist sicherlich nützlich ja. Ich komme sonst aber ganz gut zurecht mit der Mathematik. Das hier war ja mehr ein Überlegungsproblem. Ich merke aber das ich so, nur ein Minimum der Fähigkeiten von DirectX abschöpfe... überdenkenswürdig.

    Danke dir 🙂



  • cl90 schrieb:

    Ich merke aber das ich so, nur ein Minimum der Fähigkeiten von DirectX abschöpfe... überdenkenswürdig.

    Ich würde dir sowieso empfehlen, dich mit Shadern zu beschäftigen. Das fördert nicht nur das Verständnis und macht die Dinge sehr viel einfacher, sondern hilft dir auch, am Ende von D3D9 loszukommen, was diese Tage auf jeden Fall sein Ziel sein sollte, da diese API einfach hoffnungslos veraltet ist. Und so lange du die FFP nutzt, ist "ein Minimum der Fähigkeiten von DirectX abschöpfen" sogar was D3D9 betrifft rein prinzipiell schon maßlos untertrieben...


Anmelden zum Antworten