You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmw-tes3mp/resources/caelum/CaelumSkyDome.cg

194 lines
5.2 KiB
Plaintext

/*
This file is part of Caelum.
See http://www.ogre3d.org/wiki/index.php/Caelum
Copyright (c) 2006-2007 Caelum team. See Contributors.txt for details.
Caelum is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Caelum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with Caelum. If not, see <http://www.gnu.org/licenses/>.
*/
float bias (float b, float x)
{
return pow (x, log (b) / log (0.5));
}
float4 sunlightInscatter
(
float4 sunColour,
float absorption,
float incidenceAngleCos,
float sunlightScatteringFactor
)
{
float scatteredSunlight = bias (sunlightScatteringFactor * 0.5, incidenceAngleCos);
sunColour = sunColour * (1 - absorption) * float4 (0.9, 0.5, 0.09, 1);
return sunColour * scatteredSunlight;
}
float fogExp (float z, float density) {
return 1 - clamp (pow (2.71828, -z * density), 0, 1);
}
void SkyDomeVP
(
in float4 position : POSITION,
in float4 normal : NORMAL,
in float2 uv : TEXCOORD0,
uniform float lightAbsorption,
uniform float4x4 worldViewProj,
uniform float3 sunDirection,
out float4 oPosition : POSITION,
out float4 oCol : COLOR,
out float2 oUv : TEXCOORD0,
out float incidenceAngleCos : TEXCOORD1,
out float y : TEXCOORD2,
out float3 oNormal : TEXCOORD3
)
{
sunDirection = normalize (sunDirection);
normal = normalize (normal);
float cosine = dot (-sunDirection, normal);
incidenceAngleCos = -cosine;
y = -sunDirection.y;
oPosition = mul (worldViewProj, position);
oCol = float4 (1, 1, 1, 1);
oUv = uv;
oNormal = -normal.xyz;
}
void SkyDomeFP
(
float4 col : COLOR,
float2 uv : TEXCOORD0,
float incidenceAngleCos : TEXCOORD1,
float y : TEXCOORD2,
float3 normal : TEXCOORD3,
uniform sampler gradientsMap : register(s0),
uniform sampler1D atmRelativeDepth : register(s1),
uniform float4 hazeColour,
uniform float offset,
out float4 oCol : COLOR
)
{
float4 sunColour = float4 (3, 3, 3, 1);
#ifdef HAZE
float fogDensity = 15;
// Haze amount calculation
float invHazeHeight = 100;
float haze = fogExp (pow (clamp (1 - normal.y, 0, 1), invHazeHeight), fogDensity);
#endif // HAZE
// Pass the colour
oCol = tex2D (gradientsMap, uv + float2 (offset, 0)) * col;
// Sunlight inscatter
if (incidenceAngleCos > 0)
{
float sunlightScatteringFactor = 0.05;
float sunlightScatteringLossFactor = 0.1;
float atmLightAbsorptionFactor = 0.1;
oCol.rgb += sunlightInscatter (
sunColour,
clamp (atmLightAbsorptionFactor * (1 - tex1D (atmRelativeDepth, y).r), 0, 1),
clamp (incidenceAngleCos, 0, 1),
sunlightScatteringFactor).rgb * (1 - sunlightScatteringLossFactor);
}
#ifdef HAZE
// Haze pass
hazeColour.a = 1;
oCol = oCol * (1 - haze) + hazeColour * haze;
#endif // HAZE
}
void HazeVP
(
in float4 position : POSITION,
in float4 normal : NORMAL,
uniform float4x4 worldViewProj,
uniform float4 camPos,
uniform float3 sunDirection,
out float4 oPosition : POSITION,
out float haze : TEXCOORD0,
out float2 sunlight : TEXCOORD1
)
{
sunDirection = normalize (sunDirection);
oPosition = mul(worldViewProj, position);
haze = length (camPos - position);
sunlight.x = dot (-sunDirection, normalize (position - camPos));
sunlight.y = -sunDirection.y;
}
void HazeFP
(
in float haze : TEXCOORD0,
in float2 sunlight : TEXCOORD1,
uniform sampler1D atmRelativeDepth : register(s0),
uniform sampler2D gradientsMap : register (s1),
uniform float4 fogColour,
out float4 oCol : COLOR
)
{
float incidenceAngleCos = sunlight.x;
float y = sunlight.y;
float4 sunColour = float4 (3, 2.5, 1, 1);
// Factor determining the amount of light lost due to absorption
float atmLightAbsorptionFactor = 0.1;
float fogDensity = 15;
haze = fogExp (haze * 0.005, atmLightAbsorptionFactor);
// Haze amount calculation
float invHazeHeight = 100;
float hazeAbsorption = fogExp (pow (1 - y, invHazeHeight), fogDensity);
float4 hazeColour;
hazeColour = fogColour;
if (incidenceAngleCos > 0) {
// Factor determining the amount of scattering for the sun light
float sunlightScatteringFactor = 0.1;
// Factor determining the amount of sun light intensity lost due to scattering
float sunlightScatteringLossFactor = 0.3;
float4 sunlightInscatterColour = sunlightInscatter (
sunColour,
clamp ((1 - tex1D (atmRelativeDepth, y).r) * hazeAbsorption, 0, 1),
clamp (incidenceAngleCos, 0, 1),
sunlightScatteringFactor) * (1 - sunlightScatteringLossFactor);
hazeColour.rgb =
hazeColour.rgb * (1 - sunlightInscatterColour.a) +
sunlightInscatterColour.rgb * sunlightInscatterColour.a * haze;
}
oCol = hazeColour;
oCol.a = haze;
}