Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Hallo,
irgendwie ist mein voriges Post verlorengegangen - aber egal: hier ist es noch einmal:
ich bin eigentlich kein Einsteiger mehr - ich lese schon seit einem dreiviertel Jahr bei Euch mit und habe auch schon zwei Programme, leider beide noch nicht fertig. In dieser Zeit habe ich bei Problemen eigentlich immer irgendwo Abhilfe gefunden. Das ist das erste Mal, wo ich alleine nicht mehr weiterkann.
Ich wollte Displaylisten verwenden, um eine Texture Font zu erstellen. Es gibt dazu jede Menge Threads, aber irgendwie komme ich trotzdem auf keinen grünen Zweig: ich schaffe mit den Displaylisten keine Text-Ausgabe.
Zu den Details:
- ich verwende Delphi7
- ich verwende dglOpengl und glBitmap (übrigens vielen Dank an Euch, sind sehr nützlich)
- ich trenne grundsätzlich immer die Benutzerschnittstelle vom übrigen Code, das heißt, im Hauptfenster werden möglichst nur die Tasten- und Mausereignisse etc. abgefangen, sonst nichts; der eigentlich Code befindet sich immer in einer anderen Unit. In diesem Fall sind in dieser Unit ein
- Objekt "OGLContext" (kümmert sich um die verwaltungstechnischen Dinge, merkt sich den Renderkontext usw.) und ein
- Objekt "OGLFont" (sollte sich um die Textausgabe kümmern).
- die Textur ist ein 256x256 Pixel großes JPG, das ich selber gebastelt habe. Derzeit sind nur Grossbuchstaben drauf (einer hat jeweils 16x16 Pixel)
- das OGLFont hat eine Methode "BuildFont", welche die 256 Displaylisten mit je vier Vertices und den zugehörigen Texturkoordinaten erstellt.
- es hat auch eine Methode "Print", welche mittels glCallLists die Listen aufrufen soll; SIE TUT ES ABER NICHT.
In meiner Not habe ich
1) eine Methode"PrintLetter" geschrieben, die einen Buchstaben ausgibt mit genau den gleichen OpenGl-Befehlen, die in der Displayliste stehen, DAS FUNKTIONIERT.
2) Ausserdem habe ich, weil ich gelesen habe, dass vielleicht das Fehlen des Renderung-Kontexts schuld sein könnte, meinen ganzen Code doch auch noch ins Hauptformular gepackt (Pfui Spinne!), DAS FUNKTIONIERT AUCH.
3) Ich habe mit "wglMakeCurrent" herumgestümpert, das hat nichts genutzt. Ehrlich gesagt, habe ich davon keine Ahnung, ich weiß nicht einmal, wo man das eigentlich platzieren muss.
Folgende Kontrollen habe ich gemacht:
1) ich habe den OpenGl-ErrorCode vor und nach dem Aufruf der Displaylisten geprüft - "no error"
2) ich habe per glIsList abgefragt, ob die Listen existieren, das ist auch OK
Ich habe mich zwar noch nie mit Fonts über Displaylisten beschäftigt, aber sieh dir einfach ma die EasySDLFont an, da is alles gut Dokumentiert, und es wird auch ueber Displaylisten alles gehandelt. Das sollte dir helfen
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Hallo,
ich bin's nochmal. Das mit dem Rendering Context kanns jedenfalls auch nicht sein, weil ich grade rausgefunden habe, wie man das abprüft. Ich habs geprüft und ich habe in den fraglichen Methoden überall einen aufrechten, gültigen Device- und auch Rendering Context.
Das DGLSDK hab ich mir heruntergeladen, aber durch den Code bin ich noch nicht durchgedrungen, das braucht Zeit.
viele Grüße,
Traude
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Hallihallo,
ich bin's ein letztes Mal. Nach 3 Tagen intensiven Suchens habe ich die Ursache für den Fehler gefunden. Vielleicht interessierts noch jemanden, der auch Probleme mit Displaylisten hatte:
Die Lösung gilt für die Konstellation: Delphi7 + Displaylisten. Ich habe immer die Displaylisten anlässlich der Initialisierung des Programms aufgebaut (beim Create des Hauptfensters). Wenn man die Displaylisten zu einem späteren Zeitpunkt erstellt, funktioniert das Ganze wieder - zumindest bei mir. Offenbar ist die Grafikkarte beim Create der Applikation noch nicht bereit.
Ich erinnere mich, gelesen zu haben, dass die Create-Erstellungsreihenfolge in Delphi irgendwann geändert wurde (Stichwort "OldCreateOrder"). Vielleicht hängt es damit zusammen.
Liebe Grüße
Traude
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
So dann will ich mal versuchen ein wenig Licht in dein Problem zu bekommen. Das ist aber alles ein wenig undurchsichtig.
Das Wichtigste ist in jedem Fall, dass dein Kontext bereits vollkommen erstellt ist. Ansonsten sollte der Rest recht einfach zu handhaben sein. Ob das bei dir der Fall ist kann man leider nicht so richtig erkennen. Die Generation und die Benutzung deiner Liste sehen für mich jetzt so schon vollkommen in Ordnung aus. Ich denke mal es liegt wirklich irgendwie daran, dass der Kontext noch nicht richtig funktioniert. Allerdings funktioniert das im OnCreate eines Formulares normalerweise aber ohne Probleme. Ich persönlich benutze gerne OnShow. Das wird aufgerufen bevor das Fenster sichtbar gemacht wird. Sollte aber keinen Unterschied machen.
Interessant wäre aber mal zu sehen was du sonst noch so alles tust. Setzt du zum Beispiel irgendwelche Eigenschaften bei dem Fenster? Borderstyle oder so etwas? Das sogt intern nämlich dafür, dass dein Fenster ungültig wird und somit auch deine DL nicht mehr existiert.
PS: Habe mir gestern mal die SDL_TTF angesehen und ehrlich gesagt rollen sich da bei mir die Fußnägel nach oben. Mir wiederstrebt es ein wenig für jeden Text eine eigene Textur erstellen zu müssen und bei veränderlichen Texten dann die Texturen immer Uploaden zu müssen etc.
[edit] Ach ja. Die OldCreateOrder bezieht sich auf Komponenten. Um Speziell zu sein nur auf nicht visuelle Komponenten. Wenn ich mich gerade nicht total irre.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Zitat:
Interessant wäre aber mal zu sehen was du sonst noch so alles tust. Setzt du zum Beispiel irgendwelche Eigenschaften bei dem Fenster? Borderstyle oder so etwas? Das sogt intern nämlich dafür, dass dein Fenster ungültig wird und somit auch deine DL nicht mehr existiert.
Nein, ich setze keine Eigenschaften. Ich wollte ein UserInterface schreiben, und bin schon beim Erzeugen einer Schrift hängengeblieben. Ich mache das ganz einfach so:
Also das mit der OldCreateOrder ist mir nur im Gedächtnis geblieben. Ob's das wirklich ist, kann ich nicht sagen.
Die Ereignisse "OnShow" und "OnActivate" verwende ich nicht gerne, weil ich im Allgemeinen zu Programmbeginn gerne alle Initialisierungen fertig habe.
Traude
Zuletzt geändert von Traude am Mi Okt 04, 2006 09:32, insgesamt 1-mal geändert.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Ach ja, mir ist noch etwas eingefallen:
In der Methode "TOGLContext.Init" (das ist das erste Programmlisting im meinen ersten Post) rufe ich standardmäßig das Resize des Fensters auf :
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
OnActivate ist wiederrum gefährlich, da es immer dann aufgerufen wird sobald dein Fenster aktiviert wird. Sobald du also auf ein anderes Fenster wechselst wird es noch mal aufgerufen. OnCreate wird nur nach dem Erstellen aufgerufen und OnShow halt jedesmal bevor es sichtbar wird. Das macht wirklich nur dann einen unterschied, wenn man ein Fenster häufiger nicht sichtbar hat und wieder sichtbar stellt. Sonst aber nicht.
PS: Schön, dass du es irgendwie doch geschafft hast eine Lösung dafür zu finden.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Wenn ich mich recht erinner, wird für jeden Buchstaben ein Eintrag in der Displayliste gemacht.
Wenn sich was am Font ändert ausser Farbe dann wird die Liste neu erstellt.
Ich mach es wie folgt, eine FontBitmap zur laufzeit generieren(mit SDL_TTF), die Textur Binden und dann in die Displaylist jeweils ein Quad mit Korrekter Texcoord reinpacken. Am Ende kann man dann den Text ganz Einfach darstellen.
edit:
Ich hab auch ganz schön mit Resize zu kämpfen gehabt.
Da man ja alles neuladen und generieren muss.
Ich benuzte Manager und die besitzen mitlerweile reload Funktionen um den Content erneut zu laden.
So wird auch nach dem resize alles korrekt dargestellt.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Zitat:
Wenn sich was am Font ändert ausser Farbe dann wird die Liste neu erstellt.
VIELEN DANK, Tak! Das wars. Manchmal ist man wie vernagelt. Ich Rhino setze ja im Fenster-Create die Schriftgrösse;
im ursprünglichen Code wurde in der Ladeprozedur für die Schrift sofort anschliessend die Liste erstellt. Beim coden erschien mir das durchaus sinnvoll. Aber das Laden der Schrift muss vom Aufbau der Displayliste getrennt sein, weil die Liste total statisch ist: sie muss bei Größenänderung neu erstellt werden.
Vielen Dank für Eure Hilfe
Traude
Edit: Manchmal muss man mit jemandem sprechen, um auf die eigenen Fehler draufzukommen.
Nochmal Edit: Wenn man bei OOP nicht 100% logisch vorgeht, kann ein ganz schöner Knopf entstehen ...
Zuletzt geändert von Traude am Mi Okt 04, 2006 09:55, insgesamt 1-mal geändert.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ah sehe ich dank TAK ja jetzt erst, dass sich da was überschnitten hat.
Da das bitte nicht durcheinander bringen. Bei SDL ist es so, dass sobald sich die Größe des Fensters ändert, dieses neu erstellt wird und alle Texturen etc. neu geladen werden müssen. Aber bei der VCL ist eine Größenänderung eines Fensters völlig unkritisch. Dort muss nur der ViewPort angepasst werden. Das Fenster bleibt erhalten.
[edit] Schon wieder ne Überschneidung. Irgendwie habt ihr mich jetzt total abgehangen.
Registriert: Sa Mai 04, 2002 19:48 Beiträge: 3830 Wohnort: Tespe (nahe Hamburg)
@lossy: Bist Du Dir da ganz sicher? Ich habe zwar keinen Blick in die Doku geworfen, aber bisweilen verhielt sich SDL bei Fensterveränderungen genauso wie VCL und WinAPI. Einfach den Viewport neusetzen und weitermachen. Deine Aussage bezieht sich IMAO nur auf die Veränderung der Auflösung. Wenn ich mich recht entsinne lag der Grund dafür primär darinne, dass nicht alle Zielsysteme so "fortschrittliches" Umschalten zwischen Auflösungen unterstützen wie man es unter X-Server und Windows gewohnt ist. Dort wird in der Tat der RC verloren und die Texturen müssen neu geladen werden - bei einer reinen Größenänderungen des Fensters jedoch meiner Meinung nach nicht.
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Phobeus hat geschrieben:
@lossy: Bist Du Dir da ganz sicher?
Natürlich nicht. ich meine es so schon mehrfach gelesen zu haben. Also hier im Forum. Aber ich bin gerade auch ein wenig verwirrt. Weswegen ich dafür auch nicht deine Hand ins Feuer legen möchte.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die Größe war glaub ich auch kritisch. Jedenfalls früher. Mittlerweile ist das aber gefixt. Durch einen Manager (z.B. Textur oder Modelmanager) kann man das aber relativ einfach beheben. Einfach bei einem Resize alle bisherigen Texturen/Modell auf ungültig setzen, und dann neu laden. Is zwar nicht so super kreativ, hiflt aber. Wie geasgt nur früher. Das sollte mittlerweile gehen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Mitglieder in diesem Forum: Majestic-12 [Bot] und 6 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.