ich hab folgendes .. ein wenig merkwürdiges Problem. Ich bin gerade dabei meine Datenstruktur für OpenGL-Anwendungen zu kapseln und so ne allgemeine Bibliothek für meine Anwendungen anzulegen. Ursprünglich hatte ich also eine Unit, in der die Listen mit den grafischen Objekte gekapselt waren und eine, die für den Rendervorgang zuständig war. Die Renderunit war also die Einzige, in die die dglOpenGl.pas eingebunden war. Das funktioniert auch super =)
Jetzt hab ich aber angefangen Texturen einzubinden und mir überlegt, dass die Liste mit den grafischen Objekten selbst in der Lage sein soll, Texturen in den Grafikspeicher laden zu können.
Sprich die Beziehung zwischen den Units hat sich in sofern geändert, dass jetzt die Unit mit den Listen ebenfalls auf OpenGL zugreifen kann.
Soweit schön und gut =)
Die Listenunit greift jetzt also auf folgende Methoden zu:
glGenTextures, glBindTexture, glTexImage2D
Erster Versuch: Einfach die dglOpenGL.pas eingebunden und Methoden verwendet. Das schmeißt zwar keine Fehler raus, aber funktioniert auch nicht. Sprich, das Objekt bleibt einfach weiß. ( Habe die gleiche Methode benutzt, den ich vorher in der Renderunit zum Einlesen der Texturen verwendet habe. Da funktioniert die Texturierung einwandfrei )
Zweiter Versuch: Variablen für die Methoden angelegt, und die Pointer aus der Renderunit daraufgelegt. Gibt auch keinen Fehler, aber Objekte bleiben weiterhin weiß.
Das ganze stellt für mich gerade ein ziemliges Rätsel dar =) Hab nochmal ein wenig nachgeforscht und auch bei der ersten Methode, also einfach die DGLOpenGl.pas einzubinden und die Methoden zu verwenden, stimmen die Methodenpointer in Renderunit und Listenunit überein.
Erstaunlich dabei ist aber auch, dass glGenTextures einen gültigen Index rauswirft. Bei den anderen Methoden ist schwer nachvollziehbar welche der beiden jetzt funktioniert und welche nicht.
Meine Frage eben, ob ich da gerade irgend einen Denkfehler mache.. und ob einer ne Idee hat, wie man dieses Problem beheben könnte.
Das Problem ist ja, dass wenn ich die Methode um die Textur in den Grafikspeicher einzulesen aus der Renderunit aufrufe, dass einwandfrei funktioniert.
Rufe ich die gleiche Methode in der Listenunit auf, wird die Textur nicht eingelesen.
Obwohl beide Units auf die gleichen GL-Methode(identischer Methodenzeiger) zugreifen
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich kann mir nicht vorstellen, dass es etwas mit der Unit zu tun hat. Du kannst die dglOpenGL.pas in Unit 1 initialisieren und in Unit 2 verwenden. Die Adressen der Methoden sind ja in Varialen der Unit gespiehert und somit gleich.
Ich kann mir nur vorstellen, dass es etwas mit der Reihenfolge oder so nicht hinhaut. Du brauchst aber in keinem Fall die Pointer der Methoden zu kopieren. Das ist nicht nötig.
Sonst muss ich aber passen. Ich habe nicht so ganz verstanden was du genau gemacht hast bzw kann ich so auch nicht abschätzen wo das Problem mit den weißen Texturen herkommt / hingeht.
Richtig vorstellen kann ich mir das ganze auch nicht. Die Methoden in Variablen zu kopieren war ja nur ein versuch um rauszufinden, ob die Pointer der GL-Methoden in beiden Units gleich sind. Und das sind sie ja.
Deswegen ist es ja gerade so unsinnig, dass der Aufruf in einer Unit funktioniert, in der anderen aber nicht
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Du solltest in jedem Fall einen Filtermodus setzen. Denn laut Wiki ist die Voreinstellung für den MinFilter GL_NEAREST_MIPMAP_LINEAR. Und der setzt MipMaps vorraus. Da du aber keine MipMaps erzeugst wird die Textur nicht dargestellt.
Sollte das keine Änderung bringen dann solltest du uns etwas mehr Code zur Verfügung stellen oder mal komplett hochladen. Falls es nicht zu groß ist.
PS: Folgendes sollte auch gehen. Das macht den Code etwas kleiner/einfacher. Durch die Klammern würde die Adresse des gesammten Ausdruckes (die Variables des Records) zurückgeliefert werden.
Also die Filter hatte ich bereits alle gesetzt. Die Texturen werden auf jedenfall nach der Initialisierung geladen.
Der Rendervorgang funktioniert ja auch. Die Methode zum Einlesen der Textur ist an keine Klasse gebunden, deswegen dürfte mehr Quellcode auch nicht weiterhelfen. Ich bin mir auch relativ sicher, dass es kein Fehler ist, der durch falsche Parameter im OGL entstanden ist.
Das Problem ist ja, dass wenn die Methode in Unit a (der Renderunit) steht das ganze funktioniert, steht sie in Unit b (der ListenUnit) funktioniert es nichtmehr. Dabei ist ganz egal aus welcher Unit dann ein Aufruf kommt.
Fragwürdig
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Lass es mich vorsichtig ausdrücken. Du bist der Erste bei dem das nicht funktioniert. In meinem Texturenloader benutze ich die dglOpenGL ja auch aus einer anderen Unit herraus. Und bisher ist mir noch niemand aufs Dach gestiegen, weil es nicht funktionieren würde.
Wobei ich Delphi 2007 auch nicht kenne. Aber ich kann mir nicht vorstellen, dass die seit Turbo Delphi etwas geändert haben. Was sich ja dann eigentlich nicht nur da auswirken würden.
Und sonst können wir für dich nicht mehr tun als das was wir bisher zusammengeraten haben. Ich weiß aber Eines. Es gibt vieles was durch Seiteneffekte ausgelöst wird die nicht unbedingt immer offensichtlich sind. Also ohne mehr Code wird dir niemand helfen können. Wobei mehr Code nicht immer eine Garant dafür ist, dass man auch den Fehler findet. Aber unsere Trefferquote ist recht hoch.
Keine Angst zur Vorsicht =)
Aber ist ja auch nicht so, dass ich seit gestern erst Programmier Defacto verdiene ich damit mein Geld.
Und ich würd ja auch nicht fragen, wenn es nicht ein total unerklärlicher Fehler wäre Und ob Delphi 2007 oder Turbo Delphi spielt in dem Falle keine Rolle. Das funktioniert bei beiden Versionen nicht.
Mein einziger Ansatz ist eben, dass die beiden Builds Aufgaben in verschiedene Threads aufteilen.
Sprich, vergleicht man eine compilierte Version des Programms aus Delphi 7 mit einer aus Turbo Delphi oder Delphi 2007 so erkennt man, dass statt einem Thread eben 3-4 vorhanden sind. Aber da der Aufruf immer von der gleichen Stelle kommt, also der gleiche Prozessstrang verwendet wird, ist das eben ein wenig sinnfrei =)
Ich kann aber wohl die Tage nochmal ein weniger mehr Code posten, wenn du wirklich der Meinung bist, dass das was bringen könnte
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Threads? Hast du irgendetwas von OpenGL in einen anderen Thread ausgelagert? Wenn ja dann weiß ich wo dein Problem liegt. OpenGL ist Threadgebunden. Du darfst es also nur in einem Thread benutzen. Das Laden von Daten kannst du auslagern aber nicht das Erstellen der Textur.
Anderenfalls denke ich schon, dass mir etwas etwas Code helfen würde.
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.