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

Aktuelle Zeit: Mo Jul 14, 2025 21:52

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



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mi Nov 26, 2008 13:59 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Hallo,

ich habe zwei Renderkontexte, einmal für 3D und einmal für 2D, zwischen denen ich manuell hin und her schalten kann. Es ist immer nur einer aktiv. Im 3D-Fenster habe ich ein HUD welches mittels Textsuite aktuelle Daten darstellt. Im 2D-Fenster will ich ebenfalls Textsuite nutzen, aber anstatt irgend einem Text wird das gesamte Bild nur mit der zuvor eingestellten Textfarbe überblendet.
Zuerst hatte ich die Überblendung auch im 3D-Fenster, aber mit einem Aufruf von glDisable(GL_TEXTURE_2D) war das Problem beseitigt. Obwohl ich keinen Unterschied in der Implementierung finden kann, krieg ich das im 2D-Fenster nicht in den Griff.
Kann mir jemand helfen? Unten ist ein Codeschnipsel mit meiner Textausgabe

Code:
  1.  
  2.   glPushMatrix;
  3.   glLoadIdentity;
  4.   glTranslatef(0,0,-0.65);
  5.   glScalef(1,-1,1);
  6.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  7.   glEnable(GL_BLEND);
  8.   glDisable(GL_LIGHTING);
  9.   glDisable(GL_CULL_FACE);
  10.  
  11.   tsSetParameteri(TS_ALIGN, TS_ALIGN_LEFT);
  12.   tsFontBind(fFont2ID);
  13.   tsTextColor3f(0.0, 0.9, 0.5);
  14.  
  15.     tsTextBeginBlock(20, 20, 100, 100, TS_BLOCKFLAG_NONE);
  16.       s := 'hello';
  17.       tsTextOutA(PAnsiChar(s));
  18.     tsTextEndBlock;
  19.  
  20.   glDisable(GL_TEXTURE_2D);  // Hat hier im 2D-Bereich keinen Einfluss
  21.   glEnable(GL_CULL_FACE);
  22.   glDisable(GL_BLEND);
  23.   glPopMatrix;
  24.  



Eine Abfrage von glGetIntegerv(GL_VIEWPORT, @Viewport) liefert eine Breite von ~700 Pixeln und eine Höhe von ~300 Pixeln. Ich würde jetzt den Text so ziemlich in der Mitte der Zeichenfläche erwarten. Aber wo ist er?

Marcel

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 26, 2008 14:07 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Setz mal mit
tsTextColor3f(1.0, 1.0, 1.0);
die Farbe wieder zurück nach dem
tsTextEndBlock;
Vll reicht das ja schon.

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 26, 2008 14:48 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Ja, danke, das hab ich schon. Funktioniert auch. Aber trotzdem wird der Text nicht ausgegeben.

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 26, 2008 15:11 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Ach das ist das Problem? oben steht es nicht ganz genau da okay ^^

edit:
Wenn du mit 2D arbeitest dann liegt
glTranslatef(0,0,-0.65);
unterhalb des Fensters glaube ich.
Unter 2D werden Pixelangaben benötigt und der Ursprung ist Mormalerweise unten links.
also wären ganzahlige werte eventuell besser und positive.
edit2: und das -1 bei Scale was soll das bewirken? Wenn du es kleiner machen willst, musst du 0.x angeben^^ 0 wäre nicht sichtbar.. -1 ist dann vermutlich undefiniert und deshalb kommt dieses Ergebnis zustande.

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 26, 2008 15:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
tsTextColor3f ist ziemlich genau das Gleiche wie glColor3f. Nur, dass tsTextColor3f nicht direkt ausgeführt wird sondern evtl intern in eine Queue gepackt werden muss. Das ist, genau wie die gebundene Textur, etwas was durch die Ausgabe von Text verändert werden kann.

Was die Ausgabe von Text angeht. Der Text arbeitet normal mit Größenangeben die Pixel entsprechen. Also ein Textblock mit einer Höhe und Breite von 400 benötigt in pixelgenauer Darstellung 400x400 Pixel. Das funktioniert, weil ich für die Textausgabe OpenGL Einheiten mit Pixeln gleich setze. Also wären das 400x400 OpenGL Einheiten. In 2D genügt es glOrtho entsprechend einzustellen. Und für 3D muss du das Ganze noch etwas kleiner skalieren. Denn sonst wäre es vermutlich viel zu groß. Die verschiebung um um -0.65 ist eigentlich auch okay. Sofern das innerhalb von zNear und zFar liegt. Hast du zum Beispiel 1-100 angegeben, dann klappt das natürlich nicht. Dann liegt die Schrift noch vor der Kamera.

