unity3d: Utilisation de la caméra principale du tampon de profondeur pour le rendu d'une autre vue de la caméra

Après mon appareil photo principal rend, je voudrais utiliser (ou copie) de son tampon de profondeur à un (désactivé) de la caméra du tampon de profondeur.
Mon but est de dessiner des particules sur une petite cible de rendu (à l'aide d'un appareil photo) tout en utilisant le tampon de profondeur après opaque, les objets sont dessinés.
Je ne peux pas faire cela dans une seule caméra, puisque le but est d'utiliser une plus petite cible de rendu pour les particules pour des raisons de performances.

Remplacement des shaders dans l'Unité ne sont pas une option: je veux que mon particules à utiliser leurs shaders - je veux juste le tampon de profondeur de la particule de la caméra d'être écrasé par un sous-échantillonné version de l'appareil photo principal de la profondeur de la mémoire tampon avant que les particules sont attirées.

Je n'ai pas eu de réponse à ma question précédente; par conséquent, le reposter.

Voici le script attaché à mon appareil photo principal. Elle rend tous les non-particules des couches et j'utilise OnRenderImage d'invoquer la particule de la caméra.

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

}

J'ai quelques questions supplémentaires:

1) Pourquoi ne camera.depthTextureMode = DepthTextureMode.Depth; fin du dessin tous les objets dans la scène juste pour écrire dans le Z-buffer? À l'aide d'Intel GPA, je vois deux passages avant OnRenderImage est appelée:
(i) Z-PrePass, qui écrit que dans le tampon de profondeur
(ii) passe de Couleur, qui écrit à la fois la couleur et le tampon de profondeur.

2) je re-rendus des objets opaques à pCam de la RT à l'aide d'un remplacement shader qui écrit (0,0,0,0) à la colorBuffer avec ZWrite On (pour surmonter le tampon de profondeur de transfert de problème). Après, j'ai réinitialiser les couches et claire masque comme suit:

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

et les a rendues à l'aide de pCam.Render().

Je pensais que ce serait rendre les particules à l'aide de leurs shaders avec le ZTest.
Malheureusement, ce que je remarque, c'est que la profondeur stencil buffer est vidé avant que les particules sont tirées (malgré moi de ne pas obtenir quoi que ce soit..).

Pourquoi cela se produit?

Désolé, je ne sais pas comment copier le tampon de profondeur comme vous le décrivez. Juste pour clarifier, pourquoi ne pas utiliser le rendu de la texture, il est normal de cas d'utilisation? À partir de l'Unité docs: -Créer un nouveau Rendu de la Texture de l'actif à l'aide d'Actifs->Create->Render Texture. - Créer un nouvel Appareil photo à l'aide de GameObject->Créer d'Autres->Caméra. - Affecter le Rendu de la Texture à la Cible de la Texture de la nouvelle Caméra. - Créer un grand, grand et mince boîte de Glisser le Rendu de la Texture sur celui-ci pour créer un Matériau qui utilise le rendu de la texture. - Entrer en Mode de lecture, et observer que la texture est mis à jour en temps réel en fonction de la nouvelle Caméra de sortie.
Merci pour la réponse. MSAA pour alpha mélangé à des particules est trop cher et je tiens à les couper vers le bas sur elle. Je ne peux pas juste de rendre les particules d'un petit RT sans un test de profondeur car j'ai besoin d'assurer que les particules derrière les objets opaques sont Z-cueilli.
avez-vous essayé le réglage de la claire drapeaux à Ne pas effacer, à les rendre comme ça, puis en définissant les drapeaux de couleur claire et de rendre à nouveau, juste pour effacer la couleur?
ouais. avant de rendre les particules, j'ai besoin de transférer le sous-échantillonnées tampon de profondeur (de la première caméra RT) à la seconde RT. c'est là que je me bats.

OriginalL'auteur Raja | 2014-03-27