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

Aktuelle Zeit: Di Jul 15, 2025 14:48

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Jun 18, 2004 13:54 
Offline
DGL Member

Registriert: Do Mai 13, 2004 14:52
Beiträge: 10
Hi!

Ich programmiere gerade ein Visualisierungs-Modul auf OpenGL-Basis mit folgenden Pflichtpunkten:

o Muss auf mgl. jedem Windows-Rechner laufen
o Muss Off-Screen rendern können (Zum Ausdruck)
o Objekt soll mit der Maus ruckelfrei dreh- und skalierbar sein
o Soll in ein Panel o.ä. rendern

Nachdem ich mit der MS-Software-Library keine guten Erfahrungen gesammelt habe (Darstellungsfehler) will ich jetzt auf MESA (http://mesa3d.sourceforge.net/) setzen. Dazu habe ich mir von SourceForge (http://sourceforge.net/project/showfiles.php?group_id=3&package_id=27802)
die MesaWinBinaries runtergeladen.

Auf anraten von Mars hab ich also OpenGL mit der dglOpenGL-Unit initialisiert und einfach die Mesa-Library OpenGL32.dll ins Prokjekt-Verzeichnis geschmissen. Das Resultat ist die Fehlermeldung "Ein Aufruf einer Betriebssystemfunktion ist fehlgeschlagen" -> AcessViolation at 00000000. Der Fehler tritt beim Erstellen des Rendering-Contextes auf. Also hab ich flugs das dglOpenGL-Template runtergeladen, die mesa-DLL da reingeschmissen und: selber Fehler.

Da meine Internet-Recherche nichts ergeben hat frag ich einfach mal:

Gibt es irgendwo ein Delphi-Grundgerüst oder Tut das die Initialisierung von OpenGL mit Mesa erklärt ?

Am coolsten wär das Ganze wenn es einen Wechsel zwischen Hardware-beschleunigtem OpenGL und Software-MESA-Rendering bieten würde!

Kann mir da irgendwer helfen ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 18, 2004 16:10 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Verwende einfach die OpenGL.pas von BaseGraph anstelle dglOpenGL. - du kannst aber auch dglOpenGL entsprechend umbasteln - im dglOpenGL Thread hatte ich mal Folgendes geschrieben:
Zitat:
Ich schicke dir die geänderte Unit gleich mit, ich hab's schon ausprobiert, und bei mir funktioniert es sowohl mit den Standard OpenGL Treibern als auch mit MesaGL (Bei MesaGL muss man noch Get/Set/Choose/DescribePixelFormat durch Zeiger auf wglGet/Set/Choose/DescribePixelFormat ersetzen - das ist aber MesaGL spezifisch, dafür kann dglOpenGL nichts).

"Meine" OpenGL Unit schaut automatisch nach, welche Routinen es überhaupt gibt, und setzt die Zeiger entsprechend (weswegen es auch egal ist, ob bestimmte Funktionen nun als Core oder Extensions vorhanden sind - die Schnittstelle bleibt immer gleich) - dglOpenGL ist hier etwas strenger, sodass du die wgl Routinen selbst laden und nutzen musst. Leider funktioniert die Methode einfach die Mesa Bibliothek ins Projektverzeichnis zu kopieren, nur mit der BaseGraph OpenGL Unit.
Leider ist der Webspace mit einem entsprechenden Demoprogramm bereits den Weg alles Irdischen gegangen. Mit viel Glück hat Phobeus vielleicht noch die Datei opengl15_vcl_template.zip gesichert, die es mal unter auf mcad.delphigl.com zum runterladen gab (hier nutzte ich dglOPenGL in Verbindung mit Mesa).

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Offscreen rendern mit Mesa
BeitragVerfasst: Mi Jun 30, 2004 14:42 
Offline
DGL Member

Registriert: Do Mai 13, 2004 14:52
Beiträge: 10
Erst mal schönen Dank an Mars. Mit der BaseGraph-Unit hat es dann auch geklappt.
Ich kann jetzt zur Laufzeit zwischen dem Standard-OpenGL-Treiber und Mesa wechseln.

Allerdings brauch ich jetzt noch mal Hilfe mit dem Offscreen-Rendern mit Mesa.

Soweit ich weiß brauch ich dafür die Mesa-Befehle OSMesaCreateContext(), OSMesaMakeCurrent(), and OSMesaDestroyContext().

Muss ich dafür die OSMESA32.DLL laden oder sind die auch in der Mesa-OpenGL32.DLL enthalten ?
Die OSMESA32.DLL konnte ich nämlich auch mit der BaseGraph-Unit nicht laden.

Oder gibt es da einen einfacheren Weg ?

Schade dass es zu Mesa so wenig doku gibt. Kann mir da jemand helfen ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 17:29 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Du kannst entweder vor dem Aufruf InitOpenGL die Variablen SGL bzw. SGLU auf die Namen der OpenGL DLLs setzen, die du verwenden möchtest, oder du verwendest direkt InitOpenGLFromLibrary, wo du die zu verwendenden DLLs als Parameter angeben kannst (ich verwende zwecks Delphi 2 und 3 Kompatibilität keine überladenen Routinen - in Endeffekt finde ich solchen Code übrigens auch lesbarer).

Wenn du OSMesa verwendest, wirst du das Problem haben, dass du

a) eine entsprechende DLL erstellen muss (z.B. mit dem MingW GCC), oder du musst dir eine solche organisieren

