[GLSL] wie richtig auf GL_FragDepth schreiben?



  • Hallo Leute,

    ich versuche seit Wochen in einem Shader die z-koordinate des Pixels neu zu setzen, kriege es aber irgendwie nicht richtig hin.

    Was ich zeichne: zuerst zeichne ich die Aussenkanten eines Wuerfels mit GL_LINE_STRIP und Weltkoordinaten zwischen -1 und 1. Der Vertex-Shader dazu sieht so aus:

    gl_Position = projection*transformation*vec4(vertex,1.0);
    

    wobei Projection die normale Projectionsmatrix und transformation nur eine Rotation + translation ist.

    Im Pixelshader zeichne ich dann nur die Z-Koordinate als Farbe:

    gl_Color = vec4((gl_FragCoord.z-0.9)*10,0,0,1);
    

    Danach Zeichne ich im Wuerfel ein 3D-Volumen fuer das ich zuerst den sichtbaren Voxel bestimme und von dem die Z-Koordinate berechne. Ausschnittsweise sieht der Pixelshader so aus:

    vec3 worldPos = //hier kommt die Position des gefunden Voxels rein;
    clamp(worldPos.x,-1,1);
    clamp(worldPos.y,-1,1);
    clamp(worldPos.z,-1,1);
    //ab hier sind die Weltkoordinaten des Voxels also zwischen -1 und 1, genau wie
    //die Wuerfelkoordinaten 
    //selbe Transformation wie oben:
    vec4 worldPosP = (projection*transformation*vec4(worldPos,1));
    
    float depth = worldPosP.z/worldPosP.w;//normalisieren
    gl_FragColor = vec4((depth-0.9)*10,0,0,1);//wert ausgeben
    

    Das Resultat ist nun leider das:

    http://img826.imageshack.us/i/errorvhe.png/

    In dem Fall wird die Rueckwand des Volumens geplotet (normalfall wenn das Volumen leer ist) und wenn die Ausgabe richtig waere, muessten die Linien selbst absolut unsichtbar sein. Sind sie aber nicht. In dem Bild ist auch Z-Buffering ausgeschaltet so dass die Linien vor dem Volumen gezeichnet sind. Es geht also nur um den Farbwert.
    Weiss jemand, was ich falsch mache? so langsam bin ich mit meinem Latein am Ende.

    Ein anderer Fehelr der mir aufgefallen ist: manche Pixel sind fehlerhaft. Da hebn manche Pixel auf einmal voellig andere Farbwerte als die Pixel die sie umgeben. Und das kann eigentlich auch nicht sein 😞



  • Hmm...hat hier denn schonmal jemand die Z-Koordinaten im Pixelshader neu berechnet? Unter der Voraussetzung dass die Matrizen und die Weltkoordinaten des Voxels korrekt sind, wär das dann die richtige Art und Weise die Tiefe zu berechnen?


Anmelden zum Antworten