79 lines
2.1 KiB
GLSL
79 lines
2.1 KiB
GLSL
// osgOcean uniforms
|
|
// -------------------
|
|
uniform float osgOcean_WaterHeight;
|
|
uniform vec3 osgOcean_Eye;
|
|
uniform vec3 osgOcean_UnderwaterAttenuation;
|
|
uniform vec4 osgOcean_UnderwaterDiffuse;
|
|
uniform bool osgOcean_EnableUnderwaterScattering;
|
|
// ------------------
|
|
|
|
uniform vec2 uHeightRange;
|
|
uniform float uOneOverHeight;
|
|
uniform mat4 osg_ViewMatrixInverse;
|
|
|
|
varying float vUnitHeight;
|
|
|
|
varying vec3 vLightDir;
|
|
varying vec3 vEyeVec;
|
|
varying vec3 vExtinction;
|
|
varying vec3 vInScattering;
|
|
varying vec4 vWorldVertex;
|
|
|
|
attribute vec3 aTangent;
|
|
|
|
void computeScattering( in vec3 eye, in vec3 worldVertex, out vec3 extinction, out vec3 inScattering )
|
|
{
|
|
float viewDist = length(eye-worldVertex);
|
|
|
|
float depth = max(osgOcean_WaterHeight-worldVertex.z, 0.0);
|
|
|
|
extinction = exp(-osgOcean_UnderwaterAttenuation*viewDist*2.0);
|
|
|
|
// Need to compute accurate kd constant.
|
|
// const vec3 kd = vec3(0.001, 0.001, 0.001);
|
|
inScattering = osgOcean_UnderwaterDiffuse.rgb * (1.0-extinction*exp(-depth*vec3(0.001)));
|
|
}
|
|
|
|
void main(void)
|
|
{
|
|
gl_TexCoord[0] = gl_MultiTexCoord0*vec4(16.0,16.0,1.0,1.0);
|
|
gl_TexCoord[1] = gl_MultiTexCoord0*vec4(20.0,20.0,1.0,1.0);
|
|
gl_TexCoord[2] = gl_MultiTexCoord0*vec4(25.0,25.0,1.0,1.0);
|
|
|
|
vec3 vertex = vec3(gl_ModelViewMatrix * gl_Vertex);
|
|
vEyeVec = -vertex;
|
|
|
|
vec3 n = normalize(gl_NormalMatrix * gl_Normal);
|
|
vec3 t = normalize(gl_NormalMatrix * aTangent);
|
|
vec3 b = cross(n, t);
|
|
|
|
vec3 tmpVec = vec3(gl_LightSource[0].position.xyz);
|
|
tmpVec = normalize(tmpVec);
|
|
|
|
vLightDir.x = dot(tmpVec, t);
|
|
vLightDir.y = dot(tmpVec, b);
|
|
vLightDir.z = dot(tmpVec, n);
|
|
|
|
tmpVec = -vertex;
|
|
vEyeVec.x = dot(tmpVec, t);
|
|
vEyeVec.y = dot(tmpVec, b);
|
|
vEyeVec.z = dot(tmpVec, n);
|
|
|
|
gl_Position = ftransform();
|
|
|
|
gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
|
|
|
|
gl_FogFragCoord = gl_Position.z;
|
|
|
|
float inv = 1.0 / ( uHeightRange.y - (uHeightRange.x+65.0) );
|
|
vUnitHeight = inv * (gl_Vertex.z - (uHeightRange.x+65.0));
|
|
|
|
vWorldVertex = (osg_ViewMatrixInverse*gl_ModelViewMatrix) * gl_Vertex;
|
|
|
|
if( osgOcean_EnableUnderwaterScattering )
|
|
{
|
|
computeScattering( osgOcean_Eye, vWorldVertex.xyz, vExtinction, vInScattering );
|
|
}
|
|
|
|
gl_Position = ftransform();
|
|
} |