b) eventuell keine zugehörige GLU findest (ich habe OSMESA selbst nicht verwendet, da ich in Bitmaps rendere, wenn ich "Offscreen OpenGL" haben möchte. Immerhin unterstützt die OpenGL Unit von BaseGraph eine OpenGL Implementation ohne GLU, wenn sie mit dem Kompilerschalter NO_GLU erstellt wird. In diesem Fall hat InitOpenGL nur einen Parameter, und folgendes Subset an GLU Routinen (mit denen BaseGraph selbst auskommen kann) wird direkt als Pascal Code ausprogrammiert:
Code:
  1. procedure gluLookAt(eyex, eyey, eyez,  centerx, centery, centerz,  upx, upy, upz: GLDouble);
  2. procedure gluPerspective(fovy, aspect, zNear, zFar: GLdouble);
  3. procedure gluPickMatrix(x, y, width, height: GLdouble; viewport: TVector4i);
  4. function gluProject(objx, objy, objz: GLdouble; modelMatrix, projMatrix: TMatrix4d; viewport: TVector4i;
  5.                     winx, winy, winz: PGLdouble): GLint;
  6. function gluUnProject(winx, winy, winz: GLdouble; modelMatrix, projMatrix: TMatrix4d; viewport: TVector4i;
  7.                       objx, objy, objz: PGLdouble): GLint;


c) du eigene Routinen schreiben musst, welche die Funktion von
Code:
  1. procedure ActivateRenderingContext(DC: HDC; RC: HGLRC);
  2. function CreateRenderingContext(DC: HDC; PixelFormat: Integer; var PFDescriptor: TPixelFormatDescriptor): HGLRC;

übernehmen, da OSMESA logischerweise mit Devicekontexten nichts anfangen kann

d) du dich selbst über die Bereitstellung von Speicher für das gerenderte Bild kümmern musst, da OSMESA einfach in einen großen Speicherbereich hineinrendert, den du dann selbst als "Bitmap" interpretieren musst. Der Vorteil ist natürlich, dass OSMESA überhaupt keine Anforderungen an das Betriebssystem stellt, und somit auf dem kränksten embedded System zum Laufen zu bekommen ist. Nachdem du mit Delphi aber ohnehin nur unter Windows und Linux programmieren wirst, halst du dir eventuell damit überflüssige Arbeit auf. Immerhin ist OSMESA aber die einzige Möglichkeit ein Pixelformate zu erhalten, in denen jedes Pixel z.B. durch vier Double Werte repräsentiert wird - das kann meines Wissens noch keine Grafikkarte.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 01, 2004 10:53 
Offline
DGL Member

Registriert: Do Mai 13, 2004 14:52
Beiträge: 10
Ich hab die vorkompilierten Units "OpenGL32.DLL" und "GLU32.DLL" von der Mesa-SourceForge-Seite. Wenn ich die mit InitOpenGLFromLibrary() lade wird Mesa als Renderer angegeben. Soweit so gut.

