Sign in to follow this  

How do I handle transparency

Recommended Posts

Hey guys, so basically I'm trying to figure out my render path, and I've come to the issue of transparent objects. I'm simply unsure where to do forward rendering. I know it, especially because some of it may take into account refraction and reflection. Do I simply draw it with every other object and put all forward shading in a separate buffer? Do I do it in a separate pass after the opaque shading, and if so, isn't it a lot of overhead to pass through all the meshes that were already drawn separately and pass skeletal information and all other things again? And is reflection and refraction handled with the initial forward draw or in post processing? Thanks in Advance!

Share this post


Link to post
Share on other sites

Actually, let me narrow down the question to this, as I think there are enough resources on everything else:

 

 

Since the best way to handle transparency is apparently to have a separate pass after the geometry rendering and deferred pass,  how do you suggest I prevent iterating over every bit of geometry in the world, especially when they're linked to the opaque geometry with things such as skeletal animation (ie, a head visor on a soldier, etc)

Share this post


Link to post
Share on other sites

I don't really understand the question. Why do you need to iterate over every geometry in the world? Are you talking about the objects that show up in reflections (i.e. planar reflections)? Or do you mean making sure that objects/materials that are transparent and part of an opaque mesh need to be reskinned?

Edited by Styves

Share this post


Link to post
Share on other sites

I don't really understand the question. Why do you need to iterate over every geometry in the world? Are you talking about the objects that show up in reflections (i.e. planar reflections)? Or do you mean making sure that objects/materials that are transparent and part of an opaque mesh need to be reskinned?

I mean that when you render, you render opaque objects for a deferred pass before transparent ones for a forward pass. If 5% of your models are entirely transparent, and 5% are partially transparent (half opaque materials, half transparent materials), is there a way to draw the transparent objects without iterating through 100% of your models. The only way I can think of is keeping an array of all transparent geometry separate from the opaque ones, but that sounds like a bad idea.

Share this post


Link to post
Share on other sites

it is not a bad idea at all, it is how most implementations work.

you simply keep an array (or any data structure you think is better) for each render type. one for opaque, one for transparent, one for a custom fancy rendering effect (skin ?)

it is both simple to implement and effecient to travers

Share this post


Link to post
Share on other sites

Like Yourself said, it's actually very common to have separate rendering lists. In CryEngine, we have separate rendering lists that the renderer processes in a specific order. When we want to draw something we add it to the respective list (general/opaque, transparent, etc). You can also batch shaders and textures this way if you know they won't change between draws.

 

What I normally do is quite similar and separate my draw calls from my models. For each model, I go over every material, and submit a draw item to my renderer. The draw contains information like which material to use, what mesh, the start vertex and element size to draw, etc. The renderer just sorts these items by material attributes (transparent, blend states, etc) before rendering and then draws them. If your model has a transparent part and an opaque part, then that would be two draw items submitted to the renderer and drawn at the appropriate times.

Edited by Styves

Share this post


Link to post
Share on other sites
The only way I can think of is keeping an array of all transparent geometry separate from the opaque ones

bingo, optimization via data oriented design.

But what's the way this is done usually, especially in regard to BOTH transparency sorting and skeletal animation, especially considering the geometry is shared? Is there a document or presentation of ways of object management for geometry? I'm aiming for maximum data locality so I need to find out a way to do this.

 

Also is transparency sorted by poly, submesh, or object? The first seems almost impossible to do safely. The second seems to be difficult to manage (especially since I'm using VAOs rather than manual vertices), and the last seems difficult (what about different mesh sizes, and multiple transparent objects per object?)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this