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

Aktuelle Zeit: Fr Jul 11, 2025 04:45

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



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2008 18:29 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Ich vermute das bei mir das umschalten zwischen den ts-kontexten nicht richtig funktioniert. Habe gerade mal die Schriftgröße im 3D-Fenster geändert und die Blöcke im 2D-Fenster wurden ebenso größer. Irgendwas passt da nicht. Hilft das?

Nachtrag: Ich habe die ContextID, FontID sowie InitTS global gemacht. Nutze es also mit beiden Renderkontexten. Keine Änderung. Dann habe ich dafür gesorgt dass das 2D-Fenster sofort erscheint und das 3D-Fenster auf abruf. Jetzt ist die Situation genau umgekehrt. Der Text im 2D-Fenster erscheint klar und deutlich, dafür im 3D-Fenster als Rechtecke. Da sich der Text im 3D-Fenster schnell ändert, sind einige Zeichen zu sehen.

_________________
Just do it!


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

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Ich habe die ContextID, FontID sowie InitTS global gemacht. Nutze es also mit beiden Renderkontexten.

Dazu kann ich nur dir Ärzte zitieren. "Tu das nicht". Der Kontext der TextSuite hat einen Renderer für OpenGL. Dieser Renderer benutzt Texturen. Die OpenGL Texturen sind aber abhängig vom Renderkontext. Wenn du jetzt den TextSuite Kontext mit einem anderen OpenGL Kontext benutzt, dann sind die Texturen anders oder sogar nicht vorhanden.

Entsprechend musst du dafür sorgen, das die OpenGL Kontexte sich den Namensspace für Texturen teilen. wglShareLists. Oder du musst 2 TextSuite Kontexte und die jeweils dafür passenden Fonts erstellen. Aber du solltest auf keinen Fall ein TextSuite Kontext mit verschiedenen OpenGL Kontexten benutzen.


Wenn du das berücksichtigs und trotzdem noch komische Fonts bekommst, dann mach mal Bitte ein Bild davon und hänge es an. An nicht unbedingt das wo es schwarz ist sondern bei solchen Sachen wie ist nicht klar und deutlich erkennbar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2008 17:40 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Vielen Dank erst mal, Problem noch nicht gelöst, aber ich habe die nächsten Tage keine Zeit daran zu arbeiten. Werde demnächst noch mal in Ruhe dran setzen und erstatte dann bericht.

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 13:54 
Offline
DGL Member

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

ich habe es jetzt so geändert, dass die Struktur eines jeden Renderkontextes eine eigene InitTS besitz in der eine lokale ContextID und eine lokale FontID erzeugt wird. Trotzdem ist es so, dass wenn ich die Schriftgröße im 3D-Fenster ändere sich gleichzeitig die Schriftgöße (oder Blockgröße) des 2D-Fensters ändert. Ich habe also den Eindruck, das bei einem Wechsel des Renderkontextes der Textsuitekontext nicht mit geändert wird. Ich habe mal explizit vor dem Schreiben des 2D-Fensters ein tsContextBind(f2DContextID) eingefügt und bekomme dann die Meldung "No Active Context" (entsprechend wird gar nichts gezeichnet).
Code:
  1.  
  2.   tsContextBind(f2DContextID);
  3.   tsSetParameteri(TS_ALIGN, TS_ALIGN_LEFT);
  4.   tsFontBind(f2DFont1ID);
  5.   Error := tsGetError;
  6.   ShowMessage(tsGetErrorString(Error));
  7.   tsTextColor3f(1.0, 0.0, 0.0);
  8.  
  9.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  10.   glEnable(GL_BLEND);
  11.  
  12.   tsTextBeginBlock(20, 10, 100, 100, TS_BLOCKFLAG_NONE);
  13.     tsTextOutA('hello');
  14.   tsTextEndBlock;
  15.  


Screenshot habe ich auch beigefügt. Kannst du mir bitte etwas detaillierter Erklären wie ich den Renderkontext wechsel speziell was TS betrifft? Muss/kann ich explizit dafür sorgen das die KontextID gewechselt wird. Kann ich z.B. mit getParameteri feststellen welche ContextID aktiv ist?


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

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 14:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Ich habe also den Eindruck, das bei einem Wechsel des Renderkontextes der Textsuitekontext nicht mit geändert wird.

Das ist vollkommen richtig. Die TextSuite hat zwar eine ähnliche Syntax/Aufbau wie OpenGL ist aber jedoch von OpenGL vollkommen losgelöst. Nur ein ganz kleiner Teil der Bibliothek benutzt OpenGL Funktionen. Diese OpenGL Aufrufe beziehen sich dann wie alle anderen OpenGL Aufrufe auch nur auf den aktuellen OpenGL Kontext. Da unterschiedliche OpenGL Kontexte auch unterschiedliche Texturen besitzen ist es notwendig, dass du für jeden eigenständigen OpenGL Kontext auch einen TextSuite Kontext besitzt. Da der TextSuite Kontext einen Renderer besitzt in dem die Texturen verwaltet werden. Und das kann man nur trennen, wenn man 2 Kontexte = 2 Renderer hat. Denn der Renderer bekommt es nicht mit, wenn der Entwickler einen anderen OpenGL Kontext aktiviert. Zu man sonst auf die Idee kommen könnte ein Font Kontext 1 zu erstellen und es in Kontext 2 benutzen zu wollen. Und das wäre wenn überhaupt nur mit entsprechend großem Aufwand möglich.

