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?
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
Vous devez vous connecter pour publier un commentaire.
J'ai réussi à la réutilisation de la caméra Z-buffer "manuellement" dans le shader utilisé pour le rendu. Voir http://forum.unity3d.com/threads/reuse-depth-buffer-of-main-camera.280460/ pour plus d'.
Suffit alors de modifier la particule shader que vous utilisez déjà pour un rendu de particules.
Material.SetTexture("_CameraDepthTexture", Camera.main.<something>
ligne quelque part?Simplement docs.unity3d.com/ScriptReference/Camera-depthTextureMode.html
Une fois que vous avez ajouté cette ligne, la profondeur de la texture se fait de la publicité à l'échelle mondiale tous sur les shaders, accessible par
_CameraDepthTexture
.Vous pouvez créer un laissez-passer qui écrit le Z-buffer de la
RenderTexture
avant le rendu final, puis ZTests sera probablement fait automatiquement.Intéressant. Je vais le vérifier. Lors de ma dernière profilé de ma scène, dans lequel j'ai mis
camera.depthTextureMode
dans mon script, j'ai remarqué que l'Unité n'a Z-prepass avec l'ensemble de la scène (comme on le voit par la caméra). Qui est vraiment nulle à partir d'un perf point de vue. La soumission de tous à la géométrie de deux fois au lieu de simplement en réutilisant le Z-buffer est un énorme succès.OriginalL'auteur Geri