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

Aktuelle Zeit: Di Jul 08, 2025 18:58

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Aug 01, 2010 20:39 
Offline
DGL Member

Registriert: So Aug 01, 2010 17:29
Beiträge: 28
Hallo,
Habe vorgestern erst von OpenGL gehört.
Habs mir heut für Lazarus installiert.
Aber, wie kann ich das DelphiGL Touturial jetzt anwenden?

mfg Flix

P.S.Ich hab KEIN GLcene


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Aug 01, 2010 20:59 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Schau dir mal das Quickstart Tutorial an. Dort stehen die ersten Basics.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 02, 2010 17:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Also … Das kommt jetzt darauf an, was du vor hast.

Willst du:
  1. Mit SDL arbeiten um wenig overhead zu haben und plattformunabhängigst zu werden. Das ist ratsam, wenn du z.B. ein Spiel programmieren willst.
  2. Mit der LCL arbeiten. Das bietet eventuell mehr Komfort für eine GUI drumherum (nicht jedoch innerhalb deiner Szene, also nicht für HUD oder so), hat aber deutlich mehr (Speicher-)overhead. Das ist ratsam, wenn du zu dem Spiel einen Editor programmieren willst und nicht alles in OpenGL gemacht werden soll sondern du auch Buttons etc. um das OpenGL herum hast.

Zu b kann ich dir leider kaum Tipps geben. Da hoffen wir mal, dass Traude uns ein paar Sachen von dem erzählt, was sie bei ihrer Recherche dazu herausgefunden hat. Es gibt auf jeden Fall eine OpenGLControl oder so was in der Art für Lazarus, unabhängig von GLScene.

Zu a (SDL):
Was ist SDL?
Einstieg in die Programmierung mit SDL
und dann kannst du, wenn du noch keine oder wenig Erfahrung mit OpenGL hast mit der Einsteigertutorialreihe weiter machen:
Hier sind die Tutorials und dort gehts direkt zu Lektion 1. Überspringe den Quickstart, da der nur für Delphi ist.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 02, 2010 20:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Da hoffen wir mal, dass Traude uns ein paar Sachen von dem erzählt, was sie bei ihrer Recherche dazu herausgefunden hat.
Naja, da gibts nicht soviel zu erzählen. Es gibt eine Lazarus-OpenGL-Komponente, die man ad hoc benutzen kann um Dinge auszuprobieren, die ich aber nicht wirklich für ernsthafte Projekte empfehlen kann, denn man kann nicht selbst bestimmen, wie der Rendering Context erzeugt wird. Langfristig würde ich daher auch raten, auf SDL oder Ähnliches umzusteigen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 03, 2010 15:26 
Offline
DGL Member

Registriert: So Aug 01, 2010 17:29
Beiträge: 28
Also, hier mal mein Quelltext von Quickstart:

