Outline "glow" effect

Started by
6 comments, last by RobM 10 years ago

Hey there, it might have been asked before, but does anybody have an idea of how to implement an effect like this: (dota 2)

unbenannt9fe52.png

my idea was to render the backfaces of the mesh slightly scaled up first, but I think this wouldnt always work, since the scaling shouldnt always happen from the "center" of the mesh. Maybe the mesh itself is rendered and the resulting image is scaled up? I also don't know how to achieve a "glow". Any ideas?

Advertisement

http://prideout.net/blog/?p=61

I think, therefore I am. I think? - "George Carlin"
My Website: Indie Game Programming

My Twitter: https://twitter.com/indieprogram

My Book: http://amzn.com/1305076532

The traditional way to do a glow effect is to render the glowing objects into a render texture with a shader that just writes a flat colour.

Then you run a blur on this generated texture so the end result is bigger than the objects.

Then you render everything apart from the glowing objects, alpha blend the generated texture over the top, then render the glowing objects.

That's the traditional way of doing it.

There are faster techniques, but they are more complex.

http://http.developer.nvidia.com/GPUGems/gpugems_ch21.html

http://xbox.create.msdn.com/en-US/education/catalog/sample/bloom

http://digitalerr0r.wordpress.com/2009/10/04/xna-shader-programming-tutorial-24-bloom/

http://devmaster.net/posts/3100/shader-effects-glow-and-bloom#vertex-tabs-2


The traditional way to do a glow effect is to render the glowing objects into a render texture with a shader that just writes a flat colour.

Then you run a blur on this generated texture so the end result is bigger than the objects.

Then you render everything apart from the glowing objects, alpha blend the generated texture over the top, then render the glowing objects.

slightly different version

- get a render target and a depth stencil target

- clear the render target, zbuffer and the stencil buffer

- render all the glowing objects to a render target with a flat color and in the same time increase the stencil value

- blur the render target

- render the blurred image with alpha blending on top the 3d scene with stencil testing to discard pixels with non-zero stencil value. The stencil test will make the objects not to have any hilite color on them.

This way seems slightly easier and less complex as the proposed one.

Cheers!

Not sure if there was some kind of misunderstanding here. What the two posters above me described is a "bloom" effect, right? I'm talking about the green glow around the dragon that happens when you hover a unit in dota2. I think left for dead 2 has it too.

A bloom effect is not what I want, but the outline of the rendered mesh around it.


but the outline of the rendered mesh around it.

Which is most likly a bloom effect smile.png

In other words: Render the model in just green, blur the rendered image, copy the blurred image into the final scene, but ignore the pixel which are occupied by the model itself (eg by using the stencil buffer).

Thanks, I was just making sure.

And thanks everybody for the input. appreciated.

An possible single-pass alternative could be to extrude silhouettes into quads in the geometry shader (much like you do for fin/fur rendering) and set one vertex attribtue to 0 on the original vertices, and to 1 on the extruded ones, so it ends up as an interpolated falloff in the fragment shader. For non-silhouette vertices, the attribute should be a negative value, so interpolating with the zero values at the object border always gives a zero-or-negative value, which you can clamp to zero (otherwise you would have glow outside, and inside as well, which isn't nice!).

This attribute can then be inverted (so it falls off the more distant a fragment is to the object) and fed to e.g. smoothstep or used as lookup in an artist-supplied 1D-texture and finally be colorized, green, or what you like (maybe with a little noise as well, to make it "more interesting").

That presumes, of course, that have a geometry shader functionality, but that is a pretty safe bet nowadays.

EDIT:

If dynamic branching is fast (acceptable) on the target architecture, the complicated clamping of the glow attribute isn't even necessary. Instead, every vertex in the object could just have that attribute set to 1 and the extruded ones would have 0. This would interpolate to 1 everywhere inside the object, and fall off to zero outside.

Then, assuming you use alpha, the fragment shader could be something really simple like if(glow_factor == 1.0) { color = shade_normally(); } else { color = vec4(GREEN, smoothstep(0, 1, glow_factor)); }

Is the object you're drawing a 3d one? If it is, and I haven't tried this, you could try drawing it bigger but in a block colour (like the green in your example) and in the shader, fall off to transparent for any pixels on triangles which are not facing toward the viewer. So if you imagine a sphere, get the angle between each face and the viewer, the bigger the angle, the more transparent the pixel. Not sure what this would look like but it would be super-fast

This topic is closed to new replies.

Advertisement