Ocean depth map support for ALS
This commit is contained in:
parent
ce334404b1
commit
4a2d427a85
3 changed files with 95 additions and 2 deletions
|
@ -298,6 +298,27 @@
|
|||
<use>texture[3]/internal-format</use>
|
||||
</internal-format>
|
||||
</texture-unit>
|
||||
<texture-unit>
|
||||
<unit>4</unit>
|
||||
<image>
|
||||
<use>texture[7]/image</use>
|
||||
</image>
|
||||
<type>
|
||||
<use>texture[7]/type</use>
|
||||
</type>
|
||||
<filter>
|
||||
<use>texture[7]/filter</use>
|
||||
</filter>
|
||||
<wrap-s>
|
||||
<use>texture[7]/wrap-s</use>
|
||||
</wrap-s>
|
||||
<wrap-t>
|
||||
<use>texture[7]/wrap-t</use>
|
||||
</wrap-t>
|
||||
<internal-format>
|
||||
<use>texture[7]/internal-format</use>
|
||||
</internal-format>
|
||||
</texture-unit>
|
||||
<!--<texture-unit>
|
||||
<unit>4</unit>
|
||||
<image>
|
||||
|
@ -402,6 +423,11 @@
|
|||
<type>sampler-2d</type>
|
||||
<value type="int">3</value>
|
||||
</uniform>
|
||||
<uniform>
|
||||
<name>topo_map</name>
|
||||
<type>sampler-2d</type>
|
||||
<value type="int">4</value>
|
||||
</uniform>
|
||||
<uniform>
|
||||
<name>sea_foam</name>
|
||||
<type>sampler-2d</type>
|
||||
|
|
|
@ -13,6 +13,7 @@ uniform sampler2D water_dudvmap;
|
|||
uniform sampler2D sea_foam;
|
||||
uniform sampler2D perlin_normalmap;
|
||||
uniform sampler2D ice_texture;
|
||||
uniform sampler2D topo_map;
|
||||
|
||||
uniform sampler3D Noise;
|
||||
|
||||
|
@ -26,6 +27,8 @@ varying vec3 viewerdir;
|
|||
varying vec3 lightdir;
|
||||
varying vec3 relPos;
|
||||
varying vec3 rawPos;
|
||||
varying vec2 TopoUV;
|
||||
|
||||
|
||||
varying float earthShade;
|
||||
varying float yprime_alt;
|
||||
|
@ -284,7 +287,7 @@ void main(void)
|
|||
{
|
||||
|
||||
|
||||
vec3 shadedFogColor = vec3(0.65, 0.67, 0.78);
|
||||
vec3 shadedFogColor = vec3(0.65, 0.67, 0.78);
|
||||
float effective_scattering = min(scattering, cloud_self_shading);
|
||||
|
||||
float dist = length(relPos);
|
||||
|
@ -298,6 +301,11 @@ void main(void)
|
|||
float noise_2000m = Noise3D(rawPos.xyz,2000.0);
|
||||
float noise_2500m = Noise3D(rawPos.xyz, 2500.0);
|
||||
|
||||
// get depth map
|
||||
vec4 topoTexel = texture2D(topo_map, TopoUV);
|
||||
float floorMixFactor = smoothstep(0.3, 0.985, topoTexel.a);
|
||||
vec3 floorColour = topoTexel.rgb;
|
||||
|
||||
mat4 RotationMatrix;
|
||||
|
||||
// compute direction to viewer
|
||||
|
@ -443,7 +451,17 @@ void main(void)
|
|||
refl.a = 1.0;
|
||||
|
||||
refl.g = refl.g * (0.9 + 0.2* noise_2500m);
|
||||
|
||||
|
||||
if (ocean_flag ==1) // use depth information
|
||||
{
|
||||
refl.rgb = mix(refl.rgb, 0.65* floorColour, floorMixFactor);
|
||||
refl.rgb = refl.rgb * (0.5 + 0.5 * smoothstep(0.0,0.3,topoTexel.a));
|
||||
}
|
||||
else
|
||||
{
|
||||
refl.rgb = 1.3 * refl.rgb;
|
||||
}
|
||||
|
||||
float intensity;
|
||||
// de-saturate for reduced light
|
||||
refl.rgb = mix(refl.rgb, vec3 (0.248, 0.248, 0.248), 1.0 - smoothstep(0.1, 0.8, ground_scattering));
|
||||
|
|
|
@ -12,6 +12,7 @@ varying vec4 waterTex2;
|
|||
varying vec4 waterTex4;
|
||||
varying vec3 relPos;
|
||||
varying vec3 rawPos;
|
||||
varying vec2 TopoUV;
|
||||
|
||||
varying vec3 viewerdir;
|
||||
varying vec3 lightdir;
|
||||
|
@ -36,6 +37,14 @@ uniform int ocean_flag;
|
|||
|
||||
uniform mat4 osg_ViewMatrixInverse;
|
||||
|
||||
// constants for the cartesian to geodetic conversion.
|
||||
|
||||
const float a = 6378137.0; //float a = equRad;
|
||||
const float squash = 0.9966471893352525192801545;
|
||||
const float latAdjust = 0.9999074159800018; //geotiff source for the depth map
|
||||
const float lonAdjust = 0.9999537058469516; //actual extents: +-180.008333333333326/+-90.008333333333340
|
||||
|
||||
|
||||
vec3 specular_light;
|
||||
|
||||
// This is the value used in the skydome scattering shader - use the same here for consistency?
|
||||
|
@ -234,6 +243,46 @@ else // the faster, full-day version without lightfields
|
|||
|
||||
}
|
||||
|
||||
// Geodesy lookup for depth map
|
||||
float e2 = abs(1.0 - squash * squash);
|
||||
float ra2 = 1.0/(a * a);
|
||||
float e4 = e2 * e2;
|
||||
float XXpYY = rawPos.x * rawPos.x + rawPos.y * rawPos.y;
|
||||
float Z = rawPos.z;
|
||||
float sqrtXXpYY = sqrt(XXpYY);
|
||||
float p = XXpYY * ra2;
|
||||
float q = Z*Z*(1.0-e2)*ra2;
|
||||
float r = 1.0/6.0*(p + q - e4);
|
||||
float s = e4 * p * q/(4.0*r*r*r);
|
||||
if ( s >= 2.0 && s <= 0.0)
|
||||
s = 0.0;
|
||||
float t = pow(1.0+s+sqrt(s*2.0+s*s), 1.0/3.0);
|
||||
float u = r + r*t + r/t;
|
||||
float v = sqrt(u*u + e4*q);
|
||||
float w = (e2*u+ e2*v-e2*q)/(2.0*v);
|
||||
float k = sqrt(u+v+w*w)-w;
|
||||
float D = k*sqrtXXpYY/(k+e2);
|
||||
|
||||
vec2 NormPosXY = normalize(rawPos.xy);
|
||||
vec2 NormPosXZ = normalize(vec2(D, rawPos.z));
|
||||
float signS = sign(rawPos.y);
|
||||
if (-0.00015 <= rawPos.y && rawPos.y<=.00015)
|
||||
signS = 1.0;
|
||||
float signT = sign(rawPos.z);
|
||||
if (-0.0002 <= rawPos.z && rawPos.z<=.0002)
|
||||
signT = 1.0;
|
||||
float cosLon = dot(NormPosXY, vec2(1.0,0.0));
|
||||
float cosLat = dot(abs(NormPosXZ), vec2(1.0,0.0));
|
||||
TopoUV.s = signS * lonAdjust * degrees(acos(cosLon))/180.;
|
||||
TopoUV.t = signT * latAdjust * degrees(acos(cosLat))/90.;
|
||||
TopoUV.s = TopoUV.s * 0.5 + 0.5;
|
||||
TopoUV.t = TopoUV.t * 0.5 + 0.5;
|
||||
|
||||
//
|
||||
|
||||
|
||||
|
||||
|
||||
gl_FrontColor.rgb = specular_light;
|
||||
gl_BackColor.rgb = gl_FrontColor.rgb;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue