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

Aktuelle Zeit: Do Mär 28, 2024 21:53

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



Ein neues Thema erstellen Auf das Thema antworten  [ 46 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: .Net OpenGL Header für Delphi 2005
BeitragVerfasst: Di Apr 19, 2005 22:09 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Änderungen:
1) Die Warnungen wurden korrigiert. (20.04.05)
2) $IF und $ALIGN Compiler Befehler wurden an Delphi <6 angepaßt. (20.04.05 23:00)
3) Wrapper Funktionen werden ab Delphi 2005 mittels inline direkt eingefügt (21.04.05 00:15)
4) Funktioniert auch wieder mit FP und Linux
5) CreateShaderObjectARB korrigiert (01.05.05)

Der DGL Header unterstützt jetzt auch .Net 1.1 . Dafür waren eine Menge Änderungen notwendig und deshalb handelt es sich um eine Beta Version. Fehler bitte hier posten, damit sie korrigiert werden können.
Ich bitte den Header auch unter Win32 und insbesondere unter Linux zu testen, damit sichergestellt werden kann, dass er auf diesen Plattformen auch noch funktioniert.

Beim Header und insbesondere beim Laden der Extensions hat sich einiges geändert.

1) InitOpenGL braucht nicht immer aufgerufen zu werden. CreateRenderingContext ruft jetzt automatisch InitOpenGL auf, so daß es keinen Fehler mehr gibt, falls man dies vergessen hat.

2) ActivateRenderingContext hat jetzt einen zweiten default Parameter, der standardmäßig auf true steht und angibt, ob alle Funktionen geladen werden sollen. Unter .Net dauert das Laden aller Extensions mehrere Sekunden und daher stellt man ihn dann besser auf false. Die Punkte 3) und 4) betreffen nur diesen Fall.

3) Alle Extensions haben jetzt eine extra Read_ExtensionName Funktion mit der die Extensions einzeln geladen werden können, falls man sie nicht alle beim Start lädt.

4) Es gibt für jede Funktion außer denen, die schon in InitOpenGL geladen werden, einen speziellen Stub, der die Funktion beim ersten Aufruf lädt. Falls man also ActivateRenderingContext mit false benutzt und die Extension nicht einzeln lädt, wird die Funktion beim ersten Aufruf initialisiert. Dies ist der empfohlene Weg unter .Net.

Code:
  1. glCreateRenderingContext(...)
  2. glActivateRenderingContext(...,false)


Der Rest funktioniert automatisch und falls die Funktion vorhanden ist, gibt es auch bei nicht initialisierten Zeigern jetzt keine Exception mehr.

5) Unter .Net gibt es ja keine Zeiger in dem Sinne wie gewohnt und deshalb ändern sich einige Parameter. Die meisten Zeiger wurden in Arrays umgesetzt. So erwartet glVertex3fv jetzt ein Array von 3 oder mehr Single Variablen.
Für kompliziertere Fällen wurden spezielle Wrapper Funktionen eingeführt. So akzeptiert glTexImage2D jetzt direkt ein System.Drawing.Bitmap, einen Stream oder einen String mit einem Dateinamen. In den beiden letzten Fällen können so ohne viel Aufwand bmp,jpg,tif,gif und png Dateien geladen werden.
glReadPixels gibt übrigens auf Wunsch direkt ein Bitmap zurück.

Code:
  1. var
  2.  textures:array of cardinal;
  3. begin
  4.   glGenTextures(1,textures);
  5.   glBindTexture(GL_TEXTURE_2D, textures[0]);
  6.   glEnable(GL_TEXTURE_2D);
  7.   glTexParameteri(gl_texture_2d, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
  8.   glTexParameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  9.   glTexParameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  10.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, \"test.png\");
  11. end;


Liste aller Überladungen:
Code:
  1. procedure glTexImage2D(target: TGLenum; level: TGLint; internalformat: TGLint; width: TGLsizei; height: TGLsizei; border: TGLint; format: TGLenum; _type: TGLenum; const pixels: System.array); overload;
  2. procedure glTexImage2D(target: TGLenum; level: TGLint; internalformat: TGLint; border: TGLint; bmp: Bitmap); overload;
  3. procedure glTexImage2D(target: TGLenum; level: TGLint; internalformat: TGLint; border: TGLint; st: Stream); overload;
  4. procedure glTexImage2D(target: TGLenum; level: TGLint; internalformat: TGLint; border: TGLint; filename: string); overload;
  5. function glGenTextures(n: TGLsizei): PGLuInt; overload;
  6. function glGenTexture(): GLuInt; overload;
  7. function glGenTexture(bmp: Bitmap): GLuInt; overload;
  8. function glGenTexture(st: Stream): GLuInt; overload;
  9. function glGenTexture(filename: string): GLuInt; overload;
  10. procedure glVertexPointer(size: TGLint; _type: TGLenum; stride: TGLsizei; const _pointer: System.array); overload;
  11. procedure glColorPointer(size: TGLint; _type: TGLenum; stride: TGLsizei; const _pointer: System.array); overload;
  12. procedure glTexCoordPointer(size: TGLint; _type: TGLenum; stride: TGLsizei; const _pointer: System.array); overload;
  13. procedure glNormalPointer(_type: TGLenum; stride: TGLsizei; const _pointer: System.array); overload;
  14. procedure glVertexAttribPointerARB(index: TGLuint; size: TGLint; _type: TGLenum; normalized: TGLboolean; stride: TGLsizei; const _pointer: System.array); overload;
  15. procedure glVertexPointer(size: TGLint; _type: TGLenum; stride: TGLsizei; const _pointer: Integer); overload;
  16. procedure glColorPointer(size: TGLint; _type: TGLenum; stride: TGLsizei; const _pointer: Integer); overload;
  17. procedure glTexCoordPointer(size: TGLint; _type: TGLenum; stride: TGLsizei; const _pointer: Integer); overload;
  18. procedure glNormalPointer(_type: TGLenum; stride: TGLsizei; const _pointer: Integer); overload;
  19. procedure glVertexAttribPointerARB(index: TGLuint; size: TGLint; _type: TGLenum; normalized: TGLboolean; stride: TGLsizei; const _pointer: Integer); overload;
  20. procedure glReadPixels(x: TGLint; y: TGLint; width: TGLsizei; height: TGLsizei; format: TGLenum; _type: TGLenum; pixels: System.array); overload;
  21. function glReadPixels(x: TGLint; y: TGLint; width: TGLsizei; height: TGLsizei): Bitmap; overload;
  22. function glGetString(name: TGLenum): string;
  23. function gluGetString(name: TGLenum): string;
  24. function wglGetExtensionsStringEXT: string;
  25. function wglGetExtensionsStringARB(dc: HDC): string;
  26. function glCreateShaderObjectARB(shaderType: glenum): GLHandleARB; overload;
  27. function glCreateShaderObjectARB(shaderType: glenum; source: string): GLHandleARB; overload;
  28. procedure glShaderSourceARB(shaderObj: GLHandleARB; count: glsizei; _string: array of string; lengths: pglint); overload;
  29. procedure glShaderSourceARB(shaderObj: GLHandleARB; source: string); overload;
  30. procedure glGetInfoLogARB(shaderObj: GLHandleARB; maxLength: glsizei; var length: glint; infoLog: StringBuilder); overload;
  31. function glGetInfoLogARB(shaderObj: GLHandleARB): string; overload;
  32. procedure glBufferDataARB(target: TGLenum; size: TGLsizei; data: System.array; usage: TGLenum); overload;
  33. procedure glBufferSubDataARB(target: TGLenum; offset: TGLsizei; size: TGLsizei; data: System.array); overload;
  34. procedure glBufferData(target: TGLenum; size: TGLsizei; data: System.array; usage: TGLenum); overload;
  35. procedure glBufferSubData(target: TGLenum; offset: TGLsizei; size: TGLsizei; data: System.array); overload;


Im Anhang findet sich der Header und ein Windows.Forms Template.


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


Zuletzt geändert von LarsMiddendorf am So Mai 01, 2005 10:38, insgesamt 9-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 20, 2005 10:33 
Offline
DGL Member

Registriert: So Nov 16, 2003 14:37
Beiträge: 37
Hab mir den Header und das Template mal angesehn und muss sagen dass das sehr gut aussieht. Mir gefällt vor allem das der Init-Code so stark verkürzt wurde. Mir fehlen leider (noch) die OpenGL-Kenntnisse um den Header voll auszunutzen, er sieht aber recht bugfrei aus (Delphi spuckt nur ein paar Warnungen aus, aber ich denke das das bei dir auch der Fall sein wird).

Jedenfalls echt super und weiter so!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 20, 2005 21:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Offenbar kommt Delphi 5 mit vielen Compiler-Anweisungen nicht zurecht(besonders IF):
Zitat:
[Fehler] DGLOpenGL.pas(131): Ungültige Compileranweisung: '$A4,H+,O+,X+'
[Fehler] DGLOpenGL.pas(5679): Ungültige Compileranweisung: 'IF'
[Fehler] DGLOpenGL.pas(5706): Ungültige Compileranweisung: 'IFEND'
[Fehler] DGLOpenGL.pas(5708): Ungültige Compileranweisung: 'IF'
[Fehler] DGLOpenGL.pas(5829): Ungültige Compileranweisung: 'IFEND'
[Fehler] DGLOpenGL.pas(7449): Ungültige Compileranweisung: 'IF'
[Fehler] DGLOpenGL.pas(7451): Ungültige Compileranweisung: '$ELSE'
[Fehler] DGLOpenGL.pas(7452): Deklaration von 'InitOpenGL' unterscheidet sich von vorheriger Deklaration
[Fehler] DGLOpenGL.pas(7453): Ungültige Compileranweisung: 'IFEND'
[Fehler] DGLOpenGL.pas(7454): Bezeichner redefiniert: 'InitOpenGL'
[Fehler] DGLOpenGL.pas(7456): Ungültige Compileranweisung: 'IF'
[Fehler] DGLOpenGL.pas(7464): Ungültige Compileranweisung: 'IFEND'
[Fehler] DGLOpenGL.pas(8325): Ungültige Compileranweisung: 'IF'
[Fehler] DGLOpenGL.pas(8353): Ungültige Compileranweisung: 'IFEND'
[Fehler] DGLOpenGL.pas(10463): Ungültige Compileranweisung: 'IF'
[Fehler] DGLOpenGL.pas(10484): Ungültige Compileranweisung: 'IFEND'
[Fehler] DGLOpenGL.pas(10601): Ungültige Compileranweisung: 'IF'
[Fehler] DGLOpenGL.pas(10610): Ungültige Compileranweisung: 'IFEND'
[Fehler] DGLOpenGL.pas(10945): Ungültige Compileranweisung: 'IF'
[Fehler] DGLOpenGL.pas(11059): Ungültige Compileranweisung: 'IFEND'
[Fataler Fehler] Template_SDL.dpr(101): Verwendete Unit 'DGLOpenGL.pas' kann nicht compiliert werden

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 20, 2005 21:32 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Der Code ist auch für Delphi2005!!

Und mir gefällt er bisher, Probiere ihn Morgen mal aus!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 20, 2005 21:36 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Sehe gerade, dass Delphi5 noch keine {$IF} Compiler Anweisung kennt und $A gibt es wohl auch erst ab Delphi 6.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 20, 2005 21:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
So ich habe die DGLOpenGL an Delphi 5 angepasst. Die einzigste wirkliche Änderung bestand in der Ersetzung von $A4 durch $A+. Da Delphi 5 $A4 noch nicht kennt.

Ansonsten habe ich einfach die {$IF ..} Blöcke durch ein Eqivalent von {$IFDEF ..} Blöcken ersetzt.

MfG
Flo


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

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 20, 2005 21:51 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Da hat sich das wohl überschnitten. Habe den Beitrag erst gesehen (und später nochmal editiert), nachdem ich die neue Version im ersten Post aktualisiert hatte, sonst hätte deine Version genommen. Das $A4 habe ich aber für Versionen ab Delphi 6 dringelassen. Ob es was ausmacht weiß ich nicht. Sicher ist sicher.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 20, 2005 23:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die Wrapper werden jetzt mit inline deklariert, so daß der Funktionsaufruf eventuell ein wenig schneller ist, auch wenn es alles keine zeitkritischen Funktionen sind.

Noch ein weiterer Hinweis:
Wie schon oben beschrieben werden ja Zeiger unter .Net als Arrays angesehen. Das kann man gut ausnutzen, indem man sich für seine Vektor Klasse einen impliziten Operator deklariert, der den Vektor in ein Array konvertiert. Dann kann man z.B. bei glVertex3fv direkt seinen Vector angeben.

Code:
  1.  
  2. TVector = record
  3. ...
  4. class operator implicit(v:TVector):PGLfloat;
  5. ...
  6. end;
  7.  
  8.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 28, 2005 12:54 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Kleine Frage:

Wie kann ich OpenGL Initialisieren in .net ohne WinForms oder die VCL zu benutzen?
Grund dafür ist die Grundstruktur die mein Programm hat und die ich sehr ungerne zunichte mache!

Edit: Nein! Die initialisierung aus dem Tut funzt nicht mehr!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 28, 2005 16:43 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Warum soll diese Initialisierung nicht mehr funktionieren? Du mußt dann halt nur die entsprechenden Windows API Funktionen und Records selber deklarieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 28, 2005 16:48 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
LarsMiddendorf hat geschrieben:
Warum soll diese Initialisierung nicht mehr funktionieren? Du mußt dann halt nur die entsprechenden Windows API Funktionen und Records selber deklarieren.


Die WinAPI wollte ich eigentlich nicht verwenden, naja dann muss wohl doch WinForms her!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 28, 2005 18:23 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Eine tolle Leistung. Respekt. -21,413.00 Lines of code

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 28, 2005 21:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
sniper_w hat geschrieben:
Eine tolle Leistung. Respekt. -21,413.00 Lines of code
:| Wer?Was?Warum?He!?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 30, 2005 14:50 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Der Header hat mittlerweile eine solche Größe erreicht. Das meiste sind die STUB's, die die entsprechende Funktion beim ersten Aufruf laden. Für .Net 1.1 notwendig, weil das gesamte Laden sonst zu lange dauern würde und beim Rest schadet es nicht.
Natürlich ist das alle nicht per Hand geschrieben, sondern generiert. Das betrifft sowohl die .Net Erweiterungen wie auch den normalen Header. Das wäre ja ansonsten auch eine extrem langweilige Arbeit.

Diese Version funktioniert noch nicht wieder mit Linux und FP, aber Phobeus hat das schon entsprechend angepaßt und wenn es dann bezüglich .Net/Win32 keine Korrekturen mehr gibt, wird das dann zusammengefaßt und als Version 1.9 offiziell veröffentlicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 01, 2005 08:01 
Offline
DGL Member

Registriert: Do Mai 13, 2004 16:36
Beiträge: 116
Wohnort: Deutsch-Wagram (Österreich)
Hier mein Feedback:

1.) .net:
Keine Probleme!

2.) Win32:
glCreateShaderObjectARB funktioniert nicht.

Ich verwende die Delphi 2005 PE.

_________________
Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 46 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 26 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.070s | 19 Queries | GZIP : On ]