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

Aktuelle Zeit: Di Mai 21, 2024 14:09

Foren-Übersicht » DGL » Feedback
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Tutorial Objektselektion ohne Shader
BeitragVerfasst: Fr Jul 31, 2009 14:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Hallo,
Ich habe mich mal drangesetzt und ein kleines Projekt geschrieben, weil dieses Thema wichtig ist und ich es unbedingt lernen will. Und weil ich gerade dabei war habe ich gleich ein kleines Tutorial draus gemacht. Es soll ausdrücklich kein Angriff auf Waran sein, es soll sich auch nicht mit diesem messen, das kann es nicht, ich lerne erst seit ~2 Wochen OpenGL im Selbststudium. Vermutlich wimmelt es auch vor Fehlern. Aber vielleicht kann es dem ein oder anderen trotzdem nützen, daher will ich es online Stellen.

Für das Wiki ist es sicher nicht geeignet, da es nur auf völlig veralteter Technik (Display-Listen, glReadPixels etc.) basiert und daher keinem Standard genügen kann, es richtet sich eher an vollnoobs wie mich die einfach mal sehen wollen dass OpenGL auf dem Bildschirm das tut was man will, noch bevor sie dann richtig tief in die Materie einsteigen.

http://s200005540.online.de/verschiedenes/colorpicking.pdf

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 31, 2009 15:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 18, 2009 07:17
Beiträge: 44
Wohnort: Gießen/Hessen
Tausend Dank für die Mühen! :D

Ich werde es heute oder morgen mal Durcharbeiten, benötige es ohnehin für mein Solar-Modell, dann gibts auch mal ein Demo Programm von mir, über die Objektrotation, aus den Tutorialen ""Objekt gedreht und dennoch nach vorne bewegt" und "Objekt immer um eigene Achse drehen", da fehlt der Source-Code. :roll: . Hat mich alleine 5 Tage aufgehalten der sch@§$ .

_________________
Gruß Andreas (aka DeepCopy) - Sic Luceat Lux

Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.


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

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Was ich am Tut gut finde:

- Ich würde sagen es ist der Zielgruppe entsprechend ("absolute Anfänger", OpenGL <2).
Damit meine ich auch, dass man direkt auf der Codebasis der Tutorialseite aufbauen kann
(ist aber nicht nur Vorteil - s.u.).

- Du keyst die Objekte "von Hand", das macht zwar diesen if-Baum im Rendercode notwenig, du
umgehst aber das, eher von OpenGL losgelöste, Problem: Wie rechne ich einen Index in eine Farbe
und zurück.

- Deine Art von Feedback an den Benutzer finde ich hübscher; also das Objekt fängt sich an zu drehen,
anstatt das ein Name im Fenstertitel angezeigt wird. Damit zeigst du auch visuell, dass die Selektion absolut
unabhängig davon arbeitet, wo die Objekte sind.


Was mir nicht so gefällt:

- Die Codebasis hat wie gesagt Nachteile. Ich denke mal der wichtigste ist, dass du Windows und
sogar VCL (Delphi) vorraussetzt. Jemand der unter Linux oder OSX unterwegs ist, kann mit deinem
Tutorial also gar nichts anfangen. Phobeus hat das auch nicht so gerne, weil er gerne alle Grundlagentuts
auf SDL gemünzt sehen will ;)
Außerdem finde ich den VCL-Code auch ein bisschen "unaufgeräumt" - ist aber nur meine persönliche
Meinung.

- Wenn du Objekte von Hand keyst, würde ich zu Konstanten raten. Ich stand ziemlich auf dem Schlauch,
als ich erst gelesen hatte "if zuletzt = 100"... "if zuletzt = RED_QUADRAT" wäre vieeeel deutlicher. Diese
Konstanten könntest du dann auch in den glColor-Aufrufen nutzen und der Code wäre imho verständlicher.


Und noch ein paar Anregungen:

- Wenn du schon mit Konstanten arbeiten willst, gäbe es vielleicht noch eine sehr elegante Möglichkeit mit
Enums. D.h. du rufst Render nicht mehr mit einem Boolean auf, sondern mit einem "TRenderMode" - dieser
enthält die beiden Werte: RMnormal und RMselect. Darauf aufbauend könntest du dann sogar anstatt fester
Farbwerte ein 2x3-Array basteln: array [RMnormal..RMselect] of array [0..2] of byte.

Der Aufruf in der Renderschleife wäre dann einfach: glColor3ubv(@Farbe_Quad[RenderMode][0]);
Aber nur wenn es dir in's Konzept passt. Diese Methode wäre immerhin mit den Texturen inkompatibel und
die Normal-Farbe gewinnt den Eindruck eines "must be" - nicht als "Ersatzfarbe".

- Zur Sprache lässt sich sagen, dass du noch ein paar Ungenauigkeiten drin hast (z.B. das Picking von einigen
Karten nicht unterstützt wird - dabei ist das eine reine Treibersache). Das ist aber klar, dass es nicht von Anfang
an 100%ig lupenrein ist. Ich habe die allererste Version meines Tuts [die i0n0s übrigens nach DK mitgenommen
hat... wenn Phobeus das liest *schäm*] auch komplett neu geschrieben.
Mit dem Siezen... naja - ich finde es etwas unbequem. Ist aber sicher Geschmackssache.


Ansonsten wäre es wie gesagt toll, wenn du dieses Tut auch für das Wiki als "absolute beginner"-Tutorial
aufbereiten könntest. Dadurch spare ich mir die Klimmzüge mit "OpenGL 2 1/2" und kann ungeniert mehr
von meinen Lesern verlangen ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 31, 2009 16:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Hey danke für deine Rückmeldung waran. Du hast in allem was du sagts recht :D Allerdinngs war das z.B. bezüglich VCL eben auch so geplant, ich sagte ja dass es fürs wiki möglicherweise nix ist, das Problem an der Sache ist dass ich 0 Lazarus Erfahrung habe, und daher dazu nix sagen kann, ich hab leider immer nur unter Windows / VCL gearbeitet.

Was die Konstanten angeht hast du völlig recht, das muss ich irgendwie noch ändern. Da ist sowieso einiges ungünstig geraten, auch weil ich die Farbe Rot benutze und Variablen mit prefix rot_ habe was aber für rotation steht... das muss ich irgendwie ändern. Ich hab kurzfristig keine Konstanten eingeführt weil ich ja schon variablen für die display-listen hatte und mir auf die schnelle kein griffiger Name ienfiel :oops:

Naja werde mich da nochmal dransetzen.

Was das siezen angeht, irgendwie mach ich das immer so in Tutorials (hab schon andere für Delphi-Themen geschrieben) aber ich gebe zu es kann einem sicher auf den Zeiger gehen... mal sehen ^^

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 07:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 18, 2009 07:17
Beiträge: 44
Wohnort: Gießen/Hessen
Ich arbeite nur mit Lazarus und zum Thema VCL ist zu sagen: Unter Lazaurs kann FAST alles was mit der VCL geschieben wurde auch auf andere OS transportiert werden, Windows 32bit/64bit, WinCE, Linux (GTK, QT), MacOS.

Unter FPC/Lazarus gibt es so gut wie keine Einschränkung was die wahl des OS betrifft:

Ein Auszug zum FreePascal Compiler:
Zitat:
Originally named FPK-Pascal, the Free Pascal compiler is a 32 and 64 bit Turbo Pascal and Delphi compatible Pascal compiler for DOS, Linux, Win32, OS/2, FreeBSD, AmigaOS, Mac OS X, Mac OS classic and several other platforms (the number of supported targets grows all the time, although not all of them are on the same level as the main ones).

The Free Pascal compiler is available for several architectures, x86, Sparc (v8,v9), ARM, x86_64 (AMD64/Opteron) and Powerpc. An older version (the 1.0 series) also supports m68k.


Und Auszug zu Lazarus/LCL dem Delphi/VCL Pedant:
Zitat:
Lazarus is a cross platform visual IDE which provides a Delphi clone for Pascal and Object Pascal developers. It is developed for and supported by the Free Pascal compiler. As of March 2008[update], Lazarus is available for several Linux distributions, FreeBSD, Microsoft Windows and Mac OS X.


Also alles was das (Programmierer-) Herz begehrt. Ganz nach dem Motto:
Zitat:
write once, compile anywhere

_________________
Gruß Andreas (aka DeepCopy) - Sic Luceat Lux

Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 14:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Ja ich werde mich auf alle Fälle mal damit auseinandersetzen, zumal das für mein eigenes Projekt interessant ist. Hab mir grade mal Lazarus gezogen und das erste Problem ist natürlich dass der API-Befehl getDC nicht funktioniert... sehe ich das richtig dass ich mir diesen Kontext irgendwie über SDL oder so besorgen muss?

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 15:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Der "Device Context" ist etwas windowsspezifisches. Du bekommst Funktionen wie "getDC",
wenn du die Unit windows in die Uses-Klausel einfügst... genau wie in Delphi, allerdings wird dort
diese Unit standardmäßig in neue Projekte eingebunden.

Allerdings ist das natürlich wieder nicht plattformunabhängig ;)
Du könntest dir ja mal http://wiki.lazarus.freepascal.org/OpenGL/de anschauen.

Ich selbst benutze es zwar nicht, aber "LCL-Control mit OpenGL-Kontext" hört sich nach dem an,
was du suchst.


Und ich wollte btw. noch was zum Tutorial einwerfen, was ich letztes mal vergessen habe:
Eigentlich besteht für deine Zielsetzung (_Einfachheit_) kein Grund, Displaylisten zu benutzen.
Wenn du alles mit immediate mode machen würdest, hättest du mehr Übersicht was Variablen
angeht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 15:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
waran hat geschrieben:
Der "Device Context" ist etwas windowsspezifisches. Du bekommst Funktionen wie "getDC",
wenn du die Unit windows in die Uses-Klausel einfügst... genau wie in Delphi, allerdings wird dort
diese Unit standardmäßig in neue Projekte eingebunden.


