View previous topic :: View next topic |
Author |
Message |
GiffE
Joined: 08 Oct 2006 Posts: 141 Location: USA, CT
|
Posted: Sat May 22, 2010 10:46 pm Post subject: |
|
|
Made a glsl sobel edge detection filter effect for outlines.
Yes that's the Taov model, just using it temporarily.
The code in the post process, fragment shader.
Code: | float result,temp;
float col[9];
int i;
float x,y ;
for(i=0;i<9;i++)
{
col[i] = texture2D(Texture_First, TexCoord1+PixelSize *offsets[i]).x * EdgeSize;
}
x= -col[6]-2*col[7]-col[8]+col[0]+2*col[1]+col[2];
y= -col[0]-2*col[3]-col[6]+col[2]+2*col[5]+col[8];
temp = x*x+y*y;
result = sqrt(temp);
if(result>255.0)result=255.0;
gl_FragColor.r -= result;
gl_FragColor.b -= result;
gl_FragColor.g -= result; |
Where:
Code: |
const float EdgeSize = 0.2;
vec2 offsets[9] =
{
vec2(-1,-1),vec2(-1, 0 ),vec2(-1,1),
vec2( 0,-1 ),vec2( 0,0),vec2( 0,1),
vec2( 1,-1),vec2( 1, 0),vec2( 1,1)
}; |
_________________ http://www.giffe-bin.net/ |
|
Back to top |
|
 |
Urre

Joined: 05 Nov 2004 Posts: 1073 Location: Sweden
|
Posted: Sun May 23, 2010 10:30 am Post subject: |
|
|
Very cool! Can I steal this and release as GPL?
EDIT: Hm, I can't figure out where in default.glsl to put this? _________________ Look out for Twigboy |
|
Back to top |
|
 |
Irritant
Joined: 19 May 2008 Posts: 115 Location: Maryland
|
Posted: Sun May 23, 2010 1:35 pm Post subject: |
|
|
Very very cool shader, yes let us know if we can use it  _________________ http://red.planetarena.org - Alien Arena |
|
Back to top |
|
 |
