X-Git-Url: https://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=texturefrag.glsl;h=ddd951ed11975ef3aec4ee3fbe46989004baed1c;hp=347cc0121f35e4487e770e922c3f633010bf0486;hb=671418e7effc7cbbb7e05df216291406d2b82dd7;hpb=37cba564a96018a5500e942498d4e48c0ebe73ed diff --git a/texturefrag.glsl b/texturefrag.glsl index 347cc01..ddd951e 100644 --- a/texturefrag.glsl +++ b/texturefrag.glsl @@ -1,39 +1,88 @@ #version 330 struct Material { - vec3 ambient; - vec3 diffuse; - vec3 specular; + vec4 ambient; + vec4 diffuse; + sampler2D diffuseMap; + vec4 specular; + sampler2D specularMap; float shininess; + + float reflectivity; + float refractiveIndex; + float opacity; + bool hasTexture; + bool hasSpecularMap; + + sampler2D normalMap; + bool hasNormalMap; }; -in vec3 normal; -in vec3 fragPos; +in vec3 defNormal, worldNormal; in vec2 texCoord; -uniform vec3 lightPos; -uniform vec3 viewPos; +// These are all in tangent space +in vec3 lightPos; +in vec3 viewPos; +in vec3 fragPos; + +in vec3 worldViewPos, worldFragPos; + uniform vec4 lightColor; uniform Material material; -uniform sampler2D tex; + +uniform samplerCube skybox; out vec4 FragColor; +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); +} + void main() { - vec3 lightDir = normalize(fragPos - lightPos); - vec3 diffuse = max(0, dot(-normal, lightDir)) * material.diffuse; + vec3 normal = texture(material.normalMap, texCoord).rgb; + normal = normalize(normal * 2 - 1); + 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); - vec3 viewDir = normalize(fragPos - viewPos); + vec4 diffTex = texture(material.diffuseMap, texCoord); + if (!material.hasTexture) + diffTex = material.diffuse; + + diffTex = mix(diffTex, reflection(), material.reflectivity); + diffTex = mix(diffTex, refraction(), 1 - material.opacity); + + vec4 diffuse = max(0, dot(lightDir, normal)) * diffTex; + + vec3 viewDir = normalize(viewPos - fragPos); vec3 reflectDir = reflect(-lightDir, normal); - vec3 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * material.specular; - vec4 lighting = vec4(material.ambient + diffuse + specular, 1) * lightColor; + vec4 specTex = texture(material.specularMap, texCoord); + if (!material.hasSpecularMap) + specTex = material.specular; + + vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * specTex; - if (material.hasTexture) - FragColor = lighting * texture(tex, texCoord); - else - FragColor = lighting; + FragColor = (ambient + diffuse + specular) * lightColor; }