Autor Beitrag
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 16.09.03 09:42 
Hallo!

Ich bin gerade dabei, eine Komponente zu schreiben, die die Ausgabe von Text in Direct3D ermöglicht. Dazu werden auf eine Bitmap mit dem ausgewählten Font in der ausgewählten Farbe alle Zeichen gezeichnet. Anschliessend Wird per D3DXCreateTextureFromFileinMemory-Aufruf aus dieser Bitmap eine Textur, die dann auf die einzelnen Primitives gerendert wird.

Soweit so gut, wenn ich nun den Text transparent rendern will, muss ich aber noch den Alpha-Kanal füllen (eine weitere Bitmap, derselbe Font mit denselben Zeichen in weisser Farbe auf schwarzem Hintergrund).

Gibt es eine Art Api-Aufruf ala AssignBitmaptoTextureAlpha, oder muss ich tatsächlich im Textur-Speicher jedes vierte Byte (also den Alphawert) dann von Hand setzen?

Cu,
Udontknow
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 16.09.03 10:29 
hi...

soll das ein on-the-fly generierter bitmap-font werden? wenn nicht würd ich das ID3DFont interface nehmen (was du vermutlich auch fürs zeichnen nimmst)...is halt nur langsam :wink: das is vermutlich auch der grund, warum du des machen willst?...bitmap-font unterstützung muss ich wohl auch demnächst mal für meine engine basteln.

also, ich würd die textur mit einer durchsichtigen farbe füllen und dann die schrift draufmalen. ich weiss aber leider nicht wie man füllt.

viel glück


PS:
Zitat:
eine weitere Bitmap, derselbe Font mit denselben Zeichen in weisser Farbe auf schwarzem Hintergrund
...warum eine zweite textur?...eine 32bit textur hat doch alpha-werte!?

_________________
mfg.
mâximôv
Udontknow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 16.09.03 11:22 
Hi! Danke erstmal für deine Hilfe! :)

Nein, die Textur wird nur erstellt, wenn der Font sich in irgendeiner Weise ändert (Farbe, Grösse, Schriftart, Fett, Kursiv etc.).

Mit dem ID3DFont-Objekt kann man doch nur 2D-Text ausgeben. Ich will etwas universales machen, sodaß ich z.B. Schriften tatsächlich in der 3D-Umgebung ausgeben kann (Z.B. Text auf irgendwelchen Wänden in der Umgebung).

Um eine gute Qualität hinzubekommen, wollte ich nicht einfach eine Colorkey (also eine Farbe, die nicht gezeichnet wird) definieren, weil ja Text geglättet wird, sodaß unschöne Randerscheinung auftreten. Deshalb also ein Alphakanal.

Da eine Delphi-Bitmap aber keinen Alphakanal hat (das erste Byte einer TColor-Werts lässt sich für sowas leider nicht missbrauchen), habe ich eine zweite Bitmap (nicht Textur!) angelegt, die genau das gleiche in Schwarz-Weiss zeichnet.

Anschliessend generiere ich die Textur aus beiden Bitmaps.
Im Moment generiere ich die Textur so, daß ich die R, G und B-Werte von dem ersten Bitmap nehme, den Alpha-Wert jedoch von meiner zweiten Schwarz-Weiss-Bitmap. Das ganze mache ich direkt durch Speichermanipulation, was mir irgendwie unschön vorkommt.
Deshalb meine Frage, ob es nicht so etwas wie eine Alphakanalzuweisung gibt.

Falls du das auch bei dir implementieren willst: Ich bastele diese Komponente als COM-Objekt, so daß du sie einfach per CreateComObject in deine Engine packen könntest.

Cu, :)
Udontknow
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 16.09.03 13:30 
Udontknow hat folgendes geschrieben:
Mit dem ID3DFont-Objekt kann man doch nur 2D-Text ausgeben. Ich will etwas universales machen, sodaß ich z.B. Schriften tatsächlich in der 3D-Umgebung ausgeben kann (Z.B. Text auf irgendwelchen Wänden in der Umgebung).

aha...daran hatte ich nicht gedacht.

Zitat:

Um eine gute Qualität hinzubekommen, wollte ich nicht einfach eine Colorkey (also eine Farbe, die nicht gezeichnet wird) definieren, weil ja Text geglättet wird, sodaß unschöne Randerscheinung auftreten. Deshalb also ein Alphakanal.
schon klar alpha muss sein..

Zitat:

Da eine Delphi-Bitmap aber keinen Alphakanal hat (das erste Byte einer TColor-Werts lässt sich für sowas leider nicht missbrauchen), habe ich eine zweite Bitmap (nicht Textur!) angelegt, die genau das gleiche in Schwarz-Weiss zeichnet.
da kommen wir der sache doch schon näher. du musst ja nicht delphi bmps verwenden, wenn du es auch 'nativ' machen könntest: erstell dir ein dx-32bit-surface (oder textur, hat ja auch ein surface) und benutzt das ID3DFont interface, um direkt in die textur zu rendern :wink: ...würde dir den umweg über stinke bitmaps ersparen, musst nur die textur vorher komplett durchsichtig bekommen.


Zitat:

Anschliessend generiere ich die Textur aus beiden Bitmaps.
Im Moment generiere ich die Textur so, daß ich die R, G und B-Werte von dem ersten Bitmap nehme, den Alpha-Wert jedoch von meiner zweiten Schwarz-Weiss-Bitmap. Das ganze mache ich direkt durch Speichermanipulation, was mir irgendwie unschön vorkommt.
Deshalb meine Frage, ob es nicht so etwas wie eine Alphakanalzuweisung gibt.
ja, mir auch :wink:
Zitat:

Falls du das auch bei dir implementieren willst: Ich bastele diese Komponente als COM-Objekt, so daß du sie einfach per CreateComObject in deine Engine packen könntest.
mal sehn, hab ein eigenes dynamisches objekt-modell gebaut, wo ein fremdes com-obj ein fremdkörper wäre...u know...aber wenn du das direkt via textur hinbekommst, dann wäre ich an dem code-schnipsel interresiert :D

viel glück

_________________
mfg.
mâximôv
Udontknow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 16.09.03 14:00 
Ob textur oder nicht, würdest du ja gar nicht mitbekommen, ist ja nur eine interne Sache. :wink:

Aber das mit den Surfaces ist eine gute Sache. Da drängen sich mir dann ein paar Fragen auf:

a) Wie erhalte ich die Surface einer Textur?
-ERLEDIGT (IDirect3DTexture9.GetSurfaceLevel)
b) Wie lenke ich die ID3DFont-Ausgabe auf die Surface um?


Cu, :)
Udontknow
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 16.09.03 15:54 
könnte mir vorstellen, dass man das mit render-targets macht..? habs aber noch nicht selbst getestet:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var  texsurf: IDirect3DSurface9;
...
 _Texture2.GetSurfaceLevel(0, texsurf);
    D3DDev9.SetRenderTarget(0, texsurf);

    D3DDev9.Clear(0, nil,  D3DCLEAR_TARGET, $33000000, 1, 0);

   D3DXCreateFont(D3DDev9,...);

   d3dFont1.DrawText(          
     LPCSTR pString,
     INT Count,
     LPRECT pRect,
     DWORD Format, //--> mit DT_CALCRECT kannst du die genaue grösse ermitteln, die der schriftzug einnehmen wird!
     D3DCOLOR Color);...
irgendwie so halt...solltest nur nachher das rendertarget wieder zurück stellen :wink:

viel glück!

PS: hier www.wolfnight.org/download/ findest du ein render to textur sample.

_________________
mfg.
mâximôv