Re: [Algorithms] Multipass alpha-blended objects
Brought to you by:
vexxed72
From: Wesley H. <we...@fu...> - 2005-11-14 23:27:37
|
----- Original Message ----- From: "Miles Macklin" <gd...@co...> > > > 2. Material color was very expensive to generate, so doing it once for > alpha > > and again for color was not acceptable. Some materials were themselves > > multiple passes, so that was basically impracticle. > > Sorry I'm not sure I follow, why would you generate the material colour for > alpha and then generate it again for colour ? But I understand if you have > a material colour that is very expensive and you need access to it in > multiple passes you probably want a temporary copy. > Yeah, I meant your second point. Material color/alpha are generally the same computation, so I'd have to do all the work to seed the framebuffer dest alpha, then do it again when I apply the material color. Not impossible, and at least you get the "correct" answer when doing it this way. > I can't see why doing a bunch of additive passes followed by a green overlay > pass (for example) followed by a fog pass doesn't work. In fact thats > exactly what we do, it just breaks down to: > > result = (((light0 + light1 + > light2)*green)*(1-fogIntensity))+(fogIntensity*fogColour) > Yeah, for opaque objects or offscreen buffers, it is easy and this works. But think about the alpha-blended case we are talking about. For each pass, you only have: * matalpha (in dest alpha) * srccolor (from shader) * accumulated color (in frame buffer) Say you had only 2 additive passes, you'd want: (light0 + light1) * matalpha + fbcolor * (1-matalpha) so split it into passes: pass 1: light0 * matalpha + fbcolor * (1-matalpha) pass 2: light1 * matalpha + 0 This works, but now add material modulation. You'd want: [(light0+light1) * matcolor] * matalpha + fbcolor * (1-matalpha): try to split that into passes: pass 1: light0 * matalpha + fbcolor * (1-matalpha) pass 2: light1 * matalpha + 0 pass 3: MatCol * matalpha * fbcolor * ??? There's no way to do this correctly. Yeah, add fog or other alpha blend types and it's "even more impossible." It's impossible to construct an expression tree using these inputs without requiring a temporary (ie, an offscreen buffer). -Wes |