You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
5.5 KiB
190 lines
5.5 KiB
Pass
|
|
{
|
|
|
|
$splice(PassName)
|
|
|
|
// Render State
|
|
$splice(RenderState)
|
|
|
|
// Debug
|
|
$splice(Debug)
|
|
|
|
// --------------------------------------------------
|
|
// Pass
|
|
|
|
HLSLPROGRAM
|
|
|
|
// Pragmas
|
|
$splice(PassPragmas)
|
|
|
|
// Keywords
|
|
$splice(PassKeywords)
|
|
$splice(GraphKeywords)
|
|
|
|
// Defines
|
|
$Attributes.vertexID: #define ATTRIBUTES_NEED_VERTEXID
|
|
|
|
$splice(PassInstancing)
|
|
$splice(GraphDefines)
|
|
|
|
// Includes
|
|
$splice(PreGraphIncludes)
|
|
|
|
// --------------------------------------------------
|
|
// Structs and Packing
|
|
|
|
$splice(PassStructs)
|
|
|
|
$splice(InterpolatorPack)
|
|
|
|
// --------------------------------------------------
|
|
// Graph
|
|
|
|
// Graph Properties
|
|
$splice(GraphProperties)
|
|
|
|
// Graph Includes
|
|
$splice(GraphIncludes)
|
|
|
|
// Graph Functions
|
|
$splice(GraphFunctions)
|
|
|
|
// Graph Pixel
|
|
$splice(GraphPixel)
|
|
|
|
// --------------------------------------------------
|
|
// Build Graph Inputs
|
|
|
|
$features.graphPixel: $include("SharedCode.template.hlsl")
|
|
|
|
// --------------------------------------------------
|
|
// Main
|
|
|
|
float3 GetNormalWS(float3 normal, float3 normalTS)
|
|
{
|
|
float3 tangent = normalize(cross(normal, float3(0.0, 1.0, 0.0)));
|
|
float3 bitangent = cross(tangent, normal);
|
|
|
|
float3x3 tangentToWorld = float3x3(tangent, bitangent, normal);
|
|
return SafeNormalize(TransformTangentToWorld(normalTS, tangentToWorld));
|
|
}
|
|
|
|
void BuildGroundNormal(inout SurfaceDescriptionInputs input, SurfaceDescription surfaceDescription)
|
|
{
|
|
float3 N = input.WorldSpaceNormal;
|
|
|
|
$SurfaceDescription.GroundNormalOS: N = surfaceDescription.GroundNormalOS;
|
|
$SurfaceDescription.GroundNormalTS: N = GetNormalWS(N, surfaceDescription.GroundNormalTS);
|
|
$SurfaceDescription.GroundNormalWS: N = surfaceDescription.GroundNormalWS;
|
|
|
|
input.WorldSpaceNormal = N;
|
|
}
|
|
|
|
void RenderGround(inout SurfaceDescriptionInputs input, SurfaceDescription surfaceDescription)
|
|
{
|
|
if (input.tGround < input.tFrag)
|
|
{
|
|
// Closest so far.
|
|
// Make it negative to communicate to EvaluatePbrAtmosphere that we intersected the ground.
|
|
input.tFrag = -input.tGround;
|
|
input.radiance = 0.0f;
|
|
|
|
float smoothness = 1.0f;
|
|
float3 albedo = _GroundAlbedo.xyz;
|
|
|
|
$SurfaceDescription.GroundSmoothness: smoothness = surfaceDescription.GroundSmoothness;
|
|
$SurfaceDescription.GroundEmission: input.radiance = surfaceDescription.GroundEmission;
|
|
$SurfaceDescription.GroundColor: albedo *= surfaceDescription.GroundColor;
|
|
BuildGroundNormal(input, surfaceDescription);
|
|
|
|
const float roughness = PerceptualSmoothnessToRoughness(smoothness);
|
|
const float F0 = IorToFresnel0(1.4f);
|
|
const float3 diffuse = Lambert() * albedo;
|
|
|
|
float3 N = input.WorldSpaceNormal;
|
|
float3 V = -input.WorldSpaceViewDirection;
|
|
|
|
float NdotV = dot(N, V);
|
|
float clampedNdotV = ClampNdotV(NdotV);
|
|
float partLambdaV = GetSmithJointGGXPartLambdaV(clampedNdotV, roughness);
|
|
|
|
// Shade the ground.
|
|
for (uint i = 0; i < _CelestialLightCount; i++)
|
|
{
|
|
CelestialBodyData light = _CelestialBodyDatas[i];
|
|
|
|
float3 L = -light.forward.xyz;
|
|
float NdotL = dot(N, L);
|
|
float LdotV, NdotH, LdotH, invLenLV;
|
|
GetBSDFAngle(V, L, NdotL, NdotV, LdotV, NdotH, LdotH, invLenLV);
|
|
|
|
float3 intensity = light.color.rgb;
|
|
#ifdef LOCAL_SKY
|
|
intensity *= SampleGroundIrradianceTexture(NdotL);
|
|
#else
|
|
float3 opticalDepth = ComputeAtmosphericOpticalDepth(_PlanetaryRadius, NdotL, true);
|
|
intensity *= TransmittanceFromOpticalDepth(opticalDepth) * saturate(NdotL);
|
|
#endif
|
|
|
|
float DV = DV_SmithJointGGX(NdotH, abs(NdotL), clampedNdotV, roughness, partLambdaV);
|
|
float specular = F0 * DV;
|
|
|
|
input.radiance += (diffuse + specular) * intensity;
|
|
}
|
|
}
|
|
}
|
|
|
|
float3 RenderSky(Varyings varyings)
|
|
{
|
|
SurfaceDescriptionInputs input = BuildSurfaceDescriptionInputs(varyings);
|
|
const SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(input);
|
|
|
|
if (input.hitGround) // See the ground?
|
|
RenderGround(input, surfaceDescription);
|
|
else if (input.tFrag == FLT_INF) // See the stars?
|
|
input.radiance += surfaceDescription.SpaceColor;
|
|
|
|
float3 skyColor = 0, skyOpacity = 0;
|
|
|
|
float3 V = -input.WorldSpaceViewDirection;
|
|
float distAlongRay = input.tFrag;
|
|
bool renderSunDisk = input.renderSunDisk != 0;
|
|
|
|
#ifdef LOCAL_SKY
|
|
if (input.intersectAtmosphere != 0)
|
|
EvaluatePbrAtmosphere(_PBRSkyCameraPosPS, V, distAlongRay, renderSunDisk, skyColor, skyOpacity);
|
|
#else
|
|
if (!input.hitGround)
|
|
EvaluateDistantAtmosphere(-V, skyColor, skyOpacity);
|
|
#endif
|
|
|
|
skyColor += input.radiance * (1 - skyOpacity);
|
|
return skyColor * _IntensityMultiplier;
|
|
}
|
|
|
|
PackedVaryings Vert(Attributes input)
|
|
{
|
|
Varyings output = (Varyings)0;
|
|
UNITY_SETUP_INSTANCE_ID(input);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
|
output.positionCS = GetFullScreenTriangleVertexPosition(input.vertexID, UNITY_RAW_FAR_CLIP_VALUE);
|
|
PackedVaryings packedOutput = PackVaryings(output);
|
|
return packedOutput;
|
|
}
|
|
|
|
float4 FragBaking(PackedVaryings packedInput) : SV_Target
|
|
{
|
|
return float4(RenderSky(UnpackVaryings(packedInput)), 1.0f);
|
|
}
|
|
|
|
float4 Frag(PackedVaryings packedInput) : SV_Target
|
|
{
|
|
Varyings input = UnpackVaryings(packedInput);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
|
return float4(RenderSky(input) * GetCurrentExposureMultiplier(), 1.0f);
|
|
}
|
|
|
|
$splice(PostGraphIncludes)
|
|
|
|
ENDHLSL
|
|
}
|