71 lines
2.2 KiB
GLSL
71 lines
2.2 KiB
GLSL
#version 330
|
|
|
|
// Entrées (de Raylib)
|
|
in vec2 fragTexCoord;
|
|
in vec4 fragColor;
|
|
|
|
out vec4 finalColor;
|
|
|
|
uniform vec2 center;
|
|
uniform float screenHeight;
|
|
uniform vec2 resolution;
|
|
uniform float d1;
|
|
uniform float d2;
|
|
uniform float lambda;
|
|
uniform float angleM1;
|
|
uniform float angleM1_Y;
|
|
uniform float zoom;
|
|
|
|
const float PI = 3.14159265359;
|
|
|
|
vec3 WavelengthToRGB(float l) {
|
|
float r = 0.0; float g = 0.0; float b = 0.0;
|
|
if (l >= 380.0 && l < 440.0) { r = -(l - 440.0) / (440.0 - 380.0); b = 1.0; }
|
|
else if (l >= 440.0 && l < 490.0) { g = (l - 440.0) / (490.0 - 440.0); b = 1.0; }
|
|
else if (l >= 490.0 && l < 510.0) { g = 1.0; b = -(l - 510.0) / (510.0 - 490.0); }
|
|
else if (l >= 510.0 && l < 580.0) { r = (l - 510.0) / (580.0 - 510.0); g = 1.0; }
|
|
else if (l >= 580.0 && l < 645.0) { r = 1.0; g = -(l - 645.0) / (645.0 - 580.0); }
|
|
else if (l >= 645.0 && l <= 780.0) { r = 1.0; }
|
|
|
|
float factor = 1.0;
|
|
if (l >= 380.0 && l < 420.0) factor = 0.3 + 0.7 * (l - 380.0) / (420.0 - 380.0);
|
|
else if (l >= 380.0 && l <= 645.0) factor = 1.0;
|
|
else if (l > 700.0 && l <= 780.0) factor = 0.3 + 0.7 * (780.0 - l) / (780.0 - 700.0);
|
|
|
|
return vec3(r * factor, g * factor, b * factor);
|
|
}
|
|
|
|
void main() {
|
|
float pixelX = gl_FragCoord.x;
|
|
float pixelY = screenHeight - gl_FragCoord.y;
|
|
|
|
// Diff de marche du à l'axe (2 * e) + micro -> nano
|
|
float deltaLnm = 2.0 * (d1 - d2) * 1000.0;
|
|
|
|
float relX = (pixelX - center.x) * zoom;
|
|
float relY = (pixelY - center.y) * zoom;
|
|
|
|
vec3 baseColorVec = WavelengthToRGB(lambda);
|
|
|
|
// r^2
|
|
float radiusSq = relX * relX + relY * relY;
|
|
|
|
// Diff de marche lamme d'air 2 * e cos(i) mais petits angles => cos(i) ~ 1 - i^2/2 mais i ~ r/f et r^2 = x^2 + y^2
|
|
float ringFactor = radiusSq * 0.065;
|
|
|
|
// Diff de marche du au coin d'air
|
|
float wDelta = (relX * angleM1 + relY * angleM1_Y) * 200.0f;
|
|
|
|
float currDelta = deltaLnm - ringFactor + wDelta;
|
|
|
|
// Formule de Fresnel : I = I_0 * cos^2(phi)
|
|
float K = PI / lambda;
|
|
float phase = currDelta * K;
|
|
float intensity = cos(phase);
|
|
intensity = intensity * intensity;
|
|
|
|
vec3 finalVec = baseColorVec * intensity;
|
|
|
|
finalColor = vec4(finalVec, 1.0);
|
|
}
|