In dem Downloadverzeichnis der TextSuite gibt es auch ein Packet mit Beispielen. Dort enthalten ist unter anderm eines für 3D und diverse 2D Beispiele.

PS: Den fixen String kannst du auch direkt an die Methoden übergeben. "tsTextOutA('Blah');" Delphi bekommt das mit und wandelt den automatisch in einen PAnsiChar um.

revolte: Nicht ganz ein -1 bei Scale ist definiert. Das sorgt dafür, dass die Werte gespiegelt werden. Damit könntest du zum Beispiel ein Spiegelbild eines Objektes erstellen ohne, dass sich Vorne und Hinten verändert. Die Schrift arbeitet mit dem Ursprung ObenLinks. Wenn du bei glOrtho aber lieber mit UntenLinks arbeitest, dann würde die Schrift immer auf dem Kopf stehen. Also einmal -1 und sie steht richtig rum.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 26, 2008 16:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Oh interessant o.o Hät vielleicht in das Wiki gucken sollen, da steht das auch drin.. tralalla hab nix gesagt :D

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 26, 2008 18:01 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Ich denke von der Z-Position her sollte es passen. Ich render im Ortho-Modus. Anfangs hatte ich den Tiefenpuffer ausgeschaltet und nur in der richtigen Reihenfolge gezeichnet. Als ich keinen Text bekam, hab ich dann alles manuell auf die richtige Tiefe gesetzt (daher auch die -0.65). An den Beispielen von Textsuite habe ich mich schon orientiert als ich das 3D-Fenster (HUD ebenfalls im Ortho-Modus) gerendert habe. Wie gesagt, verstehe nur nicht warum es im 2D-Fenster nicht funzt. Werde mich morgen noch mal unvoreingenommen dran setzen.

Vielen Dank erst mal.

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 26, 2008 19:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Im Zweifel würde es uns auch helfen, wenn wir ein bisschen mehr von deinem Code sehen. Speziell auch wie du deine Ansicht einstellst. Als kleine Hilfestellung. Die Texte sind nur simple quads mit relativ großem Ausmaß.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2008 10:59 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Wie gesagt, eine Nacht drüber schlafen und schon lösen sich viele Probleme zum Teil wie von selbst. Es lag daran das ich bei glOrtho nur das Seitenverhältnis (2:1) angegeben habe. Dadurch wurde die schrift so groß skaliert das sie nicht mehr dargestellt wurde. Jetzt sehe ich zumindest dass der Text da ist.
Ganz so reibungslos funktionierts dennoch nicht. Die Buchstaben werden immer als ausgefüllte Rechtecke dargestellt, so als ob Blending nicht aktiviert ist. Wenn ich die Blendfunktion ändere, dann wird zwar die Farbe dieser Textblöcke anders berechnet, aber es ändert nichts an der Blockschrift selbst. Blending ist also enabled.
Hat dafür noch jemand eine Erklärung?

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2008 12:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also Blending muss zum Zeichnen natürlich aktiviert sein. Da stelle ich so nichts dran rum. Allerdings sollte da die Blendfunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) schon die Richtige sein.

So etwas könnte aber auch durch PostProcessor entstehen. Da ich natürlich jegliche Manipulation an den Bildern erlaube. Aber ich denke, dass es eher irgendwie am Blending liegen wird. Allerdings auch da kann man das ohne Code wirklich nur bedingt sagen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2008 13:03 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Also, meine Zeichenroutine sieht wie folgt aus

Code:
  1.  
  2. procedure TRender.Action;
  3. begin
  4.   glMatrixMode(GL_PROJECTION);
  5.   glLoadIdentity;
  6.   glOrtho(-whalf, whalf, -hhalf, hhalf, 0, 1);
  7.  
  8.   glMatrixMode(GL_MODELVIEW);
  9.   glLoadIdentity;
  10.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  11.  
  12.   TextOverlay;                // Der einzige Aufruf ist der zum Schreiben
  13.   swapbuffers(OpenGLDC);
  14. end;
  15.  