GiffE
Joined: 08 Oct 2006 Posts: 141 Location: USA, CT
|
Posted: Sun May 23, 2010 5:02 pm Post subject: |
|
|
Thanks, you can GPL it all ya want
If you don't know where to put it make your entire MODE_POSTPROCESS part of glsl/default.glsl look like this:
Code: |
#ifdef MODE_POSTPROCESS
varying vec2 TexCoord1;
varying vec2 TexCoord2;
#ifdef VERTEX_SHADER
void main(void)
{
gl_Position = ModelViewProjectionMatrix * gl_Vertex;
TexCoord1 = gl_MultiTexCoord0.xy;
#ifdef USEBLOOM
TexCoord2 = gl_MultiTexCoord1.xy;
#endif
}
#endif
#ifdef FRAGMENT_SHADER
uniform sampler2D Texture_First;
#ifdef USEBLOOM
uniform sampler2D Texture_Second;
#endif
#ifdef USEGAMMARAMPS
uniform sampler2D Texture_GammaRamps;
#endif
#ifdef USESATURATION
uniform float Saturation;
#endif
#ifdef USEVIEWTINT
uniform vec4 ViewTintColor;
#endif
//uncomment these if you want to use them:
uniform vec4 UserVec1;
// uniform vec4 UserVec2;
// uniform vec4 UserVec3;
// uniform vec4 UserVec4;
// uniform float ClientTime;
uniform vec2 PixelSize;
const float EdgeSize = 0.2;
vec2 offsets[9] =
{
vec2(-1,-1),vec2(-1, 0 ),vec2(-1,1),
vec2( 0,-1 ),vec2( 0,0),vec2( 0,1),
vec2( 1,-1),vec2( 1, 0),vec2( 1,1)
};
void main(void)
{
gl_FragColor = texture2D(Texture_First, TexCoord1);
#ifdef USEBLOOM
gl_FragColor += texture2D(Texture_Second, TexCoord2);
#endif
#ifdef USEVIEWTINT
gl_FragColor = mix(gl_FragColor, ViewTintColor, ViewTintColor.a);
#endif
#ifdef USEPOSTPROCESSING
// do r_glsl_dumpshader, edit glsl/default.glsl, and replace this by your own postprocessing if you want
// this code does a blur with the radius specified in the first component of r_glsl_postprocess_uservec1 and blends it using the second component
float result,temp;
float col[9];
int i;
float x,y ;
for(i=0;i<9;i++)
{
col[i] = texture2D(Texture_First, TexCoord1+PixelSize *offsets[i]).x * EdgeSize;
}
x= -col[6]-2*col[7]-col[8]+col[0]+2*col[1]+col[2];
y= -col[0]-2*col[3]-col[6]+col[2]+2*col[5]+col[8];
temp = x*x+y*y;
result = sqrt(temp);
if(result>255.0)result=255.0;
gl_FragColor.r -= result;
gl_FragColor.b -= result;
gl_FragColor.g -= result;
gl_FragColor += texture2D(Texture_First, TexCoord1 + PixelSize*UserVec1.x*vec2(-0.987688, -0.156434)) * UserVec1.y;
gl_FragColor += texture2D(Texture_First, TexCoord1 + PixelSize*UserVec1.x*vec2(-0.156434, -0.891007)) * UserVec1.y;
gl_FragColor += texture2D(Texture_First, TexCoord1 + PixelSize*UserVec1.x*vec2( 0.891007, -0.453990)) * UserVec1.y;
gl_FragColor += texture2D(Texture_First, TexCoord1 + PixelSize*UserVec1.x*vec2( 0.707107, 0.707107)) * UserVec1.y;
gl_FragColor += texture2D(Texture_First, TexCoord1 + PixelSize*UserVec1.x*vec2(-0.453990, 0.891007)) * UserVec1.y;
gl_FragColor /= (1 + 5 * UserVec1.y);
#endif
#ifdef USESATURATION
//apply saturation BEFORE gamma ramps, so v_glslgamma value does not matter
float y = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));
//gl_FragColor = vec3(y) + (gl_FragColor.rgb - vec3(y)) * Saturation;
gl_FragColor.rgb = mix(vec3(y), gl_FragColor.rgb, Saturation);
#endif
#ifdef USEGAMMARAMPS
gl_FragColor.r = texture2D(Texture_GammaRamps, vec2(gl_FragColor.r, 0)).r;
gl_FragColor.g = texture2D(Texture_GammaRamps, vec2(gl_FragColor.g, 0)).g;
gl_FragColor.b = texture2D(Texture_GammaRamps, vec2(gl_FragColor.b, 0)).b;
#endif
}
#endif
#else // !MODE_POSTPROCESS
|
Also playing around with the EdgeSize constant will change its intensity. I set it quite low for now. _________________ http://www.giffe-bin.net/
Last edited by GiffE on Sun May 23, 2010 5:13 pm; edited 1 time in total |
|
Back to top |
|
 |
Urre

Joined: 05 Nov 2004 Posts: 1073 Location: Sweden
|
Posted: Sun May 23, 2010 5:10 pm Post subject: |
|
|
 _________________ Look out for Twigboy |
|
Back to top |
|
 |
leileilol

Joined: 15 Oct 2004 Posts: 1321
|
Posted: Sun May 23, 2010 6:57 pm Post subject: |
|
|
i'm not really a big fan of post processed celshading.
in DP i did a weirder way to do celshading, done by inclined normal edges. this screwed up map rendering though, but looks better on shapely models in rtworld and doesn't get in the way of the particles. _________________
 |
|
Back to top |
|
 |
Urre

Joined: 05 Nov 2004 Posts: 1073 Location: Sweden
|
Posted: Sun May 23, 2010 7:16 pm Post subject: |
|
|
I like anything that fits the given game. I generally dig the look of post-process outlining, it's a yummy dirty look, reminds me of Okami. _________________ Look out for Twigboy |
|
Back to top |
|
 |
leileilol

Joined: 15 Oct 2004 Posts: 1321
|
Posted: Mon May 24, 2010 8:32 am Post subject: |
|
|
Here's what my shader looked like in Quake
It's not intended for Quake, but it does sort of make it look like Street Fighter IV. None of this is post-processed or edge detecting. _________________
 |
|
Back to top |
|
 |
Urre

