Răsfoiți Sursa

spotlight conversion

Azaezel 6 ani în urmă
părinte
comite
1169ad05f1

+ 30 - 66
Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl

@@ -48,10 +48,8 @@ TORQUE_UNIFORM_SAMPLER2D(dynamicShadowMap,2);
 TORQUE_UNIFORM_SAMPLER2D(cookieMap, 3);
 TORQUE_UNIFORM_SAMPLER2D(cookieMap, 3);
 
 
 #endif
 #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;
 uniform float4 rtParams0;
 
 
@@ -73,48 +71,36 @@ uniform float4x4 dynamicViewToLightProj;
 uniform float2 lightAttenuation;
 uniform float2 lightAttenuation;
 uniform float shadowSoftness;
 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
    // Compute scene UV
    float3 ssPos = IN.ssPos.xyz / IN.ssPos.w;
    float3 ssPos = IN.ssPos.xyz / IN.ssPos.w;
    float2 uvScene = getUVFromSSPos( ssPos, rtParams0 );
    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
    //early out if emissive
-   bool emissive = getFlag(matInfo.r, 0);
-   if (emissive)
-   {
+   if (getFlag(surface.matFlag, 0))
       return Output;
       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
    // Build light vec, get length, clip pixel if needed
    float3 lightToPxlVec = viewSpacePos - lightPosition;
    float3 lightToPxlVec = viewSpacePos - lightPosition;
    float lenLightV = length( lightToPxlVec );
    float lenLightV = length( lightToPxlVec );
@@ -130,7 +116,7 @@ PS_OUTPUT main(   ConvexConnectP IN )
    clip( atten - 1e-6 );
    clip( atten - 1e-6 );
    atten = saturate( atten );
    atten = saturate( atten );
    
    
-   float nDotL = dot( normal, -lightToPxlVec );
+   float nDotL = dot( normDepth.xyz, -lightToPxlVec );
 
 
    // Get the shadow texture coordinate
    // Get the shadow texture coordinate
    float4 pxlPosLightProj = mul( viewToLightProj, float4( viewSpacePos, 1 ) );
    float4 pxlPosLightProj = mul( viewToLightProj, float4( viewSpacePos, 1 ) );
@@ -185,34 +171,12 @@ PS_OUTPUT main(   ConvexConnectP IN )
 
 
    #endif
    #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
-   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;
    return Output;
 }
 }