Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 12:34

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Bitmap Font mit Schatten (Umrandung)
BeitragVerfasst: Do Aug 04, 2005 19:21 
Offline
DGL Member

Registriert: Mi Apr 27, 2005 19:24
Beiträge: 24
Ich benützte folgenden code zur Bitmap Fonts Erstellung:
Code:
  1. procedure CreateBitmapFont(Fontname : String);
  2. var
  3.  font : HFONT;
  4. begin
  5.   BitmapFont := glGenLists(256);
  6.   font := CreateFont(43,20,0,0,FW_BOLD,0,0,0,ANSI_CHARSET,OUT_TT_PRECIS,
  7.     CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
  8.                            FF_DONTCARE or DEFAULT_PITCH, PChar(Fontname));
  9.   SelectObject(dc, font);
  10.   wglUseFontBitmaps(dc, 0, 256, BitmapFont);
  11.  
  12. end;
  13.  
  14. procedure PrintBitmapText(X,Y: TGLFloat; Text: String);
  15. begin
  16.   glPushAttrib(GL_ALL_ATTRIB_BITS);
  17.   glDisable(GL_LIGHTING);
  18.   glDisable(GL_DEPTH_TEST);
  19.   glDisable(GL_TEXTURE_2D);
  20.   glDisable(GL_BLEND);
  21.  
  22.     glMatrixMode(GL_PROJECTION);
  23.     glLoadIdentity;
  24.     glOrtho(0, 1280, 960, 0, -1, 1);
  25.     glMatrixMode(GL_MODELVIEW);
  26.     glLoadIdentity;
  27.  
  28.     glColor3f(1,1,1);
  29.     glRasterPos2f(X,Y);
  30.     glListBase(BitmapFont);
  31.     glCallLists(length(Text), GL_UNSIGNED_BYTE, PChar(Text));
  32.  
  33.     glEnable(GL_LIGHTING);
  34.     glEnable(GL_DEPTH_TEST);
  35.     glEnable(GL_TEXTURE_2D);
  36.   glPopAttrib;
  37. end;
  38.  
  39. procedure TForm1.FormCreate(Sender: TObject);
  40. begin
  41.   // ...
  42.   CreateBitmapFont('Zero Twos');
  43. end;
  44.  
  45. procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  46.   var Done: Boolean);
  47. begin
  48. Done := False;
  49. ActivateRenderingContext(DC, RC);
  50.  
  51. //FPS anzeigen
  52. glMatrixMode(GL_PROJECTION);
  53. glLoadIdentity;
  54. glOrtho(0,640,480,0,-1,1);
  55. glMatrixMode(GL_MODELVIEW);
  56. glLoadIdentity();
  57. glClearColor(0,1,0,0);
  58. glClear(GL_COLOR_BUFFER_BIT or  GL_DEPTH_BUFFER_BIT);
  59.  
  60. PrintBitmapText(10, 940, 'QUIT');
  61.  
  62. SwapBuffers(DC);
  63. DeActivateRenderingContext;
  64. end;


Als nächstes wollte ich die Buchstaben auseinander ziehen, aber wo kann ich denn Abstand zwischen den einzelnen Zeichen eingeben?

Danach wollte ich noch einen Schatten einfügen so wie im Bild in Anhang. Aber wie kann man so etwas realisieren? Ich habe es mit verschieben der Font (in schwarz) im Hintergrund versucht, was aber ein anderes Ergebnis brachte (Hatte keine abgerundeten Ecken wie in Beispiel Bild und auch kein Alfa). Hat vielleicht jemand ein Beispiel dafür?


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 04, 2005 22:23 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Deine Idee relativ gut, du musst halt von deiner Font ein Abbild machen( Oder die Font direkt verwenden ), dieses Einfärben, und dannach wie du schon sagtest verschieben!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 04, 2005 23:24 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Was du willst ist gar kein Schatten sondern eine Umrahmung (Stroke) wenn ich dich richtig verstanden habe. Dass geht dann nicht einfach durch verschieben. Du müsstest dazu deinen Font Scalieren und dann per Blending auf den Untergrund mappen. Beachte aber, dass durch übermäßiges Scalieren Fehler/Ecken mit Scaliert werden, was schnell mies aussieht.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 05, 2005 05:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also mit Bitmapfonts ist das recht schwer und nur sehr trickreich zu lösen, da man diese nicht skalieren kann (meine ich jedenfalls). Abgesehen davon sind die auch nicht so sonderlich schnell. Und Bitmap heißt in OpenGL auch BIT-map. Die Pixel können also nur 0 oder 1 beinhalten.

