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

Aktuelle Zeit: Fr Jul 18, 2025 23:14

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Dez 20, 2006 17:27 
Offline
DGL Member

Registriert: Di Sep 27, 2005 21:15
Beiträge: 17
Hallo zusammen,

ich wollte ein paar 2D-Objekte beschriften und habe dies zunächst mit 8x8-Bitmaps und glBitmap getan. Nun passen sich diese natürlich nicht der Auflösung an, aber Skalierungen und Bitmaps schließen sich vermutlich aus, oder gibt es doch einen Weg? Es müsste auch gar nicht unbedingt flüssig sein, zur Not würde es mir reichen, eine 8x8-Bitmap auf eine 16x16, 32x32, usw. -Bitmap abzubilden, solange es nicht zu performance-lastig wird.

Eine andere Lösung wäre natürlich, anstatt der Bitmaps Polygone mit den entsprechenden Zeichen als Textur zu verwenden. Mit dem Alpha-Test erhalte ich aber immer unschöne weiße Fransen und eine Blending-Einstellung, die weiche Übergänge überzeugt, habe ich auch nicht entdeckt.

Was ratet ihr mir?

Danke und Gruß,
Lucas


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 20, 2006 18:31 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Mit blending geht das einfach:
Farb komplett weiß(Wahrscheinlich kann man den sogar irgendwie weglassen), die Schrift in den Alphakanal. Dann mit standard alphablending rendern. Textfarbe mit glColor festlegen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 21, 2006 11:17 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Genau so wirds gemacht. Zur beschleunigung kannst du noch nen Alphatest vorschalten der alle komplett transparenten Pixel wegwirft.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 23, 2006 12:48 
Offline
DGL Member

Registriert: Di Sep 27, 2005 21:15
Beiträge: 17
Thx, klappt wunderbar. Vielleicht könnt ihr mir dennoch noch einen kleinen Tipp geben, wenn nicht, dann läufts auch so.

Habe den Zeichensatz in eine Textur verpackt (tga), die natürlich nur 1x geladen werden muss. Dies würde ich gerne im Initialization-Part der Unit machen, wo ich die Funktion glWrite zum Text ausgeben definiert habe. Funktioniert nur leider nicht. Bei _glGenTextures(n, textures) in dglOpenGL tritt eine Access Violation (000000000) auf. Lade ich die Textur normal, also nicht im Initialization-Part, läuft alles glatt. Der Initialization-Part von dglOpenGL wird VOR dem meiner glWrite-Unit aufgerufen, daran sollte es also nicht liegen. Wo dann der Unterschied liegt, habe ich noch nicht herausgefunden.
Hier dann der funktionierende Code, ich verwende die Textures.pas von Jan Horn.

