Direct3D Text ausgeben
-
Hi,
ich muesste etwas Text unter Direct3D ausgeben, will aber nicht mit D3DXCreateFont oder aehnlichen machen sondern die Font direkt selber laden (Freetype) und dann ausgeben (pixelweise, nicht irgendwie als Texture).
Das Problem stellt sich nur bei der eigentlichen Ausgabe: unter OpenGL kann ich glDrawPixels nutzen und etwa mit Displaylisten arbeiten, aber was waere die Alternative dazu unter Direct3D?Was ich bisher gefunden habe: IDirect3DSurface9 - da kann ich mit BitBlt arbeiten, ich vermute aber das ist nicht so wirklich performant.
Moeglicherweise gaengen auch Sprites (D3DXCreateSprite), aber da ist mir nicht ganz klar, wie man da drauf zeichnen soll (ohne extra Texturen zu verwenden).Das ueberzeugt mich alles nicht so wirklich, ich wuerde die gerenderten Buchstaben gerne direkt im Grafikkartenspeicher ablegen, um dann schnell rendern zu koennen.
Hat dazu jemand ein Idee?
deso
-
Das Problem beim extra Zeichnen deienr Buchstaben ist das sie aus Mathemathischen Formeln bestehen, was die Sache bei viel Text nicht gerade schnell macht. Im Grunde könntest du nur ne Textur machen und in die rein Rendern. Ich würde dir aber empfehlen die Schrift als textur zu nehmen. Das ist auch die gängige methode, man fertigt eine Textur in verschiedenen Größen mit der Schrift und wählt je nach Auflösung die Richtige aus. Der Unterschied zu normal geschriebenem Text ist nicht sichtbar, aber die Sache ist schneller.
-
Ich moechte aber keine Texture nutzen. Die wuerde dann ja irgendwie gestaucht/gestreckt werden. Ich moechte die Buchstaben vorrendern, im Grafikkartenspeicher halten und dann den 1:1 auf den Bildschirm blitten. Die Frage ist nur: Wie? Wie lege ich sie im Grafikspeicher ab und wie bringe ich sie daraus auf den Bildschirm?
-
DeSoVoDaMu schrieb:
Die wuerde dann ja irgendwie gestaucht/gestreckt werden.
Warum das?
DeSoVoDaMu schrieb:
Wie lege ich sie im Grafikspeicher ab
Indem du sie in Texturen packst.
DeSoVoDaMu schrieb:
und wie bringe ich sie daraus auf den Bildschirm?
Indem du Quads mit den Texturen renderst.
Kurz gesagt: deine Annahmen sind falsch. Mach es mit Texturen, so wie jedes andere Spiel auch.
-
Captain Obvious schrieb:
DeSoVoDaMu schrieb:
Die wuerde dann ja irgendwie gestaucht/gestreckt werden.
Warum das?
Ist doch quasi per Definition so. Eine Textur packe ich auf Quads, welche ich irgendwie in Modelkoordinaten in den Raum packe. Damit kriege ich das ganze nicht pixelgenau hin. Sicherlich waere es ein weg (und ich kann eine orthogonale Projektionsmatrix in Bildschirmkoordinaten erstellen und so Spaesse), aber ich hatte einfach auf eine andere Loesung gehofft.
Captain Obvious schrieb:
DeSoVoDaMu schrieb:
Wie lege ich sie im Grafikspeicher ab
Indem du sie in Texturen packst.
Ja von mir aus - ich will aber nicht, das die ganze Sache transformiert oder aehnliches wird sondern einfach nur die Bitmap auf den Bildschirm bringen.
Ich habe jetzt IDirect3DDevice9 mit UpdateSurface und StretchRect sowie GetRenderTargetData ausfindig gemacht, die wohl fuer soetwas zu gebrauchen sind (s. auch http://www.eggheadcafe.com/forumarchives/win32programmerdirectxgraphics/Sep2005/post23877891.asp). Da device->device wohl mein Fall sein duerfte werde ich mir das mal anschauen.
Ich hatte einfach nur auf ein paar brauchbare Hinweise von erfahrenen Leute gehofft.Captain Obvious schrieb:
DeSoVoDaMu schrieb:
und wie bringe ich sie daraus auf den Bildschirm?
Indem du Quads mit den Texturen renderst.
Kurz gesagt: deine Annahmen sind falsch. Mach es mit Texturen, so wie jedes andere Spiel auch.
Das wuerde ich so pauschal nicht sagen. Unter OpenGL KANN man das so machen und ich mache es so (und ja, ich kenne die Sache mit den Texturen auch dort). Ich sehe keinen Grund, warum es nicht in irgendeiner Form aehnliche Funktionalitaet in Direct3D geben sollte. Mehr wollte ich nicht wissen.
-
DeSoVoDaMu schrieb:
Ich moechte aber keine Texture nutzen. Die wuerde dann ja irgendwie gestaucht/gestreckt werden. Ich moechte die Buchstaben vorrendern, im Grafikkartenspeicher halten und dann den 1:1 auf den Bildschirm blitten. Die Frage ist nur: Wie? Wie lege ich sie im Grafikspeicher ab und wie bringe ich sie daraus auf den Bildschirm?
Naja das bringt abe rnix. Du willst sie vorrendern dh du musst sie auf ne textur rendern und die dann benutzen. Da biste aber genauso gut dran wenn du wie alle anderen Spiele auch ne textur nimmst wo ales drauf ist. Vom Stauchen/Strecken sieht man im übrigen nichts, und solte der Unetrschied so groß sein das mans sieht kannste imernoch evrschiedene größen auf evrschiedene texturen packen und zur Laufzeit aussuchen. Das Ergebniss von dem was du vorhast wäre genau das gleiche als würde mans außerhalb machen: ne textur mit den Buchstaben drauf.
-
DeSoVoDaMu schrieb:
Ist doch quasi per Definition so. Eine Textur packe ich auf Quads, welche ich irgendwie in Modelkoordinaten in den Raum packe. Damit kriege ich das ganze nicht pixelgenau hin. Sicherlich waere es ein weg (und ich kann eine orthogonale Projektionsmatrix in Bildschirmkoordinaten erstellen und so Spaesse), aber ich hatte einfach auf eine andere Loesung gehofft.
Ach, das meinst du. Dafür gibt es vortransformierte Vertices (D3DFVF_XYZRHW). Die werden im Screenspace angegeben, also Pixelkoordinaten.