Code:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses  DGLOpenGL, windows, Classes, SysUtils, FileUtil, LResources, Forms, Controls,
  Graphics, Dialogs, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormDestroy(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
 StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter
    Frames, DrawTime                  : Cardinal; //& Timebased Movement
    procedure SetupGL;
    procedure Render;
    procedure ErrorHandler;
  public    { Public-Deklarationen }
    DC                                : HDC;  //Handle auf Zeichenfläche
    RC                                : HGLRC;//Rendering Context

    { public declarations }
  end;

var
  Form1: TForm1;

  const
      NearClipping = 1;
      FarClipping  = 1000;

implementation
uses gl, glu, glut;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    DeactivateRenderingContext;
  DestroyRenderingContext(RC);
  ReleaseDC(Handle, DC);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   inc(FrameCount);
   Render;
   If FrameCount = 20 then
      begin
           ErrorHandler;
           FrameCount := 0;
      end;
end;

procedure TForm1.ErrorHandler;
begin
  Form1.Caption := gluErrorString(glGetError);
end;

procedure form1.render;
begin
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glTranslatef(0, 0, -5);

  glBegin(GL_QUADS);
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
    glColor3f(0, 1, 0); glVertex3f(1, 0, 0);
    glColor3f(0, 0, 1); glVertex3f(1, 1, 0);
    glColor3f(1, 1, 0); glVertex3f(0, 1, 0);
  glEnd;

  SwapBuffers(DC);
end;

procedure TForm1.FormResize(Sender: TObject);
  var tmpBool : Boolean;
begin
  glViewport(0, 0, ClientWidth, ClientHeight);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  IdleHandler(Sender, tmpBool);
end;

procedure TForm1.SetupGL;
begin
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  DC:= GetDC(Handle);
  if not InitOpenGL then Application.Terminate;
  RC:= CreateRenderingContext( DC,
                               [opDoubleBuffered],
                               32,
                               24,
                               0,0,0,
                               0);
  ActivateRenderingContext(DC, RC);
  SetupGL;
end;

initialization
  {$I unit1.lrs}

end.

Und hier die Fehler und Warnungen:

C:\Programme\dglsdk\lib\dglOpenGL.pas(209,14) Hint: Type "PPointer" redefinition
C:\Programme\dglsdk\lib\dglOpenGL.pas(11462,63) Hint: Local variable "MinorVersion" does not seem to be initialized
C:\Programme\dglsdk\lib\dglOpenGL.pas(11462,49) Hint: Local variable "MajorVersion" does not seem to be initialized
C:\Programme\dglsdk\lib\dglOpenGL.pas(11895,35) Hint: Local variable "PFDescriptor" does not seem to be initialized
C:\Programme\dglsdk\lib\jedi-sdl.inc(237,4) Warning: Illegal compiler directive "$THREADING"
C:\Programme\dglsdk\lib\jedi-sdl.inc(237,4) Warning: Illegal compiler directive "$THREADING"
C:\Programme\dglsdk\lib\jedi-sdl.inc(237,4) Warning: Illegal compiler directive "$THREADING"
C:\Programme\dglsdk\lib\glu.pas(140,14) Hint: Type "PPointer" redefinition
C:\Programme\dglsdk\lib\jedi-sdl.inc(237,4) Warning: Illegal compiler directive "$THREADING"
C:\Programme\dglsdk\lib\glut.pas(74,14) Hint: Type "PInteger" redefinition
C:\Programme\dglsdk\lib\glut.pas(75,12) Hint: Type "PPChar" redefinition
unit1.pas(64,45) Error: Incompatible types: got "<procedure variable type of function:DWord;StdCall>" expected "LongWord"
unit1.pas(67,23) Error: class identifier expected
unit1.pas(73,35) Error: Identifier not found "ClientWidth"
unit1.pas(73,48) Error: Identifier not found "ClientHeight"
unit1.pas(87,17) Error: Identifier not found "DC"
unit1.pas(100,14) Error: Identifier not found "IdleHandler"
unit1.pas(131) Fatal: There were 6 errors compiling module, stopping


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 03, 2010 17:37 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
So, ich mach zwar normalerweise nix mit Delphi, aber ich vermute mal folgendes:

Zeile 64: gluErrorString liefert einen PChar als Rückgabewert. Das musst du wahrscheinlich einfach zu einem String konvertieren.
Zeile 67: Es muss heißen: TForm1.Render
Zeile 100: weiß ich nicht.

Alles andere sind wohl Folgefehler.


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:45, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 03, 2010 18:29 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
unit1.pas(100,14) Error: Identifier not found "IdleHandler"


kann auch gar nicht gefunden werden. Wurde nämlich nirgends definiert. Außerdem gehört der IdleHandler normalerweise sowieso nicht in FormResize.
Irgendwo in die Initialisation (FormCreate oder SetupGL) gehört dann noch
Code:
 Application.OnIdle:= IdleHandler;
Der Sinn vom IdleHandler ist normalerweise, dass er immer dann aufgerufen wird, wenn die Anwendung nichts zu tun hat. Steht übrigens auch so ähnlich im Tutorial.

Du scheinst aber ohnehin die Version mit Timer zu benutzen. Dann brauchst du auch gar kein Idle. Also einfach die Zeile, in der IdleHandler aufgerufen wird, weggeben.

mfg

Sharkman


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 03, 2010 19:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Nein das geht nicht. Das Quickstart-Tutorial wurde für die VCL geschrieben, und keiner von uns hat das je mit Lazarus probiert. Delphi ist nicht gleich Lazarus.

Ich habe aber vor einiger Zeit die Lazarus-Komponente mal ausprobiert. Soweit ich mich erinnern kann, läuft sie auf Windows, Linux und angeblich auch auf dem Mac. Ich hänge Dir hier die Anwendung in meinen Beitrag rein. Sollte einen rotierenden Würfel in einem kleinen Fenster zeigen. Das sollt Dir ermöglichen, jetzt gleich OpenGL-Code ausprobieren zu können.

ACHTUNG!

1) Damit die Anwendung auch funktioniert, musst Du die Lazarus-OpenGL-Komponente bei Dir installieren. Das ist allerdings ein Thema, bei dem ich nicht ganz sattelfest bin. Es gibt aber dazu eine Doku: http://wiki.lazarus.freepascal.org/Install_Packages/de, im Zweifel im Lazarusforum nachfragen

2) Man braucht auch die dglOpengl.pas dazu. Solltest Du diese noch nicht haben, dann findest Du sie hier: http://wiki.delphigl.com/index.php/DGLOpenGL.pas

Edit: ich seh grad, Du hast sie schon.


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 04, 2010 09:29 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja das stimmt. Das Quickstart Tutorial ist VCL basiert und VCL ist die "Visual Component Library" von Delphi.

Unter Lazaras, vor Allem wenn du für Linux UND Windows programmieren willst, ist SDL (siehe den Beitrag von Lord Horazont) eine gute Idee.

Traude, die hier auhc schon geschrieben hat, ist wiederum eine Verfechterin des "direkten Programmieren". D.h. Sie programmiert auch plattformübergreifend, kapselt aber die systemspezifischen Sachen so weg, dass sie per recompile einfach auch für ein anderes OS Binaries erstellen kann. (Soweit ich weiß).
Vielleicht kann ja auch Traude nochmal ein Beispiel geben, wie sie das Fenstermanagement angeht.

Allerdings weiß ich nicht unter welchem OS du (flix) arbeitest.

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


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 » Einsteiger-Fragen


Wer ist online?

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