|
|
|
|
|
|
|
|
|
|
TEXTURECUBE(_Cubemap); |
|
|
|
SAMPLERCUBE(sampler_Cubemap); |
|
|
|
float4 _SkyParam; // x exposure, y multiplier, z rotation |
|
|
|
|
|
|
|
float4x4 _InvViewProjMatrix; |
|
|
|
float4 _SkyParam; // x exposure, y multiplier, z rotation |
|
|
|
|
|
|
|
struct Attributes |
|
|
|
{ |
|
|
|
|
|
|
float3 rotDirY = float3(sinPhi, 0, cosPhi); |
|
|
|
dir = float3(dot(rotDirX, dir), dir.y, dot(rotDirY, dir)); |
|
|
|
|
|
|
|
return ClampToFloat16Max(SAMPLE_TEXTURECUBE_LOD(_Cubemap, sampler_Cubemap, dir, 0) * exp2(_SkyParam.x) * _SkyParam.y); |
|
|
|
float3 skyDome = ClampToFloat16Max(SAMPLE_TEXTURECUBE_LOD(_Cubemap, sampler_Cubemap, dir, 0).rgb * exp2(_SkyParam.x) * _SkyParam.y); |
|
|
|
|
|
|
|
Coordinate coord = GetCoordinate(input.positionCS.xy, _ScreenSize.zw); |
|
|
|
|
|
|
|
// TODO: what sort of depth and world position values do we compute here? |
|
|
|
float rawDepth = LOAD_TEXTURE2D(_CameraDepthTexture, coord.unPositionSS).r; |
|
|
|
float3 positionWS = UnprojectToWorld(rawDepth, coord.positionSS, _InvViewProjMatrix); |
|
|
|
|
|
|
|
float4 c1, c2, c3; |
|
|
|
VolundTransferScatter(positionWS, c1, c2, c3); |
|
|
|
|
|
|
|
float4 coord1 = float4(c1.rgb + c3.rgb, max(0.f, 1.f - c1.a - c3.a)); |
|
|
|
float3 coord2 = c2.rgb; |
|
|
|
|
|
|
|
float sunCos = dot(normalize(dir), _SunDirection); |
|
|
|
float miePh = MiePhase(sunCos, _MiePhaseAnisotropy); |
|
|
|
|
|
|
|
float2 occlusion = float2(1.0, 1.0); // TODO. |
|
|
|
float extinction = coord1.a; |
|
|
|
float3 scatter = coord1.rgb * occlusion.x + coord2 * miePh * occlusion.y; |
|
|
|
|
|
|
|
#ifdef ATMOSPHERICS_DEBUG |
|
|
|
switch (_AtmosphericsDebugMode) |
|
|
|
{ |
|
|
|
case ATMOSPHERICS_DBG_RAYLEIGH: return c1; |
|
|
|
case ATMOSPHERICS_DBG_MIE: return c2 * miePh; |
|
|
|
case ATMOSPHERICS_DBG_HEIGHT: return c3; |
|
|
|
case ATMOSPHERICS_DBG_SCATTERING: return float4(scatter, 1.0); |
|
|
|
case ATMOSPHERICS_DBG_OCCLUSION: return float4(occlusion.xy, 0.0, 1.0); |
|
|
|
case ATMOSPHERICS_DBG_OCCLUDEDSCATTERING: return float4(scatter, 1.0); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
return float4(skyDome * extinction + scatter, 1.0); |
|
|
|
} |
|
|
|
|
|
|
|
ENDHLSL |
|
|
|