Code:
  1. unit u_glwrite;
  2.  
  3. interface
  4.  
  5. procedure glWrite(Str: String; Size: Integer = <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->;
  6.  
  7. implementation
  8.  
  9. uses
  10.   dglOpenGL,
  11.   Textures;
  12.  
  13. const
  14.   // Textur-Pfad für Schriftzeichen
  15.   FONTTEXPATH = 'images/font.tga';
  16.   // Anzahl der Zeichen in der Textur
  17.   CHARSPERROW = 4;
  18.   CHARSPERCOL = 4;
  19.   // ASCII-Zeichen beschränken
  20.   ASCIILOW = 46;
  21.   ASCIIHIGH = 57;
  22.  
  23. type
  24.   // Speichert Positionsdaten eines Zeichens in der Textur
  25.   TPoint = record
  26.     x,
  27.     y: Single;
  28.   end;
  29.  
  30. var
  31.   FontTexture: glUInt;
  32.   // Initialisierungsvariable
  33.   TexLoaded: Boolean = FALSE;
  34.   // Tabelle, die ASCII-Zeichen auf Positionswerte abbildet
  35.   ASCII2Pos: Array[0..255] of TPoint;
  36.   // Relative Einheiten pro Zeichen auf der Textur
  37.   ColFactor,
  38.   RowFactor: Single;
  39.  
  40. //----------
  41. // Initialisiert die Positionswerte der ASCII-Tabelle
  42. //----------
  43. procedure InitPosTable;
  44.   var
  45.     i: Integer;
  46. begin    
  47.   // Initialisieren
  48.  
  49.   for i := ASCIILOW to ASCIIHIGH do
  50.   begin
  51.     ASCII2Pos[i].x := 3;
  52.     ASCII2Pos[i].y := 3;
  53.   end;
  54.  
  55.  
  56.   // ASCII: 46, Zeichen: .
  57.   ASCII2Pos[46].x := 2;
  58.   ASCII2Pos[46].y := 2;
  59.   // ASCII: 48, Zeichen: 0
  60.   ASCII2Pos[48].x := 0;
  61.   ASCII2Pos[48].y := 0;
  62.   // ASCII: 49, Zeichen: 1
  63.   ASCII2Pos[49].x := 1;
  64.   ASCII2Pos[49].y := 0;
  65.   // ASCII: 50, Zeichen: 2
  66.   ASCII2Pos[50].x := 2;
  67.   ASCII2Pos[50].y := 0;
  68.   // ASCII: 51, Zeichen: 3
  69.   ASCII2Pos[51].x := 3;
  70.   ASCII2Pos[51].y := 0;
  71.   // ASCII: 52, Zeichen: 4
  72.   ASCII2Pos[52].x := 0;
  73.   ASCII2Pos[52].y := 1;
  74.   // ASCII: 53, Zeichen: 5
  75.   ASCII2Pos[53].x := 1;
  76.   ASCII2Pos[53].y := 1;
  77.   // ASCII: 54, Zeichen: 6
  78.   ASCII2Pos[54].x := 2;
  79.   ASCII2Pos[54].y := 1;
  80.   // ASCII: 55, Zeichen: 7
  81.   ASCII2Pos[55].x := 3;
  82.   ASCII2Pos[55].y := 1;
  83.   // ASCII: 56, Zeichen: 8
  84.   ASCII2Pos[56].x := 0;
  85.   ASCII2Pos[56].y := 2;
  86.   // ASCII: 57, Zeichen: 8
  87.   ASCII2Pos[57].x := 1;
  88.   ASCII2Pos[57].y := 2;
  89.  
  90.   // Relativ-Positionen bestimmen
  91.   RowFactor := 1 / CHARSPERROW;
  92.   ColFactor := 1 / CHARSPERCOL;
  93.   for i := ASCIILOW to ASCIIHIGH do
  94.   begin
  95.     ASCII2Pos[i].x := ASCII2Pos[i].x * RowFactor;
  96.     ASCII2Pos[i].y := ASCII2Pos[i].y * ColFactor;
  97.   end;
  98. end;
  99.  
  100. //----------
  101. // Rendert den in Str angegebenen Text
  102. //----------
  103. procedure glWrite(Str: String; Size: Integer = <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->;
  104.   var
  105.     i,
  106.     d: Integer;
  107.     CharPos: TPoint;
  108. begin
  109.   if not TexLoaded then
  110.   begin
  111.     // Textur laden
  112.     LoadTexture(FONTTEXPATH, FontTexture, FALSE);
  113.     TexLoaded := TRUE;
  114.   end;
  115.   // Zentrieren
  116.   glTranslatef((Length(Str) - 1) * -0.5 * SIZE, 0.0, 0.0);
  117.   // Textur einstellen
  118.   glBindTexture(GL_TEXTURE_2D, FontTexture);
  119.   for i := 1 to Length(Str) do
  120.   begin
  121.     try    
  122.       CharPos := ASCII2Pos[ord(Str[i])];
  123.     except
  124.       // Nicht vorkommendes Zeichen entdeckt
  125.       continue;
  126.     end;
  127.     // Verschiebung
  128.     d := (i - 1) * Size;
  129.     // Zeichnen
  130.     glBegin(GL_QUADS);
  131.       // 0/1
  132.       glTexCoord2f(CharPos.x, CharPos.y + ColFactor);
  133.       glVertex2i(d, Size);
  134.       // 0/0
  135.       glTexCoord2f(CharPos.x, CharPos.y);
  136.       glVertex2i(d, 0);
  137.       // 1/0
  138.       glTexCoord2f(CharPos.x + RowFactor, CharPos.y);
  139.       glVertex2i(d + Size, 0);
  140.       // 1/1
  141.       glTexCoord2f(CharPos.x + RowFactor, CharPos.y + ColFactor);
  142.       glVertex2i(d + Size, Size);
  143.     glEnd;
  144.   end;  
  145.   glBindTexture(GL_TEXTURE_2D, 0);
  146. end;
  147.  
  148. initialization
  149.  
  150. InitPosTable;
  151.  
  152. finalization
  153.  
  154. end.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 23, 2006 23:03 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Du kannst OpenGL funktionen erst nach dem initialisieren von OpenGl ausführen. Da du vermutlich im FormCreate initialisierst, kanns du sie in initabschnitten nicht verwenden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 24, 2006 00:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Mir ist noch etwas anderes aufgefallen. Benutzt bitte nicht die Funktionen mit dem Unterstrich. Die gibt es in Wirklichkeit gar nicht. Die wurden nur für .NET eingebaut und es könnte passieren, dass es die irgendwann nicht mehr gibt. Einfach den Unterstrich entfernen das sollte ausreichen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 24, 2006 13:37 
Offline
DGL Member

Registriert: Di Sep 27, 2005 21:15
Beiträge: 17
_glGenTextures wurde von mir nur indirekt aufgerufen, denn sie wird in dglOpenGL.pas selbst verwendet. Die Textures.pas verwendet glGenTextures. Wollte damit nur aufzeigen, an welcher Stelle sich das Programm genau aufhängt.

Code:
  1. procedure glGenTextures(n: TGLsizei; textures: PGLuint); overload;
  2. begin
  3.   _glGenTextures(n, textures);
  4. end;
[/pascal]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 25, 2006 00:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wollte nur auf Nummer Sicher gehen. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 25, 2006 02:17 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
Wie lädst du OpenGL? Ich hatte da auch mal Probleme mit glGenTextures und da habe ich glaubich falsch geladen.

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 25, 2006 12:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich denke du hast ihn da missverstanden. Der Code den er gepostet hat stammt aus der dglOpenGL. Und das ist ein Workaround für .NET.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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 | 15 Queries | GZIP : On ]