Die Prozedur TextOverlay:


Code:
  1.  
  2. procedure TRender.TextOverlay;
  3. var
  4.   wFactor  : double;
  5.   hFactor  : double;
  6.   tsFactor : glFloat;
  7. begin
  8.   wFactor := 1/(12*Viewport[2] / 2 + 5);
  9.   tsFactor := 1;//whalf / 360;
  10.  
  11.   glPushMatrix;
  12.   glLoadIdentity;
  13.   glTranslatef(0,0,-0.65);
  14.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  15.   glEnable(GL_BLEND);
  16.   glDisable(GL_LIGHTING);
  17.   glDisable(GL_CULL_FACE);
  18.  
  19.   tsSetParameteri(TS_ALIGN, TS_ALIGN_LEFT);
  20.   tsFontBind(fFont2ID);
  21.   tsTextColor3f(1.0, 0.0, 0.0);
  22.  
  23.   glScalef(tsFactor,-tsFactor,tsFactor);
  24.   tsTextBeginBlock(20, 10, 100, 100, TS_BLOCKFLAG_NONE);
  25.     tsTextOutA('hello');
  26.   tsTextEndBlock;
  27.  
  28.   glDisable(GL_TEXTURE_2D);
  29.   glEnable(GL_CULL_FACE);
  30.   glDisable(GL_BLEND);
  31.   glPopMatrix;
  32. end;
  33.  


Und die Routine zum initialsieren von TextSuite:

Code:
  1.  
  2. procedure TRender.InitTS;
  3. begin
  4.   FontPath := GetShellFolder(CSIDL_Fonts) + '\ARIAL.TTF';   // Font: Arial from folder C:\Windows\Fonts
  5.  
  6.   if tsInit(TS_INIT_TEXTSUITE) = TS_FALSE then begin
  7.     ShowMessage('Initialing TextSuite failed.');
  8.     Halt;
  9.   end;
  10.  
  11.   if tsInit(TS_INIT_OPENGL) = TS_FALSE then begin
  12.     ShowMessage('Initialing OpenGL failed.');
  13.     Halt;
  14.   end;
  15.  
  16.   if tsInit(TS_INIT_GDI) = TS_FALSE then begin
  17.     ShowMessage('Initialing GDI failed.');
  18.     Halt;
  19.   end;
  20.  
  21.   tsContextCreate(@fContextID);
  22.   tsContextBind(fContextID);
  23.  
  24.   tsSetParameteri(TS_RENDERER, TS_RENDERER_OPENGL);
  25.   CheckErrorTS;
  26.   tsSetParameteri(TS_CREATOR, TS_CREATOR_GDI);
  27.   CheckErrorTS;
  28.   tsFontCreateCreator(pAnsiChar(FontPath), 14, TS_STYLE_NORMAL,
  29.                       TS_DEFAULT, TS_DEFAULT, @fFont2ID);
  30.   CheckErrorTS;
  31. end;
  32.  


Kannst du irgend einen Fehler ausmachen?

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2008 13:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also soweit sieht der Code vollkommen okay aus. Und scheinbar gab es ja auch keine Probleme, da du zu mindest so etwas siehst was Schrift enthalten könnte. Damit meine ich diese Vierecke die aber leider komplett schwarz sind.

Kann es evtl. sein, dass du du irgendwo anders noch Texturen benutzt? Im speziellen meine ich dort Texturen die nicht GL_TEXTURE_2D als Target benutzen. Ich hatte schon mal den Fall wo noch ein anderes Target aktiv war und dadurch nachfolgende Texturen nicht mehr funktioniert haben.

Eventuell solltest du mal testen ob ein OpenGL Fehler vorliegt oder so etwas (glGetError). Denn von dem was ich sehe sollte es eigentlich funktionieren. PS: Die Beispiele funktionieren aber, oder?



PS: Unabhängig von deinem Problem. Zum Benutzen von Arial kannst du auch folgendes machen. ;)
Code:
  1. tsSetParameteri(TS_CREATOR, TS_CREATOR_GDI_FACENAME);
  2. tsFontCreateCreator('Arial', 14, TS_STYLE_NORMAL, TS_DEFAULT, TS_DEFAULT, @fFont2ID);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2008 15:45 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Ich habe einen Fehler gefunden, aber ich weiß nicht genau wie ich ihn beheben kann!

