Skip to content
Snippets Groups Projects
Commit 8d85d297 authored by David Parks's avatar David Parks
Browse files

merge

parents 29d67f0c 728463b4
No related branches found
No related tags found
No related merge requests found
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
* $License$ * $License$
*/ */
#version 120 #version 120
#extension GL_ARB_texture_rectangle : enable #extension GL_ARB_texture_rectangle : enable
...@@ -15,6 +14,7 @@ uniform sampler2DRect specularRect; ...@@ -15,6 +14,7 @@ uniform sampler2DRect specularRect;
uniform sampler2DRect depthMap; uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap; uniform sampler2DRect normalMap;
uniform samplerCube environmentMap; uniform samplerCube environmentMap;
uniform sampler2DRect lightMap;
uniform sampler2D noiseMap; uniform sampler2D noiseMap;
uniform sampler2D lightFunc; uniform sampler2D lightFunc;
uniform sampler2D projectionMap; uniform sampler2D projectionMap;
...@@ -26,12 +26,15 @@ uniform vec3 proj_n; ...@@ -26,12 +26,15 @@ uniform vec3 proj_n;
uniform float proj_focus; //distance from plane to begin blurring uniform float proj_focus; //distance from plane to begin blurring
uniform float proj_lod; //(number of mips in proj map) uniform float proj_lod; //(number of mips in proj map)
uniform float proj_range; //range between near clip and far clip plane of projection uniform float proj_range; //range between near clip and far clip plane of projection
uniform float proj_ambient_lod;
uniform float proj_ambiance; uniform float proj_ambiance;
uniform float near_clip; uniform float near_clip;
uniform float far_clip; uniform float far_clip;
uniform vec3 proj_origin; //origin of projection to be used for angular attenuation uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
uniform float sun_wash; uniform float sun_wash;
uniform int proj_shadow_idx;
uniform float shadow_fade;
varying vec4 vary_light; varying vec4 vary_light;
...@@ -40,6 +43,52 @@ uniform vec2 screen_res; ...@@ -40,6 +43,52 @@ uniform vec2 screen_res;
uniform mat4 inv_proj; uniform mat4 inv_proj;
vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
{
vec4 ret = texture2DLod(projectionMap, tc, lod);
vec2 dist = tc-vec2(0.5);
float det = max(1.0-lod/(proj_lod*0.5), 0.0);
float d = dot(dist,dist);
ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0);
return ret;
}
vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
{
vec4 ret = texture2DLod(projectionMap, tc, lod);
vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
float det = min(lod/(proj_lod*0.5), 1.0);
float d = min(dist.x, dist.y);
float edge = 0.25*det;
ret *= clamp(d/edge, 0.0, 1.0);
return ret;
}
vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
{
vec4 ret = texture2DLod(projectionMap, tc, lod);
vec2 dist = tc-vec2(0.5);
float d = dot(dist,dist);
ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
return ret;
}
vec4 getPosition(vec2 pos_screen) vec4 getPosition(vec2 pos_screen)
{ {
float depth = texture2DRect(depthMap, pos_screen.xy).a; float depth = texture2DRect(depthMap, pos_screen.xy).a;
...@@ -68,7 +117,7 @@ void main() ...@@ -68,7 +117,7 @@ void main()
{ {
discard; discard;
} }
vec3 norm = texture2DRect(normalMap, frag.xy).xyz*2.0-1.0; vec3 norm = texture2DRect(normalMap, frag.xy).xyz*2.0-1.0;
norm = normalize(norm); norm = normalize(norm);
...@@ -83,7 +132,11 @@ void main() ...@@ -83,7 +132,11 @@ void main()
proj_tc.xyz /= proj_tc.w; proj_tc.xyz /= proj_tc.w;
float fa = gl_Color.a+1.0; float fa = gl_Color.a+1.0;
float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
if (dist_atten <= 0.0)
{
discard;
}
lv = proj_origin-pos.xyz; lv = proj_origin-pos.xyz;
lv = normalize(lv); lv = normalize(lv);
...@@ -101,32 +154,32 @@ void main() ...@@ -101,32 +154,32 @@ void main()
proj_tc.y > 0.0) proj_tc.y > 0.0)
{ {
float lit = 0.0; float lit = 0.0;
float amb_da = proj_ambiance;
if (da > 0.0) if (da > 0.0)
{ {
float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
float lod = diff * proj_lod; float lod = diff * proj_lod;
vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod); vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a; vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise; lit = da * dist_atten * noise;
col = lcol*lit*diff_tex; col = lcol*lit*diff_tex;
amb_da += (da*0.5)*proj_ambiance;
} }
float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
float lod = diff * proj_lod; vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
vec4 amb_plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
//float amb_da = mix(proj_ambiance, proj_ambiance*max(-da, 0.0), max(da, 0.0));
float amb_da = proj_ambiance;
amb_da += (da*da*0.5+0.5)*proj_ambiance; amb_da += (da*da*0.5+0.5)*proj_ambiance;
amb_da *= dist_atten * noise; amb_da *= dist_atten * noise;
amb_da = min(amb_da, 1.0-lit); amb_da = min(amb_da, 1.0-lit);
col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
} }
...@@ -144,35 +197,28 @@ void main() ...@@ -144,35 +197,28 @@ void main()
{ {
vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
vec3 stc = (proj_mat * vec4(pfinal.xyz, 1.0)).xyz; vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
if (stc.z > 0.0) if (stc.z > 0.0)
{ {
stc.xy /= stc.z+proj_near; stc.xy /= stc.w;
float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0);
stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);
if (stc.x < 1.0 && if (stc.x < 1.0 &&
stc.y < 1.0 && stc.y < 1.0 &&
stc.x > 0.0 && stc.x > 0.0 &&
stc.y > 0.0) stc.y > 0.0)
{ {
vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb; col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
} }
} }
} }
} }
/*if (spec.a > 0.0)
{
//vec3 ref = reflect(normalize(pos), norm);
float sa = dot(normalize(lv-normalize(pos)),norm);;
//sa = max(sa, 0.0);
//sa = pow(sa, 128.0 * spec.a*spec.a/dist_atten)*min(dist_atten*4.0, 1.0);
sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
sa *= noise;
col += da*sa*lcol*spec.rgb;
}*/
gl_FragColor.rgb = col; gl_FragColor.rgb = col;
gl_FragColor.a = 0.0; gl_FragColor.a = 0.0;
} }
...@@ -43,6 +43,52 @@ uniform vec2 screen_res; ...@@ -43,6 +43,52 @@ uniform vec2 screen_res;
uniform mat4 inv_proj; uniform mat4 inv_proj;
vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
{
vec4 ret = texture2DLod(projectionMap, tc, lod);
vec2 dist = tc-vec2(0.5);
float det = max(1.0-lod/(proj_lod*0.5), 0.0);
float d = dot(dist,dist);
ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0);
return ret;
}
vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
{
vec4 ret = texture2DLod(projectionMap, tc, lod);
vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
float det = min(lod/(proj_lod*0.5), 1.0);
float d = min(dist.x, dist.y);
float edge = 0.25*det;
ret *= clamp(d/edge, 0.0, 1.0);
return ret;
}
vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
{
vec4 ret = texture2DLod(projectionMap, tc, lod);
vec2 dist = tc-vec2(0.5);
float d = dot(dist,dist);
ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
return ret;
}
vec4 getPosition(vec2 pos_screen) vec4 getPosition(vec2 pos_screen)
{ {
float depth = texture2DRect(depthMap, pos_screen.xy).a; float depth = texture2DRect(depthMap, pos_screen.xy).a;
...@@ -126,7 +172,7 @@ void main() ...@@ -126,7 +172,7 @@ void main()
float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
float lod = diff * proj_lod; float lod = diff * proj_lod;
vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod); vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a; vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
...@@ -137,7 +183,7 @@ void main() ...@@ -137,7 +183,7 @@ void main()
} }
//float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
vec4 amb_plcol = texture2DLod(projectionMap, proj_tc.xy, proj_lod); vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
amb_da += (da*da*0.5+0.5)*proj_ambiance; amb_da += (da*da*0.5+0.5)*proj_ambiance;
...@@ -167,13 +213,17 @@ void main() ...@@ -167,13 +213,17 @@ void main()
if (stc.z > 0.0) if (stc.z > 0.0)
{ {
stc.xy /= stc.w; stc.xy /= stc.w;
float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0);
stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);
if (stc.x < 1.0 && if (stc.x < 1.0 &&
stc.y < 1.0 && stc.y < 1.0 &&
stc.x > 0.0 && stc.x > 0.0 &&
stc.y > 0.0) stc.y > 0.0)
{ {
vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow; col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow;
} }
} }
......
...@@ -179,17 +179,6 @@ void main() ...@@ -179,17 +179,6 @@ void main()
} }
} }
/*if (spec.a > 0.0)
{
//vec3 ref = reflect(normalize(pos), norm);
float sa = dot(normalize(lv-normalize(pos)),norm);;
//sa = max(sa, 0.0);
//sa = pow(sa, 128.0 * spec.a*spec.a/dist_atten)*min(dist_atten*4.0, 1.0);
sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
sa *= noise;
col += da*sa*lcol*spec.rgb;
}*/
//attenuate point light contribution by SSAO component //attenuate point light contribution by SSAO component
col *= texture2DRect(lightMap, frag.xy).g; col *= texture2DRect(lightMap, frag.xy).g;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment