DYTSrouce/Source/resources/shaders/osgOcean_ocean_scene.vert
2024-11-22 23:11:48 +08:00

49 lines
1.5 KiB
GLSL

// osgOcean Uniforms
// -----------------
uniform mat4 osg_ViewMatrixInverse;
uniform float osgOcean_WaterHeight;
uniform vec3 osgOcean_Eye;
uniform vec3 osgOcean_UnderwaterAttenuation;
uniform vec4 osgOcean_UnderwaterDiffuse;
uniform bool osgOcean_EnableUnderwaterScattering;
// -----------------
varying vec3 vExtinction;
varying vec3 vInScattering;
varying vec3 vNormal;
varying vec3 vLightDir;
varying vec3 vEyeVec;
varying float vWorldHeight;
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;
gl_Position = ftransform();
gl_FogFragCoord = gl_Position.z;
gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex; // for reflections
vNormal = gl_NormalMatrix * gl_Normal;
vLightDir = gl_LightSource[osgOcean_LightID].position.xyz;
vEyeVec = -vec3(gl_ModelViewMatrix*gl_Vertex);
vec4 worldVertex = (osg_ViewMatrixInverse*gl_ModelViewMatrix) * gl_Vertex;
if (osgOcean_EnableUnderwaterScattering)
computeScattering( osgOcean_Eye, worldVertex.xyz, vExtinction, vInScattering);
vWorldHeight = worldVertex.z;
}