12 float refractiveIndex;
22 in vec3 defNormal, worldNormal;
25 // These are all in tangent space
30 in vec3 worldViewPos, worldFragPos;
32 uniform vec4 lightColor;
34 uniform Material material;
36 uniform samplerCube skybox;
41 vec3 I = normalize(worldFragPos - worldViewPos);
42 vec3 R = reflect(I, normalize(worldNormal));
43 return vec4(texture(skybox, R).rgb, 1);
47 float ratio = 1.f / material.refractiveIndex;
48 vec3 I = normalize(worldFragPos - worldViewPos);
49 vec3 R = refract(I, normalize(worldNormal), ratio);
50 return vec4(texture(skybox, R).rgb, 1);
54 vec3 normal = texture(material.normalMap, texCoord).rgb;
55 normal = normalize(normal * 2 - 1);
56 if (!material.hasNormalMap)
59 vec4 ambient = material.ambient * texture(material.diffuseMap, texCoord);
60 if (!material.hasTexture)
61 ambient = material.ambient;
63 ambient = mix(ambient, reflection(), material.reflectivity);
64 ambient = mix(ambient, refraction(), 1 - material.opacity);
66 vec3 lightDir = normalize(lightPos - fragPos);
68 vec4 diffTex = texture(material.diffuseMap, texCoord);
69 if (!material.hasTexture)
70 diffTex = material.diffuse;
72 diffTex = mix(diffTex, reflection(), material.reflectivity);
73 diffTex = mix(diffTex, refraction(), 1 - material.opacity);
75 vec4 diffuse = max(0, dot(lightDir, normal)) * diffTex;
77 vec3 viewDir = normalize(viewPos - fragPos);
78 vec3 reflectDir = reflect(-lightDir, normal);
80 vec4 specTex = texture(material.specularMap, texCoord);
81 if (!material.hasSpecularMap)
82 specTex = material.specular;
84 vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * specTex;
86 FragColor = (ambient + diffuse + specular) * lightColor;