SL-17762L PBR: Move texture2DLodDiffuse() to defferredUtil
parent
02c27b8c48
commit
86de20e711
|
|
@ -25,12 +25,18 @@
|
|||
|
||||
uniform sampler2DRect normalMap;
|
||||
uniform sampler2DRect depthMap;
|
||||
uniform sampler2D projectionMap; // rgba
|
||||
|
||||
// projected lighted params
|
||||
uniform mat4 proj_mat; //screen space to light space projector
|
||||
uniform vec3 proj_n; // projector normal
|
||||
uniform vec3 proj_p; //plane projection is emitting from (in screen space)
|
||||
uniform float proj_focus; // distance from plane to begin blurring
|
||||
uniform float proj_lod ; // (number of mips in proj map)
|
||||
uniform float proj_range; // range between near clip and far clip plane of projection
|
||||
|
||||
// light params
|
||||
uniform vec3 color; // light_color
|
||||
uniform float size; // light_size
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
|
|
@ -38,6 +44,8 @@ uniform vec2 screen_res;
|
|||
|
||||
const float M_PI = 3.14159265;
|
||||
|
||||
vec3 srgb_to_linear(vec3 cs);
|
||||
|
||||
// In:
|
||||
// lv unnormalized surface to light vector
|
||||
// n normal of the surface
|
||||
|
|
@ -138,6 +146,80 @@ float getDepth(vec2 pos_screen)
|
|||
return depth;
|
||||
}
|
||||
|
||||
vec4 getTexture2DLodDiffuse(vec2 tc, float lod)
|
||||
{
|
||||
vec4 ret = texture2DLod(projectionMap, tc, lod);
|
||||
ret.rgb = srgb_to_linear(ret.rgb);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// Returns projected light in Linear
|
||||
// Uses:
|
||||
// color
|
||||
// NOTE: projected.a will be pre-multiplied with projected.rgb
|
||||
vec3 getProjectedLightDiffuseColor(float light_distance, vec2 projected_uv)
|
||||
{
|
||||
float diff = clamp((light_distance - proj_focus)/proj_range, 0.0, 1.0);
|
||||
float lod = diff * proj_lod;
|
||||
vec4 plcol = getTexture2DLodDiffuse(projected_uv.xy, lod);
|
||||
|
||||
return color.rgb * plcol.rgb * plcol.a;
|
||||
}
|
||||
|
||||
vec4 texture2DLodSpecular(vec2 tc, float lod)
|
||||
{
|
||||
vec4 ret = texture2DLod(projectionMap, tc, lod);
|
||||
ret.rgb = srgb_to_linear(ret.rgb);
|
||||
|
||||
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);
|
||||
d *= min(1, d * (proj_lod - lod)); // BUG? extra factor compared to diffuse causes N repeats
|
||||
float edge = 0.25*det;
|
||||
ret *= clamp(d/edge, 0.0, 1.0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// See: clipProjectedLightVars()
|
||||
vec3 getProjectedLightSpecularColor(vec3 pos, vec3 n )
|
||||
{
|
||||
vec3 slit = vec3(0);
|
||||
vec3 ref = reflect(normalize(pos), n);
|
||||
|
||||
//project from point pos in direction ref to plane proj_p, proj_n
|
||||
vec3 pdelta = proj_p-pos;
|
||||
float l_dist = length(pdelta);
|
||||
float ds = dot(ref, proj_n);
|
||||
if (ds < 0.0)
|
||||
{
|
||||
vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
|
||||
vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
|
||||
if (stc.z > 0.0)
|
||||
{
|
||||
stc /= stc.w;
|
||||
slit = getProjectedLightDiffuseColor( l_dist, stc.xy ); // NOTE: Using diffuse due to texture2DLodSpecular() has extra: d *= min(1, d * (proj_lod - lod));
|
||||
}
|
||||
}
|
||||
return slit; // specular light
|
||||
}
|
||||
|
||||
vec3 getProjectedLightSpecularColor(float light_distance, vec2 projected_uv)
|
||||
{
|
||||
float diff = clamp((light_distance - proj_focus)/proj_range, 0.0, 1.0);
|
||||
float lod = diff * proj_lod;
|
||||
vec4 plcol = getTexture2DLodDiffuse(projected_uv.xy, lod); // NOTE: Using diffuse due to texture2DLodSpecular() has extra: d *= min(1, d * (proj_lod - lod));
|
||||
|
||||
return color.rgb * plcol.rgb * plcol.a;
|
||||
}
|
||||
|
||||
vec4 getPosition(vec2 pos_screen)
|
||||
{
|
||||
float depth = getDepth(pos_screen);
|
||||
|
|
|
|||
|
|
@ -81,6 +81,8 @@ void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float
|
|||
bool clipProjectedLightVars(vec3 center, vec3 pos, out float dist, out float l_dist, out vec3 lv, out vec4 proj_tc );
|
||||
vec3 getLightIntensitySpot(vec3 lightColor, float lightRange, float lightDistance, vec3 v);
|
||||
vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity);
|
||||
vec3 getProjectedLightDiffuseColor(float light_distance, vec2 projected_uv );
|
||||
vec3 getProjectedLightSpecularColor(vec3 pos, vec3 n);
|
||||
vec2 getScreenXY(vec4 clip);
|
||||
void initMaterial( vec3 diffuse, vec3 packedORM, out float alphaRough, out vec3 c_diff, out vec3 reflect0, out vec3 reflect90, out float specWeight );
|
||||
vec3 srgb_to_linear(vec3 cs);
|
||||
|
|
@ -104,24 +106,6 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
|
|||
return ret;
|
||||
}
|
||||
|
||||
vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
|
||||
{
|
||||
vec4 ret = texture2DLod(projectionMap, tc, lod);
|
||||
ret.rgb = srgb_to_linear(ret.rgb);
|
||||
|
||||
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);
|
||||
|
|
@ -186,6 +170,7 @@ void main()
|
|||
vec3 diffuse = texture2DRect(diffuseRect, tc).rgb;
|
||||
vec4 spec = texture2DRect(specularRect, tc);
|
||||
vec3 dlit = vec3(0, 0, 0);
|
||||
vec3 slit = vec3(0, 0, 0);
|
||||
|
||||
if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR))
|
||||
{
|
||||
|
|
@ -216,13 +201,8 @@ void main()
|
|||
{
|
||||
lit = nl * dist_atten * noise;
|
||||
|
||||
float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
|
||||
float lod = diff * proj_lod;
|
||||
|
||||
vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
|
||||
|
||||
dlit = color.rgb * plcol.rgb * plcol.a;
|
||||
|
||||
dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy );
|
||||
|
||||
final_color = dlit*lit*diffuse*shadow;
|
||||
|
||||
// unshadowed for consistency between forward and deferred?
|
||||
|
|
@ -240,7 +220,6 @@ void main()
|
|||
final_color += amb_da*color.rgb*diffuse.rgb*amb_plcol.rgb*amb_plcol.a;
|
||||
}
|
||||
|
||||
|
||||
if (spec.a > 0.0)
|
||||
{
|
||||
dlit *= min(nl*6.0, 1.0) * dist_atten;
|
||||
|
|
|
|||
|
|
@ -80,6 +80,8 @@ void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float
|
|||
bool clipProjectedLightVars(vec3 center, vec3 pos, out float dist, out float l_dist, out vec3 lv, out vec4 proj_tc );
|
||||
vec3 getLightIntensitySpot(vec3 lightColor, float lightRange, float lightDistance, vec3 v);
|
||||
vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity);
|
||||
vec3 getProjectedLightDiffuseColor(float light_distance, vec2 projected_uv );
|
||||
vec3 getProjectedLightSpecularColor(vec3 pos, vec3 n);
|
||||
vec2 getScreenXY(vec4 clip_point);
|
||||
void initMaterial( vec3 diffuse, vec3 packedORM, out float alphaRough, out vec3 c_diff, out vec3 reflect0, out vec3 reflect90, out float specWeight );
|
||||
vec3 srgb_to_linear(vec3 c);
|
||||
|
|
@ -99,20 +101,6 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
|
|||
return ret;
|
||||
}
|
||||
|
||||
vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
|
||||
{
|
||||
vec4 ret = texture2DLod(projectionMap, tc, lod);
|
||||
ret.rgb = srgb_to_linear(ret.rgb);
|
||||
|
||||
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);
|
||||
|
|
@ -206,12 +194,7 @@ void main()
|
|||
{
|
||||
lit = nl * dist_atten * noise;
|
||||
|
||||
float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
|
||||
float lod = diff * proj_lod;
|
||||
|
||||
vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
|
||||
|
||||
dlit = color.rgb * plcol.rgb * plcol.a;
|
||||
dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy );
|
||||
|
||||
final_color = dlit*lit*diffuse*shadow;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue