[D3D] Viewport.MinZ/MaxZ bei weiteren Passes anpassen



  • Hallo,
    ich habe ein kleines Problem. Leider kann ich es nur schwer in wenige worte fassen, darum ist der titel auch nicht prägnanter. Jedefalls:
    Ich möchte ein direktionales licht mit shadowmapping implementieren.
    Im ersten Schritt renderere ich die gesamte szene aus sicht des "anwenders" wobei ich den ZBuffer fülle. Danach rendere ich scheibenweise stücke des viewfrustums ab wobei für jede scheibe auch shadowmaps aus sicht des lichts generiert werden. (Parallel Split Shadow Mapping sagen glaube ich manche dazu). Aber nun zum eigentlichen problem:
    Eigentlich habe ich ja schon die tiefeninfos für die scene aus dem ersten pass, und möchte diese dann auch für die "scheiben" nutzen. Allerdings wurde ja im ersten pass [neraplane, farplane] auf [0, 1] abgebildet. Also muss ich einen weg finden, dass die scheiben tiefenwerte generieren, die der entsprechende bereich auch beim ersten pass erzeugt hätte. (Und nicht das jede scheibe für sich auf [0, 1] abgebildet wird.
    Und das bekomme ich nicht hin. Die tiefenwerte der scheiben passen nicht zum 1. pass, werden also beim depthtest verworfen usw..
    Hier noch ein beispiel von dem was ich versuche anhand der 1. scheibe:

    //Render entire scene for depthwrites
    
    //Now setup the viewport and projection to render a sclice:
    
    //save old viewport
    D3DVIEWPORT9 oldViewport;
    GetViewport(&oldViewport);
    
    Camera tmpCamera = camera;
    
    tmpCamera.setProj(camera.getFov(), camera.getAspect(), camera.getNear(), m_splitingDists[0]);
    
    //Do some shadow stuff here, not important I believe
    
    float range = camera.getFar() - camera.getNear();
    
    //set new  viewport
    D3DVIEWPORT9 newViewport = oldViewport;
    newViewport.MinZ = 0.0f;
    newViewport.MaxZ = (m_splitingDists[0] - camera.getNear()) / range;
    SetViewport(&newViewport);
    
    Matrix4 viewProj = tmpCamera.getView() * tmpCamera.getProj();
    
    //Render the first slice now
    

    Ich hoffe der lange text hat euch nicht abgeschreckt, bzw. ihr versteht überhaupt was ich versuche zu sagen. Ich könnte etwas hilfe gut gebrauchen. Danke schonmal im voraus.



  • Der Bereich [zMin..zMax] des Viewport wird auf die gesamte Aufloesung (0..2^n-1) des ZBuffers abgebildet. Die Z-Werte eines (kleineren) Slice erstrecken sich also wieder ueber die gesamte Z-Aufloesung.
    Lass den Viewport unveraendert und setze zwei Clipping-Planes um die Grenzen eines Slice zu definieren.



  • hellihjb schrieb:

    Der Bereich [zMin..zMax] des Viewport wird auf die gesamte Aufloesung (0..2^n-1) des ZBuffers abgebildet. Die Z-Werte eines (kleineren) Slice erstrecken sich also wieder ueber die gesamte Z-Aufloesung.

    Das war mir nicht klar. Ich hatte da eine falsche vorstellung.

    hellihjb schrieb:

    Lass den Viewport unveraendert und setze zwei Clipping-Planes um die Grenzen eines Slice zu definieren.

    Daran habe ich noch garnicht gedacht, dass hört sich ganz gut an! Kann es im moment leider nicht testen, melde mich aber heute abend nochmal zurück. Besten dank!

    [edit]
    Hatte ein paar wirre gedanken...
    [/edit]



  • Jetzt habe ich doch noch fragen.
    Irgendwie verwirren mich diese clipplanes im clipspace (da ich die programmierbare pipeline verwende). Ich dachte zuerst, die würden quasi "vor der kamera" kleben. Zum beispiel (0.0f, 0.0f, 1.0f, 10.0f) um alles was mehr als 10 einheiten weg ist zu verwerfen. Das klappt nicht so gut.
    Wie gehe nun am besten vor? Soll ich die teile im worldspace konstruieren und dann irgendwie in den clipspace transformieren?
    Danke schonmal.



  • Der Clipspace geht von [-1..+1][-1..+1][0..1]
    10 Einheiten waren also ein bischen viel.



  • OK, habe es jetzt hinbekommen.
    Vielen dank für deine hilfe!


Anmelden zum Antworten