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

Aktuelle Zeit: Fr Jul 18, 2025 21:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Mai 17, 2007 17:30 
Offline
DGL Member

Registriert: Mi Mai 16, 2007 14:53
Beiträge: 6
Hi,

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. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 17, 2007 17:58 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Es ist denkbar, dass die Texture noch nicht mit glEnable(GL_TEXTURE_2D) eingeschaltet wurde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 17, 2007 18:23 
Offline
DGL Member

Registriert: Mi Mai 16, 2007 14:53
Beiträge: 6
=) Ja wäre denkbar. Aber das ist aktiv.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 17, 2007 18:56 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 17, 2007 19:07 
Offline
DGL Member

Registriert: Mi Mai 16, 2007 14:53
Beiträge: 6
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 :?:


Code:
  1.  
  2.   type TTextMap = record
  3.     textureP  : Pointer;
  4.     Path      : String;
  5.     Width     : Word;
  6.     Height    : Word;
  7.     glMemIndex: Integer;
  8.   end;
  9.  
  10. function LoadToGLMem(texture : PTextMap): Boolean;
  11. var
  12.   i: Integer;
  13. begin
  14.   glGenTextures(1,@i);
  15.   texture^.glMemIndex := i;
  16.   glBindTexture(GL_TEXTURE_2D,texture^.glMemIndex);
  17.   glTexImage2D(GL_TEXTURE_2D, 0, 3, texture^.Width, texture^.Height,0, GL_RGB, GL_UNSIGNED_BYTE,texture^.textureP);
  18. end;
  19.  



Das ist der Code den ich zum Einlesen benutze.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 17, 2007 20:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 20, 2006 17:34
Beiträge: 52
Kann es sein, dass die Texturen vllt einfach vor der Ogl-Initialisierung geladen werden?

_________________
2+2=5
For extremely large values of two


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 17, 2007 21:46 
Offline
DGL Member
Benutzeravatar

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.
Code:
  1.   glBindTexture(GL_TEXTURE_2D,texture^.glMemIndex);
  2.  
  3.   glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  4.   glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  5.  
  6.   glTexImage2D(GL_TEXTURE_2D, 0, 3, texture^.Width, texture^.Height,0, GL_RGB, GL_UNSIGNED_BYTE,texture^.textureP);


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.
Code:
  1. glGenTextures(1,@(texture^.glMemIndex));


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 21, 2007 22:54 
Offline
DGL Member

Registriert: Mi Mai 16, 2007 14:53
Beiträge: 6
Danke schonmal für die Antworten.

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 ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 22, 2007 07:57 
Offline
DGL Member
Benutzeravatar

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. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 23, 2007 22:16 
Offline
DGL Member

Registriert: Mi Mai 16, 2007 14:53
Beiträge: 6
Keine Angst zur Vorsicht =)
Aber ist ja auch nicht so, dass ich seit gestern erst Programmier :D Defacto verdiene ich damit mein Geld.
Und ich würd ja auch nicht fragen, wenn es nicht ein total unerklärlicher Fehler wäre :D
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 ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 23, 2007 22:59 
Offline
DGL Member
Benutzeravatar

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. ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mai 24, 2007 15:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mai 23, 2007 10:56
Beiträge: 6
Wohnort: Braunschweig
Theoretisch ist es zwar möglich, dass mehrere Threads OpenGL nutzen.
Aber: lass es sein. Es bringt Dich direkt in die Hölle.

Viel einfacher ist es, einen "OpenGL-Thread" zu haben, dem die anderen
Threads dann sagen, was er tun soll (z.B. durch Windows-Botschaften).

Viele Grüße, Martin


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 27, 2007 14:23 
Offline
DGL Member

Registriert: Mi Mai 16, 2007 14:53
Beiträge: 6
*lach*
Nee keine Angst. Ich hab nichts in Threads ausgelagert. Aber die kompilierte Anwendung aus Delphi 2007 nutzt 4 statt einem Thread.

Aber das spielt im Endeffekt ja keine Rolle hab ich mir überlegt, da der Aufruf ja aus dem gleichen Prozessstrang kommt.

Nagut, dann werd ich später ein wenig Code posten ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]