40 lines
1.3 KiB
GLSL
40 lines
1.3 KiB
GLSL
out vec3 oldPos;
|
|
out vec3 newPos;
|
|
out vec3 ray;
|
|
in vec3 position;
|
|
|
|
#include <utils>
|
|
|
|
|
|
/* project the ray onto the plane */
|
|
vec3 project(vec3 origin, vec3 ray, vec3 refractedLight) {
|
|
vec2 tcube = intersectCube(
|
|
origin,
|
|
ray,
|
|
vec3(-poolHalfSize.x, -poolHeight, -poolHalfSize.y),
|
|
vec3(poolHalfSize.x, poolHeight * 2.0, poolHalfSize.y)
|
|
);
|
|
origin += ray * tcube.y;
|
|
float tplane = (-origin.y - poolHeight) / refractedLight.y;
|
|
|
|
return origin + refractedLight * tplane;
|
|
}
|
|
|
|
|
|
void main() {
|
|
vec4 info = texture(water, position.xy * 0.5 + 0.5);
|
|
info.ba *= 0.5;
|
|
vec3 normal = vec3(info.b, sqrt(1.0 - dot(info.ba, info.ba)), info.a);
|
|
|
|
/* project the vertices along the refracted vertex ray */
|
|
vec3 refractedLight = refract(-light, vec3(0.0, 1.0, 0.0), IOR_AIR / IOR_WATER);
|
|
vec3 basePos = vec3(position.x * poolHalfSize.x, 0.0, position.y * poolHalfSize.y);
|
|
ray = refract(-light, normal, IOR_AIR / IOR_WATER);
|
|
oldPos = project(basePos, refractedLight, refractedLight);
|
|
newPos = project(basePos + vec3(0.0, info.r, 0.0), ray, refractedLight);
|
|
|
|
vec2 normalizedPos = vec2(newPos.x / poolHalfSize.x, newPos.z / poolHalfSize.y);
|
|
vec2 refractedOffset = vec2(refractedLight.x / poolHalfSize.x, refractedLight.z / poolHalfSize.y) / refractedLight.y;
|
|
gl_Position = vec4(0.75 * (normalizedPos + refractedOffset), 0.0, 1.0);
|
|
}
|