Jump to content

  • Log In with Google      Sign In   
  • Create Account


Outline "glow" effect


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
8 replies to this topic

#1 Doublefris   Members   -  Reputation: 300

Like
0Likes
Like

Posted 14 April 2014 - 03:42 PM

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?



Sponsor:

#2 Glass_Knife   Moderators   -  Reputation: 3891

Like
1Likes
Like

Posted 14 April 2014 - 04:40 PM

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


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

#3 Stainless   Members   -  Reputation: 816

Like
4Likes
Like

Posted 14 April 2014 - 04:59 PM

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



#4 kauna   Crossbones+   -  Reputation: 2288

Like
1Likes
Like

Posted 14 April 2014 - 09:54 PM


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!


Edited by kauna, 14 April 2014 - 09:56 PM.


#5 Doublefris   Members   -  Reputation: 300

Like
0Likes
Like

Posted 15 April 2014 - 03:31 AM

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.



#6 Ashaman73   Crossbones+   -  Reputation: 6960

Like
2Likes
Like

Posted 15 April 2014 - 05:18 AM


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).



#7 Doublefris   Members   -  Reputation: 300

Like
0Likes
Like

Posted 15 April 2014 - 07:26 AM

Thanks, I was just making sure.

 

And thanks everybody for the input. appreciated.



#8 samoth   Crossbones+   -  Reputation: 4658

Like
1Likes
Like

Posted 15 April 2014 - 09:15 AM

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)); }


Edited by samoth, 15 April 2014 - 09:26 AM.


#9 RobMaddison   Members   -  Reputation: 642

Like
0Likes
Like

Posted 15 April 2014 - 12:08 PM

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




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS