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

Aktuelle Zeit: Fr Jul 18, 2025 07:24

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



Ein neues Thema erstellen Auf das Thema antworten  [ 30 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
BeitragVerfasst: Di Jul 06, 2010 15:39 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
hallo Jens, hast du mittlerweise eine ordendliche Lösung hinbekommen? Stehe nämlich vor dem gleichen Problem..


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 06, 2010 18:00 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
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?

Gruss Jens


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 07, 2010 14:25 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
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..


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 07, 2010 18:21 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 08, 2010 07:28 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Kannst du deinen Code bissl Kommentieren? Was z.B. machst du mit FColorBackground?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 08, 2010 10:04 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Bevor diese Procedure aufgerufen wird, stellt sich den Hintergrund ein :
Code:
glClearColor(
    RedComponent(FColorBackground) / 255,
    GreenComponent(FColorBackground) / 255,
    BlueComponent(FColorBackground) / 255,
    AlphaComponent(FColorBackground) / 255);


dabei ist FColorBackground: TColor32 von http://www.graphics32.org. Ich glaube aber, dass das für die Darstellung nicht so wichtig ist.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 08, 2010 10:22 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Hier der Code mit ein paar Kommentaren :
Code:
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);

  FColorBackGround := SetAlpha(FColorBackGround, 0);


  //Objects werden vor dem Durchlauf auf Tiefe sortiert!!
  Objects.ObjekteSortieren(FCamera.CameraPosition, FCamera.PointOfRotation);

  //http://www.delphigl.com/forum/viewtopic.php?f=2&t=5107&start=15&hilit=transparente+objekte

  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);

        //diese Einstellung ist fürs Zeichnen deer Objektkanten
        glPushAttrib(GL_ALL_ATTRIB_BITS);
        glPolygonmode(GL_FRONT_AND_BACK, GL_LINE);
        glLineWidth(2);
        DrawObjects(i, 2);
        glPopAttrib;

        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glDepthFunc(GL_LEQUAL);
        glDepthMask(true);
        DrawObjects(i, 3);

        //diese Einstellung ist fürs Zeichnen deer Objektkanten
        glPushAttrib(GL_ALL_ATTRIB_BITS);
        glPolygonmode(GL_FRONT_AND_BACK, GL_LINE);
        glLineWidth(2);
        DrawObjects(i, 4);
        glPopAttrib;
      end;

  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;


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 19, 2010 14:32 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 19, 2010 15:26 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Code:
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

(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.

mfg

sharkman


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 19, 2010 18:12 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 19, 2010 20:40 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
@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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 20, 2010 08:08 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
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 .....


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 20, 2010 11:53 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Interferenzen? :shock: Nein!

Da bin ich jetzt aber überfragt! Kann ich nicht sagen. Sorry...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 20, 2010 14:46 
Offline
DGL Member
Benutzeravatar

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.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jul 20, 2010 17:39 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Sellmann hat geschrieben:
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.


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 Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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 ]