Konsole im DirectX Programm



  • 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...



  • Sobald ich mich mit richtiger Spieleprogrammierung beschäftige werde ich auch nach einer Außeinandersetzung mit Shadern zu DX 11 wechseln. Aber mommentan arbeite ich wie gesagt an einem Projekt das auch auf Firmen PCs laufen muss und da wird erst bald auf Win7 umgestellt...

    Aber prinzipiell hast du da vollkommen recht.



  • ok... jetzt ergeben sich kleine Schwierigkeiten mit der Textur.
    Die Textur wird unsauber, pixelig und "unrund" dargestellt. (Die Reihenfolge der Ecken stimmt. Der Text der in der Textur ist, ist nicht gedreht/spiegelverkert)
    Derzeitig steht die Fenstergröße auf 1280x900. Die Textur die ich lade hat genau die selbe Größe. Das Viereck das ich zum zeichnen der Textur nehme ist ein Quadrat. Ist das der Ursprung meines problems?

    hier das zeichnen:

    m_d3ddev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
    	m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    
    	m_d3ddev->SetTransform(D3DTS_WORLD,			&m_identity);
        m_d3ddev->SetTransform(D3DTS_VIEW,			&m_identity);   
    	m_d3ddev->SetTransform(D3DTS_PROJECTION,	&m_identity);
    
    	m_view->set_light_clip();
    
    	m_d3ddev->SetTexture(0, *m_meshTextures[4]); 
    	for(i = 0; i < m_mesh[0].numMaterials; i++)
    	{
    		m_d3ddev->SetMaterial(&m_mesh[0].meshMaterials[i]);
    		m_mesh[0].mesh->DrawSubset(i);
    	}
    	m_d3ddev->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    	m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
    


  • Ist der Client Bereich deines Fensters bzw. dein BackBuffer wirklich 1280x900? Ich vermute mal, dass dem nicht so ist... 😉


Anmelden zum Antworten