Für diesen Fall würde es sich anbieten das Font als Textur zu machen und dann in einem Grafikprogramm die Buchstanben zu bearbeiten. Ich habe auch mal ein Programm gemacht welchen ein Windowsfont in eine Textur schreibt und da kann bei der größe der Buchstaben noch einen Wert addieren. Speziell für solche Fälle ist das gedacht. Wenn du dann noch meine Klasse verwendest sollte das ein leichtes sein das zu verändern.
Hab gerade keine Zeit aber auf Wunsch lade ich das mal hoch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 05, 2005 12:10 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
In allen Demos von Humus hat die Schrift so einen Stil. Da kannst du dir die beiliegende Texture ja mal ansehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 05, 2005 12:20 
Offline
DGL Member

Registriert: Mi Apr 27, 2005 19:24
Beiträge: 24
Das Bild stammt aus einem Spiele-Demo und die benutzten OpenGL aber keine Texture für die Fonts, sondern laden die Fonts (TTF-Font) direkt hinein und müssen sie dann irgendwie bearbeiten. Denn die Fonts hat keinen Rand und auch der Abstand der einzelnen Buchstaben ist großer (habe es mit gleich großer Fonts versucht). Ich wäre für jede Hilfe dankbar!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 05, 2005 12:23 
Offline
DGL Member

Registriert: Mi Apr 27, 2005 19:24
Beiträge: 24
Rein durch das skalieren der Fonts kann das auch nicht gemacht worden sein, denn die Fonts hat eckige Kanten und bei der Skalierung wären die immer noch da!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 05, 2005 12:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also. Die Fonts kann man laden und dann auf ein Bitmap rendern. Nichts Anderes mache ich wenn ein Texturfont erstelle. Mit Bitmapfonts geht es aber definitiv nicht! Da die lediglich 0 oder 1 für ein Pixel speichern können. Die haben keinen Alphakanal oder sonst etwas. Ich denke also mal, dass die das in dem Spiel auch so machen. Die nehmen sich das Font und packen es auf ein Bitmap. Evtl kann man dann ja auch mittels verschiedener Algorithmen noch einen weicheren Rand drum rum zeichnen. Da man von einem Font auch die Breiten für die einzelnen Buchstaben abfragen kann, kann man so problemlos die Breite des Randes hinzuzählen und das beim Zeichnen berücksichtigen. Und wenn man die einzelnen Buchstaben sowieso schon alleine Zeichnet dann kann man auch den Abstand selber bestimmen.

Ich würde dir aber empfehlen es gleich als Textur zu machen. So kannst du den vollen Funktionsumpfang deines Grafikprogramms mit benutzen. Das ist einfacher als es aller per Software zu machen. Und vor allem wesentlich schneller. Also wenn du nicht gerade zur Laufzeit die Fonts aus deinem Windows einladen willst rate ich auch dringlichst davon ab. Das ist unnötig komplizierter Aufwand.

Eckige Kanten. Was meinst du denn damit?
Wenn die Schrift groß genug ist, dann werden deren Ränder antialized. Also die Ränder werden duch das einberechnen von Subpixel (Zerlegung eines Pixels in 4 kleinere Pixel) weicher. Dadurch entstehen leicht bis stark transparente Pixel. Aber auch das geht bei Bitmapfonts nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 05, 2005 19:40 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Um mal das Vorbei-Reden hier etwas einzudämmen:

Bitmap-Fonts sind relativ langsam, können nicht skaliert werden und bieten kaum Möglichkeiten zur Bearbeitung.

Was du suchst sind Texture-Fonts. Dabei wird eine Font aus dem TTF geladen und mittels Canvas.TextOut in eine Textur geschrieben. Diese wird dann in OpenGL ganz normal auf ein Quad geklebt und schon hast du Text als Textur. Mit einem Quad kann man natürlich die verschiedensten Dinge anstellen. Nebenbei bemerkt ist das eine der schnellsten Methoden, um Schrift mit OpenGL darzustellen.
Du kannst natürlich auch die Font-Texture in deinem Grafikprogramm erstellen. Hat den Vorteil, dass du dort schon den vollen Funktionsumfang von z.B. Photoshop ausnutzen kannst. Dann hast du ein Bild deiner Font. Das sieht dann so ähnlich aus:
Code:
  1.  ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890
(Naja... so ähnlich jedenfalls ;) )

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 05, 2005 19:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
@frase: Davon rede ich doch die ganze Zeit. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 06, 2005 17:51 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Lossy eX hat geschrieben:
@frase: Davon rede ich doch die ganze Zeit. ;-)

@Lossy eX: Sag ich doch ;)

Das war auch weniger an dich gerichtet, sondern eher pauschal an den Rest, um dem Aneinandervorbeireden vorzubeugen...

@Sharky: In Saschas Bomberman-Tutorial werden auch Texture-Fonts genutzt. Kannst dich dort mal etwas umsehen.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]