This file provides a C++ header for the GLSL functions that implement our atmosphere model. The C++ "implementation" is provided in functions.cc (this file simply includes the GLSL file after defining the macros it depends on). The documentation is provided in the GLSL file.
#ifndef ATMOSPHERE_REFERENCE_FUNCTIONS_H_ #define ATMOSPHERE_REFERENCE_FUNCTIONS_H_ #include "atmosphere/reference/definitions.h" namespace atmosphere { namespace reference { typedef dimensional::vec2 vec2; typedef dimensional::vec3 vec3; typedef dimensional::vec4 vec4; // Transmittance. Length DistanceToTopAtmosphereBoundary( const AtmosphereParameters& atmosphere, Length r, Number mu); Length DistanceToBottomAtmosphereBoundary( const AtmosphereParameters& atmosphere, Length r, Number mu); bool RayIntersectsGround( const AtmosphereParameters& atmosphere, Length r, Number mu); Number GetLayerDensity(const DensityProfileLayer& layer, Length altitude); Number GetProfileDensity(const DensityProfile& profile, Length altitude); Length ComputeOpticalLengthToTopAtmosphereBoundary( const AtmosphereParameters& atmosphere, const DensityProfile& profile, Length r, Number mu); DimensionlessSpectrum ComputeTransmittanceToTopAtmosphereBoundary( const AtmosphereParameters& atmosphere, Length r, Number mu); Number GetTextureCoordFromUnitRange(Number x, int texture_size); Number GetUnitRangeFromTextureCoord(Number u, int texture_size); vec2 GetTransmittanceTextureUvFromRMu(const AtmosphereParameters& atmosphere, Length r, Number mu); void GetRMuFromTransmittanceTextureUv(const AtmosphereParameters& atmosphere, const vec2& uv, Length& r, Number& mu); DimensionlessSpectrum ComputeTransmittanceToTopAtmosphereBoundaryTexture( const AtmosphereParameters& atmosphere, const vec2& gl_frag_coord); DimensionlessSpectrum GetTransmittanceToTopAtmosphereBoundary( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, Length r, Number mu); DimensionlessSpectrum GetTransmittance( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, Length r, Number mu, Length d, bool ray_r_mu_intersects_ground); // Single scattering. void ComputeSingleScatteringIntegrand( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, Length r, Number mu, Number mu_s, Number nu, Length d, bool ray_r_mu_intersects_ground, DimensionlessSpectrum& rayleigh, DimensionlessSpectrum& mie); Length DistanceToNearestAtmosphereBoundary( const AtmosphereParameters& atmosphere, Length r, Number mu, bool ray_r_mu_intersects_ground); void ComputeSingleScattering( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, Length r, Number mu, Number mu_s, Number nu, bool ray_r_mu_intersects_ground, IrradianceSpectrum& rayleigh, IrradianceSpectrum& mie); InverseSolidAngle RayleighPhaseFunction(Number nu); InverseSolidAngle MiePhaseFunction(Number g, Number nu); vec4 GetScatteringTextureUvwzFromRMuMuSNu( const AtmosphereParameters& atmosphere, Length r, Number mu, Number mu_s, Number nu, bool ray_r_mu_intersects_ground); void GetRMuMuSNuFromScatteringTextureUvwz( const AtmosphereParameters& atmosphere, const vec4& uvwz, Length& r, Number& mu, Number& mu_s, Number& nu, bool& ray_r_mu_intersects_ground); void ComputeSingleScatteringTexture(const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, const vec3& gl_frag_coord, IrradianceSpectrum& rayleigh, IrradianceSpectrum& mie); template<class T> T GetScattering( const AtmosphereParameters& atmosphere, const AbstractScatteringTexture<T>& scattering_texture, Length r, Number mu, Number mu_s, Number nu, bool ray_r_mu_intersects_ground); RadianceSpectrum GetScattering( const AtmosphereParameters& atmosphere, const ReducedScatteringTexture& single_rayleigh_scattering_texture, const ReducedScatteringTexture& single_mie_scattering_texture, const ScatteringTexture& multiple_scattering_texture, Length r, Number mu, Number mu_s, Number nu, bool ray_r_mu_intersects_ground, int scattering_order); // Multiple scattering. RadianceDensitySpectrum ComputeScatteringDensity( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, const ReducedScatteringTexture& single_rayleigh_scattering_texture, const ReducedScatteringTexture& single_mie_scattering_texture, const ScatteringTexture& multiple_scattering_texture, const IrradianceTexture& irradiance_texture, Length r, Number mu, Number mu_s, Number nu, int scattering_order); RadianceSpectrum ComputeMultipleScattering( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, const ScatteringDensityTexture& scattering_density_texture, Length r, Number mu, Number mu_s, Number nu, bool ray_r_mu_intersects_ground); RadianceDensitySpectrum ComputeScatteringDensityTexture( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, const ReducedScatteringTexture& single_rayleigh_scattering_texture, const ReducedScatteringTexture& single_mie_scattering_texture, const ScatteringTexture& multiple_scattering_texture, const IrradianceTexture& irradiance_texture, const vec3& gl_frag_coord, int scattering_order); RadianceSpectrum ComputeMultipleScatteringTexture( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, const ScatteringDensityTexture& scattering_density_texture, const vec3& gl_frag_coord, Number& nu); // Ground irradiance. IrradianceSpectrum ComputeDirectIrradiance( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, Length r, Number mu_s); IrradianceSpectrum ComputeIndirectIrradiance( const AtmosphereParameters& atmosphere, const ReducedScatteringTexture& single_rayleigh_scattering_texture, const ReducedScatteringTexture& single_mie_scattering_texture, const ScatteringTexture& multiple_scattering_texture, Length r, Number mu_s, int scattering_order); vec2 GetIrradianceTextureUvFromRMuS(const AtmosphereParameters& atmosphere, Length r, Number mu_s); void GetRMuSFromIrradianceTextureUv(const AtmosphereParameters& atmosphere, const vec2& uv, Length& r, Number& mu_s); IrradianceSpectrum ComputeDirectIrradianceTexture( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, const vec2& gl_frag_coord); IrradianceSpectrum ComputeIndirectIrradianceTexture( const AtmosphereParameters& atmosphere, const ReducedScatteringTexture& single_rayleigh_scattering_texture, const ReducedScatteringTexture& single_mie_scattering_texture, const ScatteringTexture& multiple_scattering_texture, const vec2& gl_frag_coord, int scattering_order); IrradianceSpectrum GetIrradiance( const AtmosphereParameters& atmosphere, const IrradianceTexture& irradiance_texture, Length r, Number mu_s); // Rendering. RadianceSpectrum GetSkyRadiance( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, const ReducedScatteringTexture& scattering_texture, const ReducedScatteringTexture& single_mie_scattering_texture, Position camera, const Direction& view_ray, Length shadow_length, const Direction& sun_direction, DimensionlessSpectrum& transmittance); RadianceSpectrum GetSkyRadianceToPoint( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, const ReducedScatteringTexture& scattering_texture, const ReducedScatteringTexture& single_mie_scattering_texture, Position camera, const Position& point, Length shadow_length, const Direction& sun_direction, DimensionlessSpectrum& transmittance); IrradianceSpectrum GetSunAndSkyIrradiance( const AtmosphereParameters& atmosphere, const TransmittanceTexture& transmittance_texture, const IrradianceTexture& irradiance_texture, const Position& point, const Direction& normal, const Direction& sun_direction, IrradianceSpectrum& sky_irradiance); } // namespace reference } // namespace atmosphere #endif // ATMOSPHERE_REFERENCE_FUNCTIONS_H_