Joined: 05 Nov 2004 Posts: 1073 Location: Sweden
|
Posted: Mon May 24, 2010 11:55 am Post subject: |
|
|
What is it if not post-process? Looks cool nonetheless! Might be cool combined with the edge detection post-process  _________________ Look out for Twigboy |
|
Back to top |
|
 |
Spirit

Joined: 20 Nov 2004 Posts: 476
|
Posted: Mon May 24, 2010 12:03 pm Post subject: |
|
|
That looks even better than Tenebrae!  _________________ Quake Maps |
|
Back to top |
|
 |
frag.machine

Joined: 25 Nov 2006 Posts: 728
|
Posted: Mon May 24, 2010 12:20 pm Post subject: |
|
|
You can call it "skin seam edge magnifier"  _________________ frag.machine - Q2K4 Project
http://fragmachine.quakedev.com/ |
|
Back to top |
|
 |
GiffE
Joined: 08 Oct 2006 Posts: 141 Location: USA, CT
|
Posted: Mon May 24, 2010 5:54 pm Post subject: |
|
|
Fixed the warnings:
http://www.pasteall.org/13345
To fix them add:
to the very first line of glsl/default.glsl
Then change:
Code: | vec2 offsets[9] =
{
vec2(-1,-1),vec2(-1, 0 ),vec2(-1,1),
vec2( 0,-1 ),vec2( 0,0),vec2( 0,1),
vec2( 1,-1),vec2( 1, 0),vec2( 1,1)
}; |
to:
Code: | vec2 offsets[9] = vec2[] (
vec2(-1.0,-1.0),vec2(-1.0, 0 ),vec2(-1.0,1.0),
vec2( 0,-1.0 ),vec2( 0,0),vec2( 0,1.0),
vec2( 1.0,-1.0),vec2( 1.0, 0),vec2( 1.0,1.0)
); |
And change:
Code: | x= -col[6]-2*col[7]-col[8]+col[0]+2*col[1]+col[2];
y= -col[0]-2*col[3]-col[6]+col[2]+2*col[5]+col[8]; |
to:
Code: | x= -col[6]-2.0*col[7]-col[8]+col[0]+2.0*col[1]+col[2];
y= -col[0]-2.0*col[3]-col[6]+col[2]+2.0*col[5]+col[8]; |
and lastly
Code: | gl_FragColor /= (1 + 5 * UserVec1.y); |
to:
Code: | gl_FragColor /= (1.0 + 5.0 * UserVec1.y); |
They were silly warnings for type casting and junk, so all that was needed was to change some of those int's to floats, also I didn't know how glsl array syntax worked, so I fixed that.
EDIT:
Oh and here's what start looks like:
Looks Borderlands-esque which was what I was shooting for  _________________ http://www.giffe-bin.net/ |
|
Back to top |
|
 |
Teiman
Joined: 03 Jun 2007 Posts: 309
|
Posted: Mon May 24, 2010 6:38 pm Post subject: |
|
|
you out-tenbrae tenebrae!  |
|
Back to top |
|
 |
r00k
Joined: 13 Nov 2004 Posts: 483
|
Posted: Mon May 24, 2010 9:58 pm Post subject: |
|
|
Is it also outlining the filtered textures not just the edges?
The texture looks paintbrushed though I like this effect!! Maybe skip the player texture so it stands out better.
Can I ask a stupid question: where do I put default.glsl? |
|
Back to top |
|
 |
Sajt
Joined: 16 Oct 2004 Posts: 1026
|
Posted: Mon May 24, 2010 10:47 pm Post subject: |
|
|
Urre wrote: | What is it if not post-process? Looks cool nonetheless! Might be cool combined with the edge detection post-process  |
What he did is probably like the "fresnel" type of shader, where you add an effect (such as darkening, or adding a colour) to a degree based on the dot product between its normal and the 3D vector between the point and your eye. So surfaces that are facing toward you are the same, but surfaces approaching perpendicular to your vision have the effect in full. Not a post process at all, it's like any other lighting shader. Here are two images of that type of shader being used to add a green glow:
http://quakery.quakedev.com/screenshots/screen114.jpg
http://quakery.quakedev.com/screenshots/screen115.jpg _________________ F. A. Špork, an enlightened nobleman and a great patron of art, had a stately Baroque spa complex built on the banks of the River Labe. |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2004 phpBB Group
|