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

Aktuelle Zeit: Do Jul 17, 2025 15:52

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



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Merkwürdiges CSG - Problem
BeitragVerfasst: Di Okt 21, 2003 16:45 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Hi Leute!
Ich ahbe folgendes Problem:
Ich ahbe es geschaft, mithilfe des Stencil-Buffers eine Art CSG hinzubekommen, das funzt auch ganz gut:

Code:
  1.  
  2. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT); //Farb und Tiefenpuffer löschen
  3. glLoadIdentity;
  4.  
  5. gltranslate(0,0,-4);
  6. glrotate(scrot,1,0,0);
  7. glrotate(rot,0,1,0);
  8. glenable(gl_cull_face);
  9. glfrontface(gl_CCW);
  10. glcullface(gl_back);
  11.  
  12. drawwuerfel;
  13.  
  14. gldisable(gl_cull_face);
  15. glEnable(GL_STENCIL_TEST);
  16. glStencilFunc(GL_ALWAYS, 1, 1);
  17. glStencilOp(GL_Keep, GL_incr, GL_Keep);
  18. glColorMask(false, false, false, false);
  19. glenable(gl_cull_face);
  20. glcullface(gl_front);
  21. glfrontface(gl_CCW);
  22.  
  23. gltranslate(-0.4,0,0);
  24. glscale(1.5,0.5,0.5);
  25. drawwuerfel;
  26.  
  27. glStencilOp(GL_Keep, GL_Decr, GL_Keep);
  28. glcullface(gl_back);
  29.  
  30. drawwuerfel;
  31.  
  32. glColorMask(True, True, True, True);
  33. glStencilFunc(GL_EQUAL, 1, 1);
  34. glStencilOp(GL_Keep, GL_KEEP, GL_KEEP);
  35. glcullface(gl_front);
  36. gldisable(gl_depth_test);
  37.  
  38.  
  39. drawwuerfel;
  40.  
  41. glenable(gl_depth_test);
  42. gldisable(gl_stencil_test);
  43. gldisable(gl_cull_face);
  44.  
  45.  
  46. SwapBuffers(form1.myDC);                             //scene ausgeben
  47. end;
  48.  


Das geht an sich ganz gut, aber mit diesem Code bekomme ich nur einkerbungen in Obejkte... allerdings keinen Zusammenhängenden "Tunnel"....
Für diesen hatte ich mir nun folgendes gedacht: Ich zeichne das ganze nicht amAnfang, sondern deaktiviere die Zeichenkanäle (glcolormask) und kehre unten einfach die Logik um, um meinen Außenwürfel zu zeichenen:


Code:
  1.  
  2. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT); //Farb und Tiefenpuffer löschen
  3. glLoadIdentity;
  4.  
  5. gltranslate(0,0,-4);
  6. glrotate(scrot,1,0,0);
  7. glrotate(rot,0,1,0);
  8. glenable(gl_cull_face);
  9. glfrontface(gl_CCW);
  10. glcullface(gl_back);
  11. glColorMask(false, false, false, false);
  12. glpushmatrix;
  13. drawwuerfel;
  14.  
  15. gldisable(gl_cull_face);
  16. glEnable(GL_STENCIL_TEST);
  17. glStencilFunc(GL_ALWAYS, 1, 1);
  18. glStencilOp(GL_Keep, GL_incr, GL_Keep);
  19. glColorMask(false, false, false, false);
  20. glenable(gl_cull_face);
  21. glcullface(gl_front);
  22. glfrontface(gl_CCW);
  23.  
  24. gltranslate(-0.4,0,0);
  25. glscale(1.5,0.5,0.5);
  26. drawwuerfel;
  27.  
  28. glStencilOp(GL_Keep, GL_Decr, GL_Keep);
  29. glcullface(gl_back);
  30.  
  31. drawwuerfel;
  32.  
  33. glColorMask(True, True, True, True);
  34. glStencilFunc(GL_EQUAL, 1, 1);
  35. glStencilOp(GL_Keep, GL_KEEP, GL_KEEP);
  36. glcullface(gl_front);
  37. gldisable(gl_depth_test);
  38.  
  39.  
  40. drawwuerfel;
  41.  
  42.  
  43. glpopmatrix;
  44. glClear(GL_DEPTH_BUFFER_BIT);
  45. glStencilFunc(GL_EQUAL, 0, 0);
  46. glStencilOp(GL_Keep, GL_KEEP, GL_KEEP);
  47. glcullface(gl_back);
  48.  
  49. drawwuerfel;
  50.  
  51. glenable(gl_depth_test);
  52. gldisable(gl_stencil_test);
  53. gldisable(gl_cull_face);
  54.  
  55. SwapBuffers(form1.myDC);                             //scene ausgeben
  56.  


Aber irgendwie funktioniert das alles leider nicht :-( Eher noch wird nun mein sonst Angezeigtes Loch trotz Stencil-Test auf "0" (Da wo das Loch ist, ist ja eine "1" nun verdeckt! Dabei lösche ich ja nicht mal den Stencil-Buffer zwishcendurch, sondern nur den Tiefentest (muss sein, weil ansonsten Der Würfel nicht gezeichnet würde... er würde an seinen eigenen Tiefeninfos, die ganz am Anfang in den TB geschriben wurden scheitern ...
Wie kann das bzw. was mache ich Falsch?

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Zuletzt geändert von DCW_Mr_T am Di Okt 21, 2003 16:53, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 21, 2003 19:58 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Einen Tunnel zum "Durchsehen" bekommst du mittel Stencil auch nur schlecht zusammen - da du ja die Innenseite des "Lochs" zeichnest, dieses aber nicht wissen kann, ob es jetzt tatsächlich eine "Innenseite" ist, oder das Objekt ganz durchstoßen hat.

Evtl. lässt sich hier aber mittels kombiniertem Stencil- und Z-Test machen: sagen wir, ein Würfel wird von einem Rohr durchstoßen:

Würfelhinterseiten nur in Z-Buffer
Rohr löscht Stencilbit wenn Z(Rohr) > Z(Würfel) (sonst nix zeichnen)
Würfel zeichnen (Vorderseiten, auch in Z-Buffer) wenn Stencilbit gesetzt (nicht in Stencilbuffer)
Rohrinnenseiten zeichnen wenn Stencilbit gesetzt und Z(Rohr) > Z(Würfel)

das sollte prinzipiell eigentlich klappen, auch wenn ich's jetzt nicht ausprobiert habe - sonst musst du halt selbst herumexperimentieren.

Mir ist übrigens aufgefallen, dass du sowohl glFrontFace als auch glCullFace aufrufst - dies ist unnötig - es reicht z.B. glFrontFace einmal einzustellen (vorzugsweise auf GL_CCW - eh Standardeinstellung) und dann mittels glCullFace zu entscheiden ob du Vorder- oder Rückseiten entfernt haben willst.
Beides immer zu setzen ist etwas Overkill :D .

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


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 6 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 ]