X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=texturefrag.glsl;h=24a54d56ea686420c083bf906976daae8991deed;hp=2a3de5508c2aa078cb47eb2220133581949c80c9;hb=3f58e3a13899a1b28ee7be6c0bf835670957aa6a;hpb=8abaf8f77191e1c660def0832d8036a8b4639ba8 diff --git a/texturefrag.glsl b/texturefrag.glsl index 2a3de55..24a54d5 100644 --- a/texturefrag.glsl +++ b/texturefrag.glsl @@ -9,6 +9,8 @@ struct Material { float shininess; float reflectivity; + float refractiveIndex; + float opacity; bool hasTexture; bool hasSpecularMap; @@ -35,9 +37,16 @@ uniform samplerCube skybox; out vec4 FragColor; -vec4 reflection(vec3 normal) { +vec4 reflection() { vec3 I = normalize(worldFragPos - worldViewPos); - vec3 R = reflect(I, normalize(normal)); + vec3 R = reflect(I, normalize(worldNormal)); + return vec4(texture(skybox, R).rgb, 1); +} + +vec4 refraction() { + float ratio = 1.f / material.refractiveIndex; + vec3 I = normalize(worldFragPos - worldViewPos); + vec3 R = refract(I, normalize(worldNormal), ratio); return vec4(texture(skybox, R).rgb, 1); } @@ -53,7 +62,9 @@ void main() { if (!material.hasTexture) diffTex = material.diffuse; - diffTex = mix(diffTex, reflection(worldNormal), material.reflectivity); + diffTex = mix(diffTex, reflection(), material.reflectivity); + + diffTex = mix(diffTex, refraction(), 1 - material.opacity); vec4 ambient = material.ambient * diffTex;