Nee... Der Tipp von Sascha scheint der richtige zu sein. Aber.... Du mußt Dich erstens mit Shadern beschäftigen. Das ist noch gut hinzubekommen. Dann gibt es noch dies dual_depth_peeling. Ich bin leider noch nicht dahinter gestiegen und ich bin eigentlich der Meinung, dass ich mich auch in komplizierte Materie einarbeiten kann. Beispiele oder Basis-Erläuterungen habe ich weder hier noch bei google finden können. Bei allem anderen, was ich gefunden habe, "legst Du die Ohren an"! Ich habe das Problem bei mir vorerst nach hinten gestellt und akzeptiere diese unkorrekte Darstellung.
Vielleicht gibt es hier von den Profis ja einen, der das mit kurzen Worten gut beschreiben kann oder ein verständliches Tutorial dafür hat?
hat den jemand zu diesem Tut ein funktionierendes Beispiel http://wiki.delphigl.com/index.php/Blenden Habe damit rumgebastelt, doch irgendwie kann ich sowie ein Transparentes Objekt durch ein Massives geht, durch das Massive durchgucken..
Ganz habe ich nicht verstanden, was Du genau meinst, aber aus meiner Sicht, hat dies Beispiel aus dem Wiki kleine Fehler. Insbesondere beim verschneiden mit opaken (massiven) Objekten. Wenn Du ein paar Posts zuvor guckst, habe ich meinen Quellcode reingestellt. Dort habe ich ein oder zwei Schleifen mehr drin als im Wiki. Bei mir funktioniert das so recht gut.
procedure TCad3D.RenderObjects; var i: Integer; begin //glDisable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST); glEnable(GL_Normalize); //glFrontFace(GL_CW);
if Culling then glEnable(GL_CULL_FACE) else glDisable(GL_CULL_FACE);
if AntiAliasing then glEnable(GL_LINE_SMOOTH) else glDisable(GL_LINE_SMOOTH);
glMatrixMode(GL_MODELVIEW); glLoadIdentity;
if Wireframe then glPolygonmode(GL_FRONT_AND_BACK, GL_LINE) else glPolygonmode(GL_FRONT_AND_BACK, GL_FILL);
glDisable(GL_BLEND); for i := 0 to Objects.Count - 1 do begin // Die Objects, die opak (massiv, bzw alpha = 255) sind, werden bei dem Durchlauf gezeichnet with Objects.Items[i] do if AlphaComponent(Color[0]) >= 255 then begin DrawObjects(i, 0); end; DrawSolidObjects(i, 0); end;
glEnable(GL_BLEND); for i := 0 to Objects.Count - 1 do //Die Objects, die transparent (alpha < 255) sind werden bei dem Durchlauf // mit verschiedenen gezeichnet with Objects.Items[i] do if AlphaComponent(Color[0]) < 255 then begin glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //glBlendFunc(GL_ONE_MINUS_DST_ALPHA,GL_DST_ALPHA); //test glDepthFunc(GL_GREATER); glDepthMask(FALSE); DrawObjects(i, 1);
glDepthFunc(GL_GREATER); glDepthMask(FALSE); glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA); // Die Objects, die opak (massiv, bzw alpha = 255) sind, werden bei dem Durchlauf gezeichnet for i := 0 to Objects.Count - 1 do begin with Objects.Items[i] do if AlphaComponent(Color[0]) >= 255 then begin DrawObjects(i, 5); end; DrawSolidObjects(i, 5); end;
//nur für mein Projekt wichtige Einstellung. //Die Systemachsen sind nicht in der Objects-liste if Axis then Draw.DrawAxis(AxisLength, ColorAxis1);
glDisable(GL_BLEND); glDepthFunc(GL_LEQUAL); glDepthMask(True); // Die Objects, die opak (massiv, bzw alpha = 255) sind, werden bei dem Durchlauf gezeichnet for i := 0 to Objects.Count - 1 do begin with Objects.Items[i] do if AlphaComponent(Color[0]) >= 255 then begin DrawObjects(i, 6); end; DrawSolidObjects(i, 6); end;
//nur für mein Projekt wichtige Einstellung. //Die Systemachsen sind nicht in der Objects-liste if Axis then Draw.DrawAxis(AxisLength, ColorAxis1); end;
also bei mir funktioniert deine Methode ebenso nicht richtig.. ich versuche Transparente Lichtkegel korrekt darzustellen... Hier siehst du mein Problem.. man kann, wenn ein Lichtkegel im Vordergrund ist, alle anderen Kegel im Hintergrund ohne Begrenzung durch Opake objekte, sehen..
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
(und die übrigen) Bei Lichtern doch eigentlich additives Blending, oder versteh ich da was falsch?
Zitat:
man kann, wenn ein Lichtkegel im Vordergrund ist, alle anderen Kegel im Hintergrund ohne Begrenzung durch Opake objekte, sehen..
Ohne mir das jetzt genauer angeschaut zu haben: spricht dafür, dass Tiefentest deaktiviert ist. Wies jetzt genau richtig gehört weiß ich aber auch nicht.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Es handelt sich hier um geschnittene Transparente Objekte. Das ist ein "Standardproblem" in der Computergrafik. Und dafür gibts keine einfache OutOfTheBoxLösung. Solange sich Transparente Objekte nicht schneiden reicht es diese nach der Entfernung zur Kamera sortiert zu rendern. Wenn die sich schneiden siehts allerdings schlecht aus.
Die Idee die einfach den Tiefenpuffer nicht zu beschreiben hilft da auch nicht. Das Ergebnis bei sich gegenseitig überlappenden Objekten wäre dann einfach von der Zeichenreihenfolge abhängig.... und das ist auch nicht so doll.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
@Thmfrnk Wenn ich ehrlich bin, habe ich Dich nicht ganz verstanden und ich sehe es auch nicht. Nichts für ungut.
Meinst Du die Grenzen bzw Schnittkanten der transp. Lichtkegel. Das war und ist auch mein Problem! Wenn sich transparente Objekte überschneiden, benötigst Du dies dual/ depth peeling. Damit kenne ich mich aber nicht aus! Mit der Überschneidung von opaken und transp Objekten hatte ich bisher keine Probleme bei dem Code.
Wenn es um die Schnittkanten geht, könnte man diese auch berechnen und einzeichnen. Bei 2,5D Maschinen macht man das auch so, dass die verschnittenen Objekte als einzelne Objekte abgetrennt werden und dann einzeln, nacheinander (tiefensortiert) gezeichnet werden. Das ist dann mathematisch nicht ganz anspruchslos aber machbar.
also das problem ist folgendes, wenn ich jetzt wie auf dem Bild, noch eine Lampe unter dem Bühnenboden platzieren würde, welche nach links scheint, könnte ich den Lichtkegel durch die anderen Lichtkegel sehen. Also folgende Konstellation funktioniert nicht mehr: Licht | Massiv | Licht .....
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Der Lichtkegel funktioniert momentan ja sowieso noch nicht ganz richtig, denn momentan kann man ja auch alles das sehen, was sich zwar hinter, aber nicht in dem Lichtkegel befindet.
Der Lichtkegel funktioniert momentan ja sowieso noch nicht ganz richtig, denn momentan kann man ja auch alles das sehen, was sich zwar hinter, aber nicht in dem Lichtkegel befindet.
wenn du damit den eigentlichen Lichtschein auf dem "Boden" meinst, ich schlage mich aktuell noch mit Textur-Projektion herum....
Hier nochmal ein kleines bildchen zur Veranschaulichung des Problems. Der blaue Scheinwerfer befindet sich weit unter dem massiven Boden.. Der massive Spot wird logischerweise nicht gerendert, da er beim Tiefentest rausfliegt, doch der Kegel ist sichtbar..
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mitglieder in diesem Forum: 0 Mitglieder und 0 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.