How to render a 2D "world" sprite on top of 3D

I’m talking about a sprite that has a position inside the scene. It should always be rendered on top of anything that is 3D.

Using the UI system would work, but I would have to manually update the sprite’s position every frame according to camera movement etc.

Using StaticSprite2D means that it rotates along with the node it is attached to, which I don’t want. I only want it to move with the node. And I can’t be 100% sure that the sprite is rendered on top of anything 3D, unless I raise the y position substantially, but that brings its own problems with a perspective camera.

Is there an easy solution?

So… like a Doom sprite?

I’m not sure. I’m doing a top-down RTS where when I select units a 2d health bar is shown for each unit, for example.

I think you are talking about billboard right?

Yes, I forgot about billboard!
Sadly, there is still no option to render it on top of 3d. Of course I can offset the position, but with a perspective camera one can clearly see how much it is raised if the camera is not directly above it.

Edit: I tried using a material that alters the renderorder value to something larger than the deafult 128, but it still won’t render on top of a 3d model.

Create a specific material & technique combination for your sprites. Set the depth-test in your technique’s passes to always so that they’ll always pass the depth test, that will guarantee that their fragments pass Z-test. Leave shadow related passes alone, it won’t matter there.

Render order still matters, leave it as something larger so that they’ll render later than other things.

3 Likes

Setting depthtest to always did the trick, thanks!