Versuche ich dann in einen DC von einem TBitmap zu Rendern erhalte ich beim Aufruf von wglCreateContext(DC) in der Funktion CreateRenderingContext() einen EOSError (Aufruf einer Betriebssystemfunktion fehlgeschlagen). Da das ganze beim Aufruf mit den Standard-OpenGL-Treibern klappt liegt das vermutlich an Mesa. Da ich mir nicht 100% sicher bin: Kann Mesa in ein Bitmap rendern oder nicht ?
Zitat:
ich habe OSMESA selbst nicht verwendet, da ich in Bitmaps rendere, wenn ich "Offscreen OpenGL" haben möchte

Mein Problem mit der MS-Implementierung ist nämlich eine fehlerhafte Darstellung, die bei den Mesa-Treibern nicht auftritt. Daher setze ich auf Mesa.

Um also jetzt Mesa zum Offscreen-Rendern zu verwenden:

a) Ich lade die Mesa-DLLs OPENGL32 und GLU32

b) Anstelle von ActivateRenderingContext() und CreateRenderingContext() muss ich
OSMesaCreateContext() und OSMesaMakeCurrent() aus der OSMESA32.DLL verwenden. (?)

c) Aus den Daten im MesaContext-Speicherbereich erstelle ich mir dann ein Bitmap.

Punt b macht zur Zeit noch Probleme. Punkt c bekomm ich hin.
Und zwar hapert es noch am Aufruf von OSMesaMakeCurrent(). Wärest du bereit dir das mal anzugucken wenn ich das bis Ende der Woche nicht hinkriege ? Wäre ja vielleicht auch für andere interessant.

<EDIT>
Juhu! Hab das ganze ans Laufen gebracht! Werd noch den Code aufräumen und ihn dann mal posten.
</EDIT>

Vielen Dank auf jeden Fall für deine Tips!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 02, 2004 10:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Mesa selbst kann auch nicht in Bitmaps rendern, die Microsoft Treiber hingegen schon. Dafür stellt Mesa eben OSMesa zur Verfügung, das unabhängig vom Betriebssystem ist (Bitmaps unter Windows sind ja ebenfalls betriebssystemspezifische Devicekontexte).

Ich habe grad ebenfalls die BaseGraph OpenGL Unit so umgeschrieben, dass OSMesa per Kompilerschalter direkt unterstützt wird - ich lad das Beispielprojekt, das einfach eine Szene in ein Bitmap rendert und dieses in einem Fenster darstellt, mal hoch, auch wenn du es gar nicht mehr brauchst :wink: (die MESA Dateien OpenGL32.dll, Glu32.dll und OSMesa32.dll müssen ins Projektverzeichnis kopiert werden).


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

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: BaseGraph-OpenGl-Unit
BeitragVerfasst: Fr Jul 02, 2004 11:24 
Offline
DGL Member

Registriert: Do Mai 13, 2004 14:52
Beiträge: 10
Ay! Wie ich seh hatt ich wohl nicht die neuste BaseGraph-OpenGL-Unit verwendet!
Mir ist wohl noch was aufgefallen:
Es scheint so als ob die OSMesa-Library in der neuen BaseGraph-Unit nicht wieder freigegeben wird (CloseOpenGL) ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 02, 2004 11:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Stimmt, danke für den Hinweis, wird gefixt - ich habe die Änderungen erst heute vormittag eingebaut, du "konntest" also gar keine neuere Version haben.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Mein Sample
BeitragVerfasst: Di Jul 06, 2004 12:02 
Offline
DGL Member

Registriert: Do Mai 13, 2004 14:52
Beiträge: 10
So, hier ist nun mein kleines Beispielprogramm mit den Features die ich mir gewünscht habe (Umschalten des Renderers zur Laufzeit, Off-Screen-Rendern mit Mesa). Schaut's euch mal an. Ich hab jetzt meine für OSMesa angepasste schon ältere BaseGraph-OpenGL-Unit verwendet. Vielleicht kann ja einer was damit anfangen. Vielen Dank nochmal an Mars!

Übrigens sind die MesaWinBinaries jetzt nicht dabei. Die müssen noch in das MesaDLL-Unterverzeichnis kopiert werden (siehe info.txt).


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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 17 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.008s | 15 Queries | GZIP : On ]