Die Initialisierung würde in etwa so aussehen.
Code:
  1. // OpenGL Kontext 1 erstellen und aktivieren
  2. // TextSuite Kontext 1 erstellen und aktivieren
  3. // Font erstellen
  4.  
  5. // OpenGL Kontext 2 erstellen und aktivieren
  6. // TextSuite Kontext 2 erstellen und aktivieren
  7. // Font erstellen


Beim Zeichnen müsstest du dann folgendes machen.
Code:
  1. // 3D Kontext (1) aktivieren
  2. // TextSuite Kontext 1 aktivieren
  3. // Font binden und Text ausgeben
  4.  
  5. // 2D Kontext (2) aktivieren
  6. // TextSuite Kontext 2 aktivieren
  7. // Font binden und Text ausgeben


Also wenn du Text ausgeben willst, dann musst du immer den TextSuite Kontext aktivieren der zu dem aktuellen OpenGL Kontext gehören soll. Die Texturen werden zwar erst erstellt, wenn du Buchstaben erstellst (tsFontAddChar* oder Text ausgegeben wurde). Allerdings Sicherheitshalber würde ich beim Wechsel des OpenGL Kontextes auch den TextSuite Kontext wechseln. Ich vermute mal, dass da irgendwas nicht ganz stimmt.

Den OpenGL Kontext würde ich mit wglMakeCurrent wechseln.

Zum Erfragen des aktuellen TextSuite Kontextes kannst du tsGetParamater mit dem Paramater TS_CONTEXT_BINDING benutzen. Aber so etwas sollte eigentlich nicht nötig sein.



Aber mal was Anderes. Müssen deine 2 Kontexte komplett voneinander getrennt sein? (Ich mach das farbig damit es nicht unter den Tisch fällt). Wenn du keine 2 komplett voneinander getrennten OpenGL Kontexte benötigst, dann kannst du deine beiden OpenGL Kontexte auch mit wglShareLists miteinander verbinden. Sollte in einem OpenGL Kontext eine Textur erstellt werden ist sie automatisch in dem Anderen auch vorhanden. Damit könntest du es erreichen, dass du nur einen TextSuite Kontext benötigen würdest. Das würde die Handhabung der TextSuite vereinfachen und evtl Texturspeicher sparen.

PS: Falls es nicht geht und du zwei getrennte Namespaces der Kontexte benötigst, dann kann ich dir nur das Angebot machen, dass du mir mal dein Projekt (mit allen benötigten Teilen) per Mail zuschickst und es mir selber mal anschaue. Meine Mail-Adresse findest du auf der Teamseite. Alternativ kann es auch helfen mal ein kleines Testprojekt zu machen in dem du nur 2 Kontexte erstellst und


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 15:35 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Irgendwie hab ich wohl noch nicht begriffen wie ich zwischen den TS-Kontexten hin und herschalte.

Code:
  1.   ActivateRenderingContext(RenderContext2D.OpenGLDC,RenderContext2D.RC);
  2.   tsContextBind(RenderContext2D.f2DContextID);            // f2DContextID hat den Wert 1
  3.   i := tsGetParameteri(TS_CONTEXT_BINDING);               // Als Rückgabewert bekomme ich hier 0
  4.   showMessage(inttostr(i));                                             // Entsprechend ist kein Kontext aktiv
  5.   tsFontBind(RenderContext2D.f2DFont2ID);
  6.  


Soll ich mit tsContextBind wechseln?

WGLShareLists werde ich mir sicher noch überlegen zu implementieren. Allein schon wegen der Optimierung, weniger Speicherplatz, Programmierestetik, etc.

P.S. Ich bin mit dem Debugger in tsContextBind(..) eingestiegen. In der Funktion TtsHash.Get(Name: integer) : Pointer bekomme ich bei
Entry := fHashArray[Pos]; ein nil.

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 15:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja das ist leider vollkommen berechtigt, dass da eine 0 drin steht. Mir ist da gerade eine Sache wieder eingefallen. Du darfst auf keinen Fall tsInit mehr als 1 Mal aufrufen. Wenn du das tust, dann würdest du dir alle bereits erstellten TextSuite Kontexte ins Nirvana schießen! Das ist wohl bei dir der Fall. Denn du aktivierst einen Kontext und es ist trotzdem keiner gebunden. Das bedeutet aber, dass der Kontext intern gar nicht bekannt ist. Das ist ganz klar eine Einschränkung der Bibliothek und die habe ich in meiner Version schon gefixt. Nur leider ist das noch nicht öffentlich.

Aktuell solltest du es so umstellen, dass du nur ein mal tsInit und auch nur ein einziges mal tsQuit aufrufst. Und zwar nach Möglichkeit außerhalb deiner Fenster. Wo du sicher stellen kannst, dass es auch wirklich nur ein einziges mal aufgerufen wird. Es würde evtl eine Fuschmöglichkeit mit tsWasInit geben. Aber das kann ich eigentlich nicht reinen Gewissens nicht empfehlen.

Also solltest du dafür sorgen, dass deine Anwendung tsInit entsprechen frühzeit und einmalig aufruft. Irgendwann nach dem Starten. Und tsQuit auch nur einmalig irgendwann direkt vor dem Beenden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 16:19 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Das wars! Problem gelöst!

Vielen, vielen Dank!

_________________
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 Vorherige  1, 2
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 14 Queries | GZIP : On ]