unity3d: Verwenden Hauptkamera depth-buffer zum Rendern andere Kamera-Ansicht

Nachdem meine Haupt-Kamera macht, die ich gerne verwenden würde (oder kopieren), die seine Tiefe Puffer a (deaktiviert) Kamera depth-buffer.
Mein Ziel ist es, ziehen Teilchen auf einen kleineren render-target (mit einer separaten Kamera), während der depth-buffer nach undurchsichtigen Objekte gezeichnet werden.
Ich kann dies nicht in eine einzige Kamera, da das Ziel ist, verwenden Sie einen kleineren render-target für die Partikel aus performance-Gründen.

Ersatz-Shader in Unity sind nicht eine option, entweder: ich will mein Teilchen zu verwenden, Ihre vorhandene Shader - ich will einfach den depth-buffer des Teilchens Kamera überschrieben werden, die mit einer Unterstichprobe (subsampled) version der Hauptkamera depth-buffer, bevor die Partikel gezeichnet werden.

Habe ich nicht bekommen, keine Antwort zu meiner früheren Frage; damit das umbuchen.

Hier ist das Skript an meine Haupt-Kamera. Es macht alle nicht-Partikel-Schichten, und ich benutze OnRenderImage zum aufrufen der Partikel Kamera.

public class MagicRenderer : MonoBehaviour {
public Shader   particleShader; //shader that uses the main camera's depth buffer to depth test particle Z
public Material blendMat;       //material that uses a simple blend shader
public int      downSampleFactor = 1;

private RenderTexture particleRT;
private static GameObject pCam;

void Awake () {
    //make the main cameras depth buffer available to the shaders via _CameraDepthTexture
    camera.depthTextureMode = DepthTextureMode.Depth;
}

//Update is called once per frame
void Update () {

}

void OnRenderImage(RenderTexture src, RenderTexture dest) {
            //create tmp RT
            particleRT = RenderTexture.GetTemporary (Screen.width /downSampleFactor, Screen.height /downSampleFactor, 0);
            particleRT.antiAliasing = 1;

            //create particle cam
            Camera pCam = GetPCam ();
            pCam.CopyFrom (camera); 
            pCam.clearFlags = CameraClearFlags.SolidColor;
            pCam.backgroundColor = new Color (0.0f, 0.0f, 0.0f, 0.0f);
            pCam.cullingMask = 1 << LayerMask.NameToLayer ("Particles");
            pCam.useOcclusionCulling = false;
            pCam.targetTexture = particleRT;
            pCam.depth = 0;

            //Draw to particleRT's colorBuffer using mainCam's depth buffer
            //?? - how do i transfer this camera's depth buffer to pCam?
            pCam.Render ();
            //pCam.RenderWithShader (particleShader, "Transparent"); //I don't want to replace the shaders my particles use; os shader replacement isnt an option.

    //blend mainCam's colorBuffer with particleRT's colorBuffer
    //Graphics.Blit(pCam.targetTexture, src, blendMat);        

    //copy resulting buffer to destination
    Graphics.Blit (pCam.targetTexture, dest);


    //clean up
    RenderTexture.ReleaseTemporary(particleRT);
}

static public Camera GetPCam() {
    if (!pCam) {
        GameObject oldpcam = GameObject.Find("pCam");
        Debug.Log (oldpcam);
        if (oldpcam) Destroy(oldpcam);

        pCam = new GameObject("pCam");
        pCam.AddComponent<Camera>();
        pCam.camera.enabled = false;
        pCam.hideFlags = HideFlags.DontSave;
    }

    return pCam.camera;
}

}

Habe ich ein paar weitere Fragen:

1) Warum camera.depthTextureMode = DepthTextureMode.Depth; am Ende der Zeichnung alle Objekte in der Szene, nur um zu schreiben, um den Z-buffer? Mit Intel GPA, sehe ich zwei Durchgänge, bevor OnRenderImage aufgerufen wird:
(i) Z-PrePass, dass Sie nur schreibt, um den depth-buffer
(ii) Color pass -, schreibt, dass sowohl die color und depth buffer.

2) ich neu gerendert, die opaken Objekte zu pCam ist RT mit einem Ersatz-shader schreibt (0,0,0,0), um den colorBuffer mit ZWrite On (überwindung der depth-buffer transfer-problem). Danach habe ich einen reset der Ebenen und deutliche Maske wie folgt:

pCam.cullingMask = 1 << LayerMask.NameToLayer ("Particles");
pCam.clearFlags = CameraClearFlags.Nothing;

und machte Sie mit pCam.Render().

Dachte ich, das machen die Teilchen mit Ihren vorhandenen Shader mit dem ZTest.
Leider, was ich Bemerke, ist, dass der depth-stencil-Puffer wird geleert, bevor die Partikel (trotz mir nicht-clearing-nichts..).

Warum geschieht dies?

Sorry, ich weiß nicht, wie Sie den depth-buffer wie Sie es beschreiben. Nur um zu klären, warum nicht render-textur für normale use-case? Aus der Einheit docs: -Erstellen Sie eine neue Render-Textur-Element mithilfe von Aktiva->Erstellen->Render-Textur. - Erstellen Sie eine neue Kamera mit GameObject->Erstellen->Kamera. - Weisen Sie die Render-Textur, um die Ziel-Textur der neuen Kamera. - Erstellen Sie eine große, hohe und dünne box - Ziehen Sie die Render-Textur auf es zu schaffen, ein Material, das verwendet die render-textur. - Geben Sie-Play-Modus, und beobachten Sie, dass die box die textur ist in Echtzeit aktualisiert, basierend auf der neuen Kamera-Ausgang.
Danke für die Antwort. MSAA für alpha-blended-Partikel ist zu teuer und I will cut down on it". Kann ich nicht einfach machen das Teilchen zu einem separaten kleinen RT, ohne eine Tiefe testen, da die ich brauche, um sicherzustellen, dass die Partikel hinter undurchsichtigen Objekten sind Z-gekeult.
haben Sie versucht, die Einstellung der clear-flags nicht löschen, render wie diese, dann die Einstellung der flags klare Farbe und Rendern Sie erneut, nur um zu wischen Sie die Farbe?
ja. bevor ich Rendern der Partikel, die ich brauche, um den transfer neu berechnet depth-buffer (der ersten Kamera, - RT), um die zweite RT. das ist, wo ich zu kämpfen.

InformationsquelleAutor Raja | 2014-03-27

Schreibe einen Kommentar