1
0
Fork 0

Ocean depth map support for ALS

This commit is contained in:
Thorsten Renk 2013-11-23 12:15:52 +02:00
parent ce334404b1
commit 4a2d427a85
3 changed files with 95 additions and 2 deletions

View file

@ -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>

View file

@ -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));

View file

@ -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;