- Home /
How do I insert custom rendering before transparent objects?
I want to put some custom rendering code in, after rendering solid geometry, but before transparencies. If I add code to call a native plugin with GL.IssuePluginEvent in a camera script in OnPostRender, the drawing comes after transparent objects.
How can I draw in between geometry and transparencies using GL.IssuePluginEvent?
If I directly call my native plugin rendercode from OnRenderImage, that produces a thread conflict because we're on the main thread, not the render thread. So it works, but occasionally crashes.
1 This code renders after transparencies, thus obscuring particle systems etc.:
void OnPostRender()
{
GL.IssuePluginEvent (EVENT_ID);
}
2 This code renders after opaque objects and before transparencies, but has a thread conflict:
[ImageEffectOpaque]
void OnRenderImage(RenderTexture source,RenderTexture destination)
{
UnityRenderEvent(EVENT_ID);
}
3 Whereas this code renders after transparencies, in spite of issuing the event before they are rendered:
[ImageEffectOpaque]
void OnRenderImage(RenderTexture source,RenderTexture destination)
{
UnityRenderEvent(EVENT_ID);
}
So, only version 2 above produces the correct effect, but it is not usable.
I'm very unfamiliar with the GL class, but I assume setting the material to use a shader that is a Queue point Geometry+1 doesn't work?
There is no material. GL.IssuePluginEvent produces a call on the rendering thread to a native plugin.
Ahh my bad, in that case I am unlikely to be of any help! The only other idea I can think of would be to have 2 cameras, one that renders geometry, then you have your plugin and then paint a second 'transparent layer' camera over that but it seems rather hacky and hopefully someone cleverer than me will point you in the right/better direction :D good luck
I'm confused by parts 2 and 3. They appear to be the exact same code, so I am not sure how they could be executing in a different order than one another. At any rate, OnRenderImage happens after OnPostRender, so I believe you should be able to add [ImageEffectOpaque] to code section 1 to issue your event after the Opaque geometry. OnRenderImage is supposed to be called after the entire scene is Rendered.
Your answer
Follow this Question
Related Questions
Transparent object with look front of all object 0 Answers
Render texture above something else 1 Answer
Fading in/out SVGs without showing the half-transparent SVG-layers 1 Answer
Native Plugin: What has to happen in the RenderEvent? 1 Answer
DrawProcedural() in OnPostRender() drawing over transparent objects 1 Answer