X-Git-Url: https://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=texturefrag.glsl;h=ddd951ed11975ef3aec4ee3fbe46989004baed1c;hp=94bda7fa859231016a526ff3fd5f7af405ee7b43;hb=c0811ee866ca2b6d002c15394ea5d4b7a1067a80;hpb=85f8f7278f24fe73fef1a19174376b155319072f diff --git a/texturefrag.glsl b/texturefrag.glsl index 94bda7f..ddd951e 100644 --- a/texturefrag.glsl +++ b/texturefrag.glsl @@ -8,6 +8,10 @@ struct Material { sampler2D specularMap; float shininess; + float reflectivity; + float refractiveIndex; + float opacity; + bool hasTexture; bool hasSpecularMap; @@ -15,7 +19,7 @@ struct Material { bool hasNormalMap; }; -in vec3 defNormal; +in vec3 defNormal, worldNormal; in vec2 texCoord; // These are all in tangent space @@ -23,47 +27,62 @@ in vec3 lightPos; in vec3 viewPos; in vec3 fragPos; +in vec3 worldViewPos, worldFragPos; + uniform vec4 lightColor; uniform Material material; +uniform samplerCube skybox; + out vec4 FragColor; -void main() { +vec4 reflection() { + vec3 I = normalize(worldFragPos - worldViewPos); + 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); +} - vec3 normal; - if (material.hasNormalMap) { - normal = texture(material.normalMap, texCoord).rgb; +void main() { + vec3 normal = texture(material.normalMap, texCoord).rgb; normal = normalize(normal * 2 - 1); - } else { + if (!material.hasNormalMap) normal = defNormal; - } + + vec4 ambient = material.ambient * texture(material.diffuseMap, texCoord); + if (!material.hasTexture) + ambient = material.ambient; + + ambient = mix(ambient, reflection(), material.reflectivity); + ambient = mix(ambient, refraction(), 1 - material.opacity); vec3 lightDir = normalize(lightPos - fragPos); - vec4 diffTex; - if (material.hasTexture) - diffTex = texture(material.diffuseMap, texCoord); - else - diffTex = vec4(1); + vec4 diffTex = texture(material.diffuseMap, texCoord); + if (!material.hasTexture) + diffTex = material.diffuse; - vec4 ambient = material.ambient * diffTex; + diffTex = mix(diffTex, reflection(), material.reflectivity); + diffTex = mix(diffTex, refraction(), 1 - material.opacity); - vec4 diffuse = max(0, dot(lightDir, normal)) * material.diffuse * diffTex; + vec4 diffuse = max(0, dot(lightDir, normal)) * diffTex; vec3 viewDir = normalize(viewPos - fragPos); vec3 reflectDir = reflect(-lightDir, normal); - vec4 specTex; - if (material.hasSpecularMap) - specTex = texture(material.specularMap, texCoord); - else - specTex = vec4(1); - - vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * material.specular * specTex; + vec4 specTex = texture(material.specularMap, texCoord); + if (!material.hasSpecularMap) + specTex = material.specular; - vec4 lighting = (ambient + diffuse + specular) * lightColor; + vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * specTex; - FragColor = lighting; + FragColor = (ambient + diffuse + specular) * lightColor; }