DYT/Source/resources/shaders/terrain.vert

79 lines
2.1 KiB
GLSL
Raw Normal View History

2024-11-22 15:11:48 +00:00
// 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();
}