[openGL] Zwei Flächen nah beieinander



  • Kannst du mal einen Screenshot posten der diese "Schraffierung" zeigt?



  • So ich hab mal nen Screenshot gemacht:

    http://img88.imageshack.us/img88/4110/schraffierung.jpg

    Man sieht die Perspective Projection. Links etwas weiter entfernt, rechts
    ziemlich nah dran. Die Pfeile hab ich an den Stellen reingezeichnet, wo
    ein neues paar Rechteckecke übereinander gezeichnet wird.
    Interessant ist, dass bei der kurzen Entfernung und perspektivischen Sicht
    die Schraffierung verschwindet.
    Bei beiden Projektionen verschwindet die Schraffierung, wenn man in einem
    Winkel von etwas über 45° auf die Fläche blickt.
    Die Normalenvektoren der übereinanderliegenden Rechtecke zeigen übrigens in
    entgegengesetzte Richtungen.
    UND: die Schraffierung sieht man nur von einer Seite...

    any ideas?
    GL_Depth_Test war übrigens doch eingeschaltet (siehe Z. 48 vom Code). Könnte
    es evtl. noch an den anderen Einstellungen liegen die dort vorgenommen werden?


  • Mod

    Tomatojuice schrieb:

    any ideas?

    dot hat das eindeutig auf den punkt gebracht:

    dot schrieb:

    Ich bin mir ziemlich sicher dass es sich bei dem was du beschreibst um z-Fighting handelt...

    und inter2k3 die frage deren antwort zu deiner loesung fuehren wird.



  • okay, also ich hab jetzt mal ein wenig mit near und far rumgespielt.
    Ich bekomms so hin, dass es nicht mehr flimmert, aber er schneidet schon
    sehr sehr früh den Vordergrund weg.

    Bei Orthogonaler Sicht hab ich ja garkein znear oder zfar. Kennt jemand
    dafür andere Parameter?

    Übrigens wenn ich die GlDepthFunc auf GL_LESS stelle macht die eine Seite
    Probleme, bei GL_LEQUAL die andere.
    Also müsste es doch theoretisch etwas geben, was beides verbindet?



  • Nur mal so eine Frage: Wofür genau hast du eigentlich zwei koplanare Flächen so nah beieinander?



  • Tomatojuice schrieb:

    Bei Orthogonaler Sicht hab ich ja garkein znear oder zfar.

    Doch klar. Der einzig Unterschied ist, dass dein Sichtvolumen ein Quader ist, und kein Frustum.



  • Tomatojuice schrieb:

    Bei Orthogonaler Sicht hab ich ja garkein znear oder zfar.

    Ausschnitt aus deinem code:

    glOrtho(-m_cameradist*((GLfloat) w/(GLfloat) h)*0.5,    //linke Sichtgrenze
        m_cameradist*((GLfloat) w/(GLfloat) h)*0.5,        //rechte Sichtgrenze
        -m_cameradist*0.5,    //untere Sichtgrenze
        m_cameradist*0.5,    //obere Sichtgrenze
       -40,    //hintere Sichtgrenze  <-- zNear
       40);    //vordere Sichtgrenze  <-- zFar
    }
    

    Hier also zNear = -40 und zFar = 40.

    Bei gluOrtho2D wird zNear per default auf -1 gesetzt und zFar auf 1.



  • dot schrieb:

    Nur mal so eine Frage: Wofür genau hast du eigentlich zwei koplanare Flächen so nah beieinander?

    Also, ich möchte einen Hohlzylinder darstellen, auf dem mehrere kleine Objekte
    drauf sind. Da die Objekte auch sehr klein sind, soll die geringe Wandstärke
    vom Zylinder auch dargestellt werden.

    inter2k3 schrieb:

    -40,    //hintere Sichtgrenze  <-- zNear
       40);    //vordere Sichtgrenze  <-- zFar
    

    Thx!
    hehe, wollt mir schon vor den Kopf schlagen, aber in meinem
    Code wars ja noch nicht drin ^^.



  • Zum Hohlzylinder:

    Du wirst wahrscheinlich einen äusseren Zylidnermantel und einen inneren Zylindermantel zeichnen.
    Du bist schon auf die richtige Idee gekommen, nur hast du sie nicht vollständig umgesetzt. Für die Vertices des inneren Mantels gibst du Normalen an, die in die entgegengesetzte Richtung der Normalen des äusseren Mantels zeigen. Soweit ist das richtig.
    Allerdings differenziert OpenGL nicht anhand der Normalen, ob es sich um eine Vorderseite oder eine Rückseite handelt, sodnern durch die Reihenfolge, in der die Vertices angegeben werden. Die Normalen wären beispielsweise für die Beleuchtung relevant.

    Per default werden Vertices einer Vorderseite (front-face) entgegen des Uhrzeigersinns angegeben (GL_CCW <- counter clock-wise).
    So würdest du die Vertices für den äusseren Mantel angeben. Da es sich beim inneren Mantel um die "Rückseite" handelt, gibst du die Vertices hier im Uhrzeigersinn an.

    Mit glCullFace(GL_BACK) legst du fest, dass die Rückseite nicht gerendert werden soll.
    Dann aktivierst du noch das face-culling mit glEnable(GL_CULL_FACE) und das Problem sollte nicht mehr existieren.


  • Mod

    wenn du genau weisst was du zeichnen willst, und was worauf erscheinen soll, dann kannst du den zbuffer ausschalten und einfach in der gewuenschten reihenfolge zeichnen, dann sollte es auch gehen


Anmelden zum Antworten