2022-01-01 12:21:15 +01:00
|
|
|
#version 330 core
|
|
|
|
layout(location = 0) in vec3 vertexPosition;
|
|
|
|
layout(location = 1) in vec3 vertexNormal;
|
2021-12-30 12:14:47 +01:00
|
|
|
|
2022-01-01 12:21:15 +01:00
|
|
|
out vec3 interpNormal;
|
|
|
|
out vec3 fragPos;
|
2022-01-02 00:03:53 +01:00
|
|
|
out vec3 incident;
|
|
|
|
out float deep;
|
|
|
|
out vec3 v_reflection;
|
|
|
|
out vec3 v_refraction;
|
|
|
|
out float v_fresnel;
|
2021-12-30 12:14:47 +01:00
|
|
|
|
2022-01-01 12:21:15 +01:00
|
|
|
uniform mat4 modelMatrix;
|
|
|
|
uniform mat4 modelViewProjectionMatrix;
|
2022-01-02 00:03:53 +01:00
|
|
|
uniform vec3 viewPos;
|
|
|
|
|
|
|
|
// Indices of refraction
|
|
|
|
const float Air = 1.0;
|
|
|
|
const float Glass = 4; //1.51714;//4
|
|
|
|
// Air to glass ratio of the indices of refraction (Eta)
|
|
|
|
const float Eta = Air / Glass;
|
|
|
|
// see http://en.wikipedia.org/wiki/Refractive_index Reflectivity
|
|
|
|
const float R0 = ((Air - Glass) * (Air - Glass)) / ((Air + Glass) * (Air + Glass));
|
|
|
|
|
|
|
|
|
2021-12-30 12:14:47 +01:00
|
|
|
|
|
|
|
void main()
|
|
|
|
{
|
2022-01-02 00:03:53 +01:00
|
|
|
vec4 vertex = modelMatrix * vec4( vertexPosition, 1.0 );
|
|
|
|
vec4 camera = vec4( viewPos, 1.0 );
|
|
|
|
incident = normalize( vec3( vertex - camera ) );
|
|
|
|
|
|
|
|
vec3 norm = mat3(transpose(inverse(modelMatrix))) * vertexNormal;
|
|
|
|
v_refraction = refract( incident, norm, Eta );
|
|
|
|
v_reflection = reflect( incident, norm );
|
|
|
|
|
|
|
|
v_fresnel = R0 + (1.0 - R0) * pow( (1.0 - dot( -incident, vertexNormal ) ), 5.0);
|
|
|
|
|
|
|
|
|
|
|
|
interpNormal = vertexNormal;
|
|
|
|
|
2022-01-01 12:35:51 +01:00
|
|
|
fragPos = vec3(modelMatrix * vec4(vertexPosition, 1.0));
|
|
|
|
gl_Position = modelViewProjectionMatrix * vec4(vertexPosition, 1.0);
|
2022-01-02 00:03:53 +01:00
|
|
|
deep = vertexPosition.y;
|
2022-01-01 12:21:15 +01:00
|
|
|
}
|