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 vec3 lightDir = normalize(lightPos - fragPos);
61 vec4 diffTex = texture(material.diffuseMap, texCoord);
62 if (!material.hasTexture)
63 diffTex = material.diffuse;
65 diffTex = mix(diffTex, reflection(), material.reflectivity);
67 diffTex = mix(diffTex, refraction(), 1 - material.opacity);
69 vec4 ambient = material.ambient * diffTex;
71 vec4 diffuse = max(0, dot(lightDir, normal)) * diffTex;
73 vec3 viewDir = normalize(viewPos - fragPos);
74 vec3 reflectDir = reflect(-lightDir, normal);
76 vec4 specTex = texture(material.specularMap, texCoord);
77 if (!material.hasSpecularMap)
78 specTex = material.specular;
80 vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * specTex;
82 FragColor = (ambient + diffuse + specular) * lightColor;