|
@@ -48,10 +48,8 @@ TORQUE_UNIFORM_SAMPLER2D(dynamicShadowMap,2);
|
|
|
TORQUE_UNIFORM_SAMPLER2D(cookieMap, 3);
|
|
|
|
|
|
#endif
|
|
|
-
|
|
|
-TORQUE_UNIFORM_SAMPLER2D(lightBuffer, 5);
|
|
|
-TORQUE_UNIFORM_SAMPLER2D(colorBuffer, 6);
|
|
|
-TORQUE_UNIFORM_SAMPLER2D(matInfoBuffer, 7);
|
|
|
+TORQUE_UNIFORM_SAMPLER2D(colorBuffer, 5);
|
|
|
+TORQUE_UNIFORM_SAMPLER2D(matInfoBuffer, 6);
|
|
|
|
|
|
uniform float4 rtParams0;
|
|
|
|
|
@@ -73,48 +71,36 @@ uniform float4x4 dynamicViewToLightProj;
|
|
|
uniform float2 lightAttenuation;
|
|
|
uniform float shadowSoftness;
|
|
|
|
|
|
-struct PS_OUTPUT
|
|
|
-{
|
|
|
- float4 diffuse: TORQUE_TARGET0;
|
|
|
- float4 spec: TORQUE_TARGET1;
|
|
|
-};
|
|
|
+uniform float3 eyePosWorld;
|
|
|
+uniform float4x4 cameraToWorld;
|
|
|
|
|
|
-PS_OUTPUT main( ConvexConnectP IN )
|
|
|
+LightTargetOutput main( ConvexConnectP IN )
|
|
|
{
|
|
|
- PS_OUTPUT Output = (PS_OUTPUT)0;
|
|
|
+ LightTargetOutput Output = (LightTargetOutput)0;
|
|
|
// Compute scene UV
|
|
|
float3 ssPos = IN.ssPos.xyz / IN.ssPos.w;
|
|
|
float2 uvScene = getUVFromSSPos( ssPos, rtParams0 );
|
|
|
+
|
|
|
+ //sky and editor background check
|
|
|
+ float4 normDepth = UnpackDepthNormal(TORQUE_SAMPLER2D_MAKEARG(deferredBuffer), uvScene);
|
|
|
+ if (normDepth.a>0.9999)
|
|
|
+ return Output;
|
|
|
+
|
|
|
+ // Eye ray - Eye -> Pixel
|
|
|
+ float3 eyeRay = getDistanceVectorToPlane( -vsFarPlane.w, IN.vsEyeDir.xyz, vsFarPlane );
|
|
|
+ float3 viewSpacePos = eyeRay * normDepth.w;
|
|
|
|
|
|
- // Matinfo flags
|
|
|
- float4 matInfo = TORQUE_TEX2D( matInfoBuffer, uvScene );
|
|
|
+ //create surface
|
|
|
+ Surface surface = CreateSurface( normDepth, TORQUE_SAMPLER2D_MAKEARG(colorBuffer),TORQUE_SAMPLER2D_MAKEARG(matInfoBuffer),
|
|
|
+ uvScene, eyePosWorld, eyeRay, cameraToWorld);
|
|
|
//early out if emissive
|
|
|
- bool emissive = getFlag(matInfo.r, 0);
|
|
|
- if (emissive)
|
|
|
- {
|
|
|
+ if (getFlag(surface.matFlag, 0))
|
|
|
return Output;
|
|
|
- }
|
|
|
-
|
|
|
- float4 colorSample = TORQUE_TEX2D( colorBuffer, uvScene );
|
|
|
- float3 subsurface = float3(0.0,0.0,0.0);
|
|
|
- if (getFlag( matInfo.r, 1 ))
|
|
|
- {
|
|
|
- subsurface = colorSample.rgb;
|
|
|
- if (colorSample.r>colorSample.g)
|
|
|
- subsurface = float3(0.772549, 0.337255, 0.262745);
|
|
|
- else
|
|
|
- subsurface = float3(0.337255, 0.772549, 0.262745);
|
|
|
- }
|
|
|
-
|
|
|
- // Sample/unpack the normal/z data
|
|
|
- float4 deferredSample = TORQUE_DEFERRED_UNCONDITION( deferredBuffer, uvScene );
|
|
|
- float3 normal = deferredSample.rgb;
|
|
|
- float depth = deferredSample.a;
|
|
|
+
|
|
|
+ //create surface to light
|
|
|
+ float3 wsLightDir = mul(cameraToWorld, float4(lightDirection,0)).xyz;
|
|
|
+ SurfaceToLight surfaceToLight = CreateSurfaceToLight(surface, -wsLightDir);
|
|
|
|
|
|
- // Eye ray - Eye -> Pixel
|
|
|
- float3 eyeRay = getDistanceVectorToPlane( -vsFarPlane.w, IN.vsEyeDir.xyz, vsFarPlane );
|
|
|
- float3 viewSpacePos = eyeRay * depth;
|
|
|
-
|
|
|
// Build light vec, get length, clip pixel if needed
|
|
|
float3 lightToPxlVec = viewSpacePos - lightPosition;
|
|
|
float lenLightV = length( lightToPxlVec );
|
|
@@ -130,7 +116,7 @@ PS_OUTPUT main( ConvexConnectP IN )
|
|
|
clip( atten - 1e-6 );
|
|
|
atten = saturate( atten );
|
|
|
|
|
|
- float nDotL = dot( normal, -lightToPxlVec );
|
|
|
+ float nDotL = dot( normDepth.xyz, -lightToPxlVec );
|
|
|
|
|
|
// Get the shadow texture coordinate
|
|
|
float4 pxlPosLightProj = mul( viewToLightProj, float4( viewSpacePos, 1 ) );
|
|
@@ -185,34 +171,12 @@ PS_OUTPUT main( ConvexConnectP IN )
|
|
|
|
|
|
#endif
|
|
|
|
|
|
- // NOTE: Do not clip on fully shadowed pixels as it would
|
|
|
- // cause the hardware occlusion query to disable the shadow.
|
|
|
-
|
|
|
- float3 l = normalize(-lightDirection);
|
|
|
- float3 v = eyeRay;// normalize(eyePosWorld - worldPos.xyz);
|
|
|
-
|
|
|
- float3 h = normalize(v + l);
|
|
|
- float dotNLa = clamp(dot(normal, l), 0.0, 1.0);
|
|
|
- float dotNVa = clamp(dot(normal, v), 0.0, 1.0);
|
|
|
- float dotNHa = clamp(dot(normal, h), 0.0, 1.0);
|
|
|
- float dotHVa = clamp(dot(normal, v), 0.0, 1.0);
|
|
|
- float dotLHa = clamp(dot(l, h), 0.0, 1.0);
|
|
|
-
|
|
|
- float roughness = 1.0001-matInfo.b;
|
|
|
- float metalness = matInfo.a;
|
|
|
-
|
|
|
- //diffuse
|
|
|
- float disDiff = Fr_DisneyDiffuse(dotNVa, dotNLa, dotLHa, roughness);
|
|
|
- float3 diffuse = float3(disDiff, disDiff, disDiff) / M_PI_F;
|
|
|
- //specular
|
|
|
- float3 specular = directSpecular(normal, v, l, roughness, 1.0) * lightColor.rgb;
|
|
|
-
|
|
|
-
|
|
|
- if (nDotL<0) shadowed = 0;
|
|
|
- float Sat_NL_Att = saturate( nDotL * shadowed ) * lightBrightness;
|
|
|
+ //get directional light contribution
|
|
|
+ LightResult result = GetDirectionalLight(surface, surfaceToLight, lightColor.rgb, lightBrightness, shadowed);
|
|
|
+
|
|
|
//output
|
|
|
- Output.diffuse = float4(diffuse * lightBrightness*Sat_NL_Att*shadowed,1.0);
|
|
|
- Output.spec = float4(specular * lightBrightness*Sat_NL_Att*shadowed,1.0);
|
|
|
-
|
|
|
+ Output.diffuse = float4(result.diffuse, 0);
|
|
|
+ Output.spec = float4(result.spec, 0);
|
|
|
+
|
|
|
return Output;
|
|
|
}
|