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

Aktuelle Zeit: Fr Jul 18, 2025 11:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 30 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mo Feb 15, 2010 15:39 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Ich habe doch ein neues Thema angefangen, ursprünglich hier gepostet :
http://www.delphigl.com/forum/viewtopic.php?f=2&t=5107&start=15&hilit=transparente+objekte

Danke für die Antwort, mein Problem hat eben ganz dicht mit diesem Renderer aus dem WIKi zu tun, deshalb habe ich das hier gepostet.
Ich sortiere die Objekte in meinem Programm. Die Überblendung funktioniert auch so (mit dem Wiki-Renderer). Wenn sich die Volumen aber überschneiden, sieht das nicht so richtig aus (siehe 1. Foto mit Kreis). Es sieht so aus, als ob sie voreinander stehen und das vordere höher ist. Die beiden Objekte sind aber gleich hoch und sind ineinander verschnitten.

Mit dem Renderer hier im Forum sieht die Überschneidung der Volumen richtig aus, aber die Flächen, die übereinander liegen, verzerren (siehe Foto 2).

Bild
Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 15, 2010 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Mit dem Wiki-Renderer meinst du das was hier beschrieben ist?

Ok, das ist keine Verzerrung, sondern ein ZFighting-Problem. Hier könnte glDepthRange oder glPolygonOffset eine Lösung sein. Genaueres kann ich nicht sagen ohne die beschriebene Methode zu verstehen, dazu fehlt mir leider im Augenblick die Zeit.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 15, 2010 16:26 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Ja, den Wiki-Renderer meine ich. Der gilt fürs 1. Foto.
Kannst Du mir sagen, warum im 1. Foto die Volumen voreinander stehen.
Ich habe ich meine Render-Procedure mal dazugelegt. Ich glaube, Sie ist auch so verständlich.
Die Zeilen 47 und 48 habe ich für die Fotos jeweils ausgetauscht.

Deine verlinkten Tipps werde ich mir heute Abend durchlesen, danke erst einmal.

Code:
  1. procedure TCad3D.RenderObjects;
  2. var
  3.   i: Integer;
  4. begin
  5.   //glDisable(GL_DEPTH_TEST);
  6.   glEnable(GL_DEPTH_TEST);
  7.   //glEnable(GL_Normalize);
  8.   //glFrontFace(GL_CW);
  9.  
  10.   if Culling then
  11.     glEnable(GL_CULL_FACE)
  12.   else
  13.     glDisable(GL_CULL_FACE);
  14.  
  15.   if AntiAliasing then
  16.     glEnable(GL_LINE_SMOOTH)
  17.   else
  18.     glDisable(GL_LINE_SMOOTH);
  19.  
  20.   glMatrixMode(GL_MODELVIEW);
  21.   glLoadIdentity;
  22.  
  23.   if Wireframe then
  24.     glPolygonmode(GL_FRONT_AND_BACK, GL_LINE)
  25.   else
  26.     glPolygonmode(GL_FRONT_AND_BACK, GL_FILL);
  27.  
  28.   FColorBackGround := SetAlpha(FColorBackGround, 0);
  29.  
  30.   Objects.ObjekteSortieren(FCamera.CameraPosition, FCamera.PointOfRotation);
  31.  
  32. //http://www.delphigl.com/forum/viewtopic.php?f=2&t=5107&start=15&hilit=transparente+objekte
  33.  
  34.   glDisable(GL_BLEND);
  35.   for i := 0 to Objects.Count - 1 do
  36.     with Objects.Items[i] do
  37.       if AlphaComponent(Color[0]) >= 255 then
  38.       begin
  39.         DrawObjects(i, 0);
  40.       end;
  41.  
  42.   glEnable(GL_BLEND);
  43.   for i := 0 to Objects.Count - 1 do
  44.     with Objects.Items[i] do
  45.       if AlphaComponent(Color[0]) < 255 then
  46.       begin
  47.         //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); <- 1. Foto Renderer aus Wiki
  48.         glBlendFunc(GL_ONE_MINUS_DST_ALPHA,GL_DST_ALPHA); //test <- 2. Foto- Renderer aus Forum
  49.         glDepthFunc(GL_GREATER);
  50.         glDepthMask(FALSE);
  51.         DrawObjects(i, 1);
  52.  
  53.         glPushAttrib(GL_ALL_ATTRIB_BITS);
  54.         glPolygonmode(GL_FRONT_AND_BACK, GL_LINE);
  55.         glLineWidth(2);
  56.         DrawObjects(i, 2);
  57.         glPopAttrib;
  58.  
  59.         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  60.         glDepthFunc(GL_LEQUAL);
  61.         glDepthMask(true);
  62.         DrawObjects(i, 3);
  63.  
  64.         glPushAttrib(GL_ALL_ATTRIB_BITS);
  65.         glPolygonmode(GL_FRONT_AND_BACK, GL_LINE);
  66.         glLineWidth(2);
  67.         DrawObjects(i, 4);
  68.         glPopAttrib;
  69.       end;
  70.  
  71.   glDepthFunc(GL_GREATER);
  72.   glDepthMask(FALSE);
  73.   glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA);
  74.   for i := 0 to Objects.Count - 1 do
  75.     with Objects.Items[i] do
  76.       if AlphaComponent(Color[0]) >= 255 then
  77.       begin
  78.         DrawObjects(i, 5);
  79.       end;
  80.   if Axis then
  81.     Draw.DrawAxis(AxisLength, ColorAxis1);
  82.  
  83.   glDisable(GL_BLEND);
  84.   glDepthFunc(GL_LEQUAL);
  85.   glDepthMask(True);
  86.   for i := 0 to Objects.Count - 1 do
  87.     with Objects.Items[i] do
  88.       if AlphaComponent(Color[0]) >= 255 then
  89.       begin
  90.         DrawObjects(i, 6);
  91.       end;
  92.   if Axis then
  93.     Draw.DrawAxis(AxisLength, ColorAxis1);
  94. end;


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 15, 2010 16:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Kannst Du mir sagen, warum im 1. Foto die Volumen voreinander stehen.

