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?
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konnte ich wiederverwenden, Kamera, Z-buffer "manuell" in der shader für das rendering. Sehen http://forum.unity3d.com/threads/reuse-depth-buffer-of-main-camera.280460/ für mehr.
Verändern die Partikel-shader verwenden Sie bereits für die Partikel-rendering.
Material.SetTexture("_CameraDepthTexture", Camera.main.<something>
Linie irgendwo?Einfach docs.unity3d.com/ScriptReference/Camera-depthTextureMode.html
Sobald Sie Hinzugefügt, die Zeile, die Tiefe textur wird "angekündigt" Global alle über die Shader, zugänglich über
_CameraDepthTexture
.Sie können erstellen, ein pass, schreibt der Z-buffer der
RenderTexture
vor dem eigentlichen Rendern, dann ZTests wird wohl automatisch gemacht.Interessant. Ich bin gonna check it out. Wenn ich das Letzte profilierte meine Szene, wobei ich
camera.depthTextureMode
in meinem Skript, bemerkte ich, dass die Einheit hat bei einem Z-prepass mit der gesamten Szene (wie gesehen durch die Kamera). Das ist wirklich beschissen aus einem perf Sicht. Sie alle geometrie zweimal statt nur die Wiederverwendung der Z-buffer ist ein großer hit.InformationsquelleAutor Geri