Ja sowas in der art dachte ich mir bereits...
mal doof gefragt, wie initialisierst du denn OpenGL wenn du ein Projekt startest? Da du sagst dass du diesen LCL-Device-Kontext nicht benutzt?

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 15:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Ich benutze kein Lazarus für OpenGL, sondern reines Freepascal und SDL:

Code:
  1. {$APPTYPE GUI}
  2. uses SDL, dglOpenGL;
  3.  
  4. procedure Render;
  5. begin
  6.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  7. end;
  8.  
  9. procedure Setup;
  10. begin
  11.   glMatrixMode(GL_PROJECTION);
  12.     glLoadIdentity;
  13.     //gluPerspective(45, 800/600, 1, 100);
  14.     glOrtho(-400,400,-300,300, 0, 10);
  15.   glMatrixMode(GL_MODELVIEW);
  16.  
  17.   glEnable(GL_CULL_FACE);
  18.   glEnable(GL_DEPTH_TEST);
  19.  
  20.   glClearColor(0.1, 0.1, 0.1, 1);
  21. end;
  22.  
  23. procedure MainLoop;
  24. var
  25.   t0   : LongWord;
  26.   dt   : LongWord = 0;
  27.   event: TSDL_Event;
  28.   done : boolean = false;
  29. begin
  30.   repeat
  31.     t0 := SDL_GetTicks;
  32.       Render;
  33.       SDL_GL_SwapBuffers;
  34.     dt := (SDL_GetTicks - t0);
  35.    
  36.     if dt < 5 then SDL_Delay(5-dt);
  37.    
  38.     while SDL_PollEvent(@event)<>0 do
  39.     begin
  40.       case event.type_ of
  41.         SDL_KEYDOWN: done := event.key.keysym.sym = SDLK_ESCAPE;
  42.         SDL_QUITEV : done := true;
  43.       end;
  44.     end;
  45.   until done;
  46. end;
  47.  
  48. BEGIN
  49.   SDL_Init(SDL_INIT_VIDEO);
  50.   SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 16);
  51.   SDL_SetVideoMode(800, 600, 0, SDL_OPENGL);
  52.  
  53.   InitOpenGL;
  54.   ReadExtensions;
  55.  
  56.   Setup;
  57.   MainLoop;
  58.  
  59.   SDL_Quit;
  60. END.


Wird SetVideoMode mit SDL_OPENGL aufgerufen, so erhält das Fenster automatisch einen
OpenGL-Context. Die Eigenschaften des Context (z.B. das Pixelformat) lassen sich vorher
mit SDL_GL_SetAttribute einstellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 15:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Ah ja sry hatte euch kurzzeitig verwechselt, DeepCopy und Waran, daher hatte ich mich gewundert --> einerseits Lazarus andererseits aber nicht LCL. Aber jetzt habe ich denk ich genug Informationen um das Projekt nochmal Plattformunabhängig zu proggen, und vielleicht auch noch etwas eleganter mal sehen... aber nimmer heute, ich geh jetzt grillen :)

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 21:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 18, 2009 07:17
Beiträge: 44
Wohnort: Gießen/Hessen
Hallo Tilman,

hier ist mein Lazarus-Template für deinen Einstieg in OpenGL, es zeichnet ein Quad, hat einen FrameCounter, und OpenGL Fehleranzeige, alles in einer Unit, kommentiert und nicht viel Code.


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

_________________
Gruß Andreas (aka DeepCopy) - Sic Luceat Lux

Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 26, 2009 18:43 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Ich hab mir mal dein Tut nen bssl genauer angeguckt, graz erstma für die Idee,

ich hab aber auch nen Problem, meine "Selektionsmap" wird zwar richtig gerendert, aber glReadPixels gibt bei mir trotzdem immer nur (0,0,0) - also schwarz - zurück, das find ich nen bssl unpraktisch^^

Code:
  1.   glReadPixels(Y,clientHeight-y,1,1,gl_RED,GL_UNSIGNED_BYTE,@value);


So sieht mein Aufruf auf, welcher im MouseDown-Ereignis vom Formular ist. value ist vom Typ TGLVertex3f....

Könnt ihr mir sagen was ich falsch mache?

cuz bubble


//Edit: okay hab den fehler gefunden, hatte den ersten parameter - also die x koordinate - auch y übergeben xD

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 27, 2009 00:00 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Du könntest eventuell noch erwähnen, dass man alle auf die Farbe einflussnehmenden States ausschaltet.
Also Licht aus, Texturen aus, Nebel aus, Blending aus, etc pp.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 27, 2009 11:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Jo, danke für die Reaktion. Ich hatte das Tut bereits umgeschrieben, muss nur noch ein paar Änderungen vornehmen. Ich denke ich werde heute oder morgen Abend dazukommen. Das Tut in diesem Thread ist aber bereits veraltet.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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 | 14 Queries | GZIP : On ]