Die Volumen stehen nicht voreinander, das sieht nur so aus, vermutlich weil die Render-Reihenfolge nicht korrekt ist.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 15, 2010 22:29 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die beiden Funktionen die du austauscht machen genau das selbe, nur gewichten sie einmal nach dem bereits im Framebuffer gespeicherten Alpha-Wert und einmal nach dem neuen Alphawert..

Das Ergebnis sieht aus wie es aussieht, weil nunmal eines der beiden Objekte im Vordergrund liegen muss.

Versuch einfach mal mit Photoshop/Gimp das Bild so zu ändern wie du es haben willst. Eventuell kommen wir dann weiter.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 16, 2010 15:25 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Kurz zur Klarstellung, bei beiden Bildern werden dieselben Objekte an derselben Position dargestellt. (nur etwas verdreht, verschoben und anders gezoomt). Die beiden Objekte im Kreis beanspruchen denselben Ort zur selben Zeit.

Die Verschneidung selbst soll so aussehen wie im 2. Bild.

Die zweite Einstellung habe einfach zum Testen genommen, weil sie im Forum stand. Ich fand sie gut, weil sie die Überschneidung richtig darstellte.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 16, 2010 15:28 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Hier eine Skizze wie s aussehen soll. So wirds vielleicht klar.
Bild


Zuletzt geändert von Jens01 am Di Feb 16, 2010 16:05, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 16, 2010 15:31 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
:mrgreen: Was ich eigentlich wollte ist, dass du das Ergebnis des Blendings (also die Farben) mal zeigst, wie du dir das Vorstellst.
Also wie soll die doppelt belegte Stelle gefärbt sein?

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 16, 2010 16:19 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
So ...
Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 16, 2010 20:27 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Gut,
das was du zeigst sollte möglich sein, denn deine "mehrfach belegten" Bereiche haben alle die selbe Helligkeit. Du erwartest also ein Verhalten wie es OpenGL liefern kann.

Die Variante mit den Z-Fighting Artefakten, entspricht doch (bis auf die Artefakte) deinen Vorstellungen, oder?

Hast du mal eine der Korrekturmethoden verwendet die im Wiki steht? Auch eine Optimierung der Near/Far Clipping Plane auf die Szene könnte helfen.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 16, 2010 21:24 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Das glPolygonOffset hatte ich schon immer gesucht. Ich wußte, dass es sowas gibt, hatte es aber noch nicht gefunden. Das mit den Near/Far Clipping Planes werde ich mal ausprobieren.
Diese Tipps sind aber mehr für das 2. Bild um die "Verzerrungen" wegzubekommen, oder?
Fürs 1.Bild bzw 1.Renderversion gibt es keine Lösung, dass die Verschneidung richtig dargestellt wird, oder? Die sonstige farbliche Darstellung würde mir nämlich schon gefallen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 16, 2010 22:44 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Beim ZFighting kann die Grafikkarte nicht genau evaluieren welche Faces nun im Vordergrund sind. Dadurch kommt es zu den Fehldarstellungen im zweiten Bild.
Meine Vorschläge bezogen sich auch nur auf das zweite Bild.

Beim ersten Bild kommt es vermutlich nur durch einen Zufall nicht zu diesem Fehler. Deshalb ist es eine gute Idee einmal die verschiedenen Ansätze auszuprobieren um nicht später nochmal mit dem Problem zu kämpfen.
Renderst du in einer Schleife, oder aktualisierst du das Bild nur bei Bedarf?
Bei ersterem Vorgehen, kann man ZFighting manchmal richtig Flimmern sehen. Da ändert es sich Teilweise in jedem Frame.

Das erste Bild scheint mir aber mit einer anderen Tiefenfuktion (glDepthFunc) gerendert worden zu sein. Hast du damit mal rumgespielt?

GL_LEQUAL sollte eigentlich bei dir passen.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 17, 2010 12:22 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Zitat:
Beim ersten Bild kommt es vermutlich nur durch einen Zufall nicht zu diesem Fehler.
Ich hab da noch mal rumprobiert. Es ist so, dass innerhalb von diesem grauen Volumen noch andere transparente Volumen sind. Die am Rand sind so rotbraun. Wenn diese nicht in dem Volumen sind, also nur die grauen "Hüllen" gerendert werden, dann sieht das schon fast perfekt aus (Gilt für Bild 1 und aktive CodeZeile47). -Der Tiefensortierer sortiert die Objekte übrigens nach dem Punkt, der am dichtesten zur Kameraebene liegt.-
Zitat:
Renderst du in einer Schleife, oder aktualisierst du das Bild nur bei Bedarf?
Ich arbeite mit einem Timer -so ähnlich wie in den Einführungstutorials beschrieben-.
Zitat:
Bei ersterem Vorgehen, kann man ZFighting manchmal richtig Flimmern sehen. Da ändert es sich Teilweise in jedem Frame.
Nein, so ein Flimmern habe ich nicht durch die Timerwiederholungen, sondern beim Rotieren. Beim Rotieren wird aber auch immer tiefensortiert.
Zitat:
Das erste Bild scheint mir aber mit einer anderen Tiefenfunktion (glDepthFunc) gerendert worden zu sein. Hast du damit mal rumgespielt?
Ja, wenn du kurz in meinen Code guckst, dann habe ich die Zeilen 47 und 48 jeweils ausgetauscht. Wenn nur Zeile 47 aktiv ist, entspricht das dem Render aus dem Wiki.

Übrigens, nach meiner Meinung fehlen im Wiki-Blending-Renderer die CodeZeilen 34 bis 40.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 17, 2010 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich hab den Thread nur kuz überflogen, aber ich denke was du brauchst ist sog. Depth Peeling, mit dem man Transparenz jederzeit korrekt darstellen kann, egal in welcher Reihenfolge gerendert wird. Auch wenn zwei transparente Objekte teilweise oder ganz ineinander liegen. Dazu gibts hier ein passendes PDF.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 17, 2010 18:14 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Ich würde sagen, dass ich mir erst einmal alle Tipps richtig durchgucke, das mal ausprobiere und mich dann noch mal hier melde.
Bis dahin bedanke ich mich erst einmal bei allen für die Hilfe.


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


Wer ist online?

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