Folgendes Problem: Ich habe eine dritte Form (neben dem 2D und dem 3D Fenster) mit der ich die Anwendung bediene. Dort habe ich einen Button mit dem ich vom 3D ins 2D fenster wechsel, bzw. wo ich den Renderkontext wechsel. Und beim Deaktivieren des Renderkontextes gibt es einen Fehler. Hier der Code für den Button:

Code:
  1.  
  2.   DeactivateRenderingContext;     // Hier gibts es Fehler 1282 (GL_INVALID_OPERATION)
  3.   FMap.close;
  4.   F2DMap.Show;
  5.   ActivateRenderingContext(RenderContext2D.OpenGLDC,RenderContext2D.RC);
  6.  


Wie kann ich denn den Renderkontext vernünftig wechseln? Muss ich den vor dem Wechsel überhaupt deaktivieren oder wird das automatisch gemacht wenn ich einen anderen aktiviere? Oder muss ich den komplett freigeben?

- oh, jetzt hab ich noch ein 1280 gl_invalid_enum

- Jetzt ist aber alles Fehlerfrei

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2008 16:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Jetzt ist aber alles Fehlerfrei

Heißt das der Text wird jetzt vernünftig dargestellt oder wie habe ich das zu verstehen? Wenn ja. Was hast du getan damit es funktioniert. Warst du rein zufällig auf dem falschen RC? Denn der TextSuite Context (mit OpenGL Renderer) ist abhängig von dem OpenGL RC. Alle TextSuite Operationen müssen auf dem selben RC stattfinden. Sonst kann das Ergebniss abenteuerlich sein. Da in OpenGL urplötzlich alles anders sein kann.

GL_INVALID_OPERATION: Besagt normal, dass du einen OpenGL Befehl aufrufst der an dieser Stelle nicht hätte stehen dürfen. Zum Beispiel das Binden einer Textur zwischen glBegin und glEnd.

GL_INVALID_ENUM: Besagt normal, dass du einen Wert an eine Methode übergeben hast die damit nichts anfangen kann. zum Beispiel glBegin(GL_TEXTURE_2D).

Was die Fehler angeht. Die können in OpenGL auch Stunden vorher aufgetreten sein. Das lässt sich leider nur näher eingrenzen in dem man häufiger auf Fehler prüft. Also die müssen nicht da aufgetreten sein wo man sie zu erst vermutet.

Zum Aktivieren eines anderen Kontextes genügt es ActivateRenderContext aufzurufen. Sobald du einen neuen RC in einem Thread aktivierst wird der andere (intern in opengl) deaktiviert. Allerdings solltest du in diesem Falle den letzten Parameter bei ActivateRenderContext auf False setzen. Da der Header sonst bei jedem Wechseln versuchen würde alle OpenGL Methoden neu zu laden. Was arg bremmsen würde. ABER und das ist wichtig. Nach dem Initialisieren muss dieser Parameter mindestens ein Mal auf True (oder auch leer) stehen. Sonst würde er nie irgendwelche Methodenpointer laden. Alternativ kannst du auch zum späteren Wechseln "wglMakeCurrent" benutzen. Das ist dann die Methode die direkt aus der Api kommt.


Eine Bitte habe ich aber noch. Sollten die TextProbleme erledigt sein, du sonst aber noch andere Fehler hast, dann bitte ich dich dafür ein neues Thema aufzumachen. Denn sonst wird es nur zu unübersichtlich, wenn man 3-4 Probleme in einem Thema bespricht. Sollte das Problem mit dem Aktivieren noch Klärungsbedarf haben, dann kann ich (oder jeder andere Mod) die entsprechenden Beiträge auch abschneiden und daraus ein neues Thema machen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2008 17:04 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Danke erst mal für die Zwischeninfo. Ich habe die Fehlerprüfung öfter aufgerufen und bin so den einzelnen Fehlern auf die Spur gekommen. Den einen hatte ich sowieso schon im Auge, wollte mich aber später drum kümmern.

Weiterhin habe ich aber immer noch keine Vernünftige Schrift.

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.013s | 15 Queries | GZIP : On ]