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

Aktuelle Zeit: Sa Jul 12, 2025 15:47

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Ich würd ja gern aber nichts funzt
BeitragVerfasst: Fr Apr 06, 2007 00:45 
Offline
DGL Member

Registriert: Di Mär 27, 2007 18:47
Beiträge: 19
hi ich bin neu hier und wollte eigendlich mit openGL anfangen nachdem ich in delphi mein 3D Rennspiel weit gebracht habe und schliesslich an einem (anscheinen unlösbaren) problem mit der Z-Axe hängen blieb... wie auch immer... wo war ich?

achja :) also jedenfalls habe ich mir die ersten 3 Open GL tutorials sorgfältig durchgelesen
(http://wiki.delphigl.com/index.php/Tutorial_Quickstart , http://wiki.delphigl.com/index.php/Tutorial_Lektion_1 , http://wiki.delphigl.com/index.php/Tutorial_Lektion_2)
und alles gemacht was mir gesagt wurde aber irgendwie ist OpenGL ne ganz andere welt als "canvas" :D

mein ergebnis war dann am ende ein leeres fenster (man bin ich stolz auf mich) das genauso aussah wie wenn ich garnichts mache-also weiss und nichts drauf

hier is mien quellcode kine ahnung was da fehlt...



Code:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, dglOpenGL, ExtCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Timer1: TTimer;
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure FormResize(Sender: TObject);
  14.     procedure Timer1Timer(Sender: TObject);
  15.   private
  16.     { Private-Deklarationen }
  17.   public
  18.     { Public-Deklarationen }
  19.   end;
  20.  
  21. var
  22.   Form1: TForm1;
  23.   DC, RC:HDC;
  24.  
  25. implementation
  26.  
  27. {$R *.dfm}
  28.  
  29. procedure TForm1.FormCreate(Sender: TObject);
  30. begin
  31.   DC:=GetDC(Handle);
  32.   RC:=CreateRenderingContext(DC,          //Device Contest
  33.                              [opDoubleBuffered], //Optionen
  34.                              32,          //ColorBits
  35.                              24,          //ZBits
  36.                              0,           //StencilBits
  37.                              0,           //AccumBits
  38.                              0,           //AuxBuffers
  39.                              0);          //Layer
  40.   ActivateRenderingContext(DC, RC);
  41.  
  42.  
  43.  
  44.   glTranslatef(-1.5, 0,-6);
  45.   glBegin(GL_TRIANGLES);
  46.     glVertex3f(-1,-1, 0);
  47.     glVertex3f( 1,-1, 0);
  48.     glVertex3f( 0, 1, 0);
  49.   glEnd;
  50.   glColor3f(1,0,0);
  51. end;
  52.  
  53. procedure TForm1.FormResize(Sender: TObject);
  54. begin
  55. glViewport(0, 0, ClientWidth, ClientHeight);
  56. glMatrixMode(GL_PROJECTION);
  57. glLoadIdentity;
  58. gluPerspective(60, ClientWidth/ClientHeight, 0.1, 100);
  59. glMatrixMode(GL_MODELVIEW);
  60. end;
  61.  
  62. procedure TForm1.Timer1Timer(Sender: TObject);
  63. begin
  64. //Farbbuffer und Tiefenpuffer entleeren
  65. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  66. end;
  67.  
  68. end.
  69.  


// Edit Lossy: Code durch Pascaltags ersetzt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 06, 2007 01:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. So viel anders als eine Canvas ist das gar nicht. Du musst nur halt deine Canvas zu Begin einmal erstellen und diverse Einstellungen setzen damit die Richtige Darstellung erzielt wird.

Du hast in deinem Falle sofort nach dem Erstellen des RCs dein Dreieck gezeichnet. Anschließen löscht du aber den Inhalt des RCs.

Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   // Kontex erstellen
  4.   DC := GetDC(Handle);
  5.   RC := CreateRenderingContext(...);
  6.   ActivateRenderingContext(DC, RC);
  7.  
  8.   // Resize wird nicht automatisch aufgerufen deswegen muss
  9.   // das hier einmal per hand aufgerufen werden.
  10.   // Ansicht setzen
  11.   FormResize(Self);
  12.  
  13.   // Hier solltest du noch ein paar globale Einstellungen setzen.
  14.   glClearColor(0.4, 0.4, 0.4, 0.0);  // Löschfarbe
  15.   glClearDepth(1.0);  // Tiefenlöschwert
  16.   glEnable(GL_DEPTH_TEST);  // Tiefentest
  17.  
  18.   // Ich weiß nicht ob die Zeichenrichtung der Fläche stimm deswegen
  19.   // erst einmal Deaktivieren bis etwas sichtbar ist. Anschließend kann
  20.   // man das immer noch aktivieren.
  21.   // Backfaceculling deaktivieren
  22.   glDisable(GL_CULL_FACE);
  23. end;
  24.  
  25.  
  26. procedure TForm1.FormResize(Sender: TObject);
  27. begin
  28.   glViewport(0, 0, ClientWidth, ClientHeight);
  29.   glMatrixMode(GL_PROJECTION);
  30.   glLoadIdentity;
  31.  
  32.   // 1 als Near ist besser als 0.1
  33.   gluPerspective(60, ClientWidth/ClientHeight, 1, 100);
  34.   glMatrixMode(GL_MODELVIEW);
  35. end;
  36.  
  37.  
  38. procedure TForm1.Timer1Timer(Sender: TObject);
  39. begin
  40.   //Farbbuffer und Tiefenpuffer entleeren
  41.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  42.  
  43.   // Modelview zurücksetzen
  44.   glMatrixMode(GL_MODELVIEW);
  45.   glLoadIdentity;
  46.  
  47.   // Dinge zeichnen
  48.   glTranslatef(-1.5, 0, -6);
  49.  
  50.   // Farbe sollte vor dem Zeichnen gesetzt werden
  51.   glColor3f(1, 0, 0);
  52.   glBegin(GL_TRIANGLES);
  53.     glVertex3f(-1,-1, 0);
  54.     glVertex3f( 1,-1, 0);
  55.     glVertex3f( 0, 1, 0);
  56.   glEnd;
  57.  
  58.   // Dafür sorgen, dass das gezeichnete auch dargestellt wird.
  59.   // Den hinteren Buffer nach vorne holen
  60.   SwapBuffers(DC);
  61. end;


Ich habe den Code nicht getestet aber es besteht die Chance einer wagen Möglichkeit, dass wenigstens etwas davon funktioniert. In diesem Sinne. Es ist spät. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 06, 2007 07:16 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
ich empfehle generell ein Template von dieser Site zu benutzen, da die komplette OpenGL Implementierung darin vorhanden ist.

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 06, 2007 10:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich glaube, die gegenwärtigen Templates sind auf SDL eingestellt. Und ich erinnere mich daran, dass ich, als ich anfing, mir Beispiele anzuschauen, immer verwirrt war: Delphi-Programme, die nicht die VCL benutzen, wirken für einen VCL-ianer fremdartig.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 06, 2007 10:33 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Nein, wir haben ein sehr breites Sortiment an Templates für alle möglichen wiederkehrenden Szenarien und Header... lediglich die Tutorials werden auf etwas SDL nahem umgestellt, da uns dies die Portierung erleichtert und wer daran scheitert den Fenster-Code und OpenGL-Code voneinander zu unterscheiden, ohnehin seine Probleme haben wird.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 06, 2007 12:45 
Offline
DGL Member

Registriert: Di Mär 27, 2007 18:47
Beiträge: 19
Lossy eX hat geschrieben:
Na ja. So viel anders als eine Canvas ist das gar nicht. Du musst nur halt deine Canvas zu Begin einmal erstellen und diverse Einstellungen setzen damit die Richtige Darstellung erzielt wird.

Du hast in deinem Falle sofort nach dem Erstellen des RCs dein Dreieck gezeichnet. Anschließen löscht du aber den Inhalt des RCs.

Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   // Kontex erstellen
  4.   DC := GetDC(Handle);
  5.   RC := CreateRenderingContext(...);
  6.   ActivateRenderingContext(DC, RC);
  7.  
  8.   // Resize wird nicht automatisch aufgerufen deswegen muss
  9.   // das hier einmal per hand aufgerufen werden.
  10.   // Ansicht setzen
  11.   FormResize(Self);
  12.  
  13.   // Hier solltest du noch ein paar globale Einstellungen setzen.
  14.   glClearColor(0.4, 0.4, 0.4, 0.0);  // Löschfarbe
  15.   glClearDepth(1.0);  // Tiefenlöschwert
  16.   glEnable(GL_DEPTH_TEST);  // Tiefentest
  17.  
  18.   // Ich weiß nicht ob die Zeichenrichtung der Fläche stimm deswegen
  19.   // erst einmal Deaktivieren bis etwas sichtbar ist. Anschließend kann
  20.   // man das immer noch aktivieren.
  21.   // Backfaceculling deaktivieren
  22.   glDisable(GL_CULL_FACE);
  23. end;
  24.  
  25.  
  26. procedure TForm1.FormResize(Sender: TObject);
  27. begin
  28.   glViewport(0, 0, ClientWidth, ClientHeight);
  29.   glMatrixMode(GL_PROJECTION);
  30.   glLoadIdentity;
  31.  
  32.   // 1 als Near ist besser als 0.1
  33.   gluPerspective(60, ClientWidth/ClientHeight, 1, 100);
  34.   glMatrixMode(GL_MODELVIEW);
  35. end;
  36.  
  37.  
  38. procedure TForm1.Timer1Timer(Sender: TObject);
  39. begin
  40.   //Farbbuffer und Tiefenpuffer entleeren
  41.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  42.  
  43.   // Modelview zurücksetzen
  44.   glMatrixMode(GL_MODELVIEW);
  45.   glLoadIdentity;
  46.  
  47.   // Dinge zeichnen
  48.   glTranslatef(-1.5, 0, -6);
  49.  
  50.   // Farbe sollte vor dem Zeichnen gesetzt werden
  51.   glColor3f(1, 0, 0);
  52.   glBegin(GL_TRIANGLES);
  53.     glVertex3f(-1,-1, 0);
  54.     glVertex3f( 1,-1, 0);
  55.     glVertex3f( 0, 1, 0);
  56.   glEnd;
  57.  
  58.   // Dafür sorgen, dass das gezeichnete auch dargestellt wird.
  59.   // Den hinteren Buffer nach vorne holen
  60.   SwapBuffers(DC);
  61. end;


Ich habe den Code nicht getestet aber es besteht die Chance einer wagen Möglichkeit, dass wenigstens etwas davon funktioniert. In diesem Sinne. Es ist spät. ;)


Lol funktioniert ... ein rotes dreieck keine ahnung was ich da falsch gemacht hatte ich werd mir den code mal genauer anschaun...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 06, 2007 12:48 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
AndY92 hat geschrieben:
Lol funktioniert ... ein rotes dreieck keine ahnung was ich da falsch gemacht hatte ich werd mir den code mal genauer anschaun...


Naja, du hast die Farbe mit
Code:
  1. glColor3f(1, 0, 0);
auf rot gesetzt.
Die Werte werden dort per r,g,b angeben (1: volle Intensitivität, 0: nix)

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 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.010s | 16 Queries | GZIP : On ]