- Home /
Canvas Rendering Execution Order Question
Hello there!
tl;dr Trying to make cameras only render the scene they are in (to ignore additive scenes). Canvases don't work. PLZ HELP.
I'm currently trying to write a system that makes certain cameras, designated by a script, only render the objects within it's scene. This way, if I have scenes loaded additively, the camera only renders its own scene. I currently have MeshRenderers working.
My current system has the camera call a function on all the renderer components in its OnPreCull event that disables the renderer component if it is in a different scene than the camera. Then, in the camera's OnPostRender event, it calls another function on all the renderer components that re-enables them. This way, if the object is in another scene, it disables it just before it begins rendering, and it re-enables it just after it renders. And since OnPreCull and OnPostRender happens per camera, that means that if I have two cameras in separate scenes, they should still only render what is in their scene.
My problem occurs when I try and include Canvases. It seems that Canvases do not follow the same rendering loop that MeshRenderers do. When I tried to do the same thing I did with MeshRenderers, nothing happened. I tried to disable the Canvas component. I also tried using the "cull" property in the CanvasRenderer component. No luck.
I'm thinking that the Canvas has its own rendering loop of some kind, outside the OnPreCull/OnPostRender. Unfortunately, I can't find any documentation on such callbacks. If anyone has some clues to help me out, I would really appreciate it :)
Edit:
Looking into it, I found some interesting things related to Canvases:
First, There is an enum called "CanvasUpdate", which suggests some stuff I could maybe use for this like PreRender, although no post render.
I also found an event called "willRenderCanvases" on Canvas, and it seems to run once per canvas for all canvases (which is actually undesirable for me, but I can probably deal with that). I can't seem to find which Camera it is rendering with, because I have 2 in my scene, but when I tried to print "Camera.current" it gave me only one of them twice (1 for each Canvas I have). I also didn't seem to have access to the canvas it was rendering? Seems very strange to me.
I found IClipper and ClipperRegistry, but I had similar problems to the "willRenderCanvases" event.
I found CanvasUpdateRegistry, but that seems to be for forcing a canvas to rebuild or something.