X-Git-Url: https://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=texturefrag.glsl;h=2a3de5508c2aa078cb47eb2220133581949c80c9;hp=94bda7fa859231016a526ff3fd5f7af405ee7b43;hb=8abaf8f77191e1c660def0832d8036a8b4639ba8;hpb=85f8f7278f24fe73fef1a19174376b155319072f diff --git a/texturefrag.glsl b/texturefrag.glsl index 94bda7f..2a3de55 100644 --- a/texturefrag.glsl +++ b/texturefrag.glsl @@ -8,6 +8,8 @@ struct Material { sampler2D specularMap; float shininess; + float reflectivity; + bool hasTexture; bool hasSpecularMap; @@ -15,7 +17,7 @@ struct Material { bool hasNormalMap; }; -in vec3 defNormal; +in vec3 defNormal, worldNormal; in vec2 texCoord; // These are all in tangent space @@ -23,47 +25,50 @@ 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 normal) { + vec3 I = normalize(worldFragPos - worldViewPos); + vec3 R = reflect(I, normalize(normal)); + 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; - } 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; + + diffTex = mix(diffTex, reflection(worldNormal), material.reflectivity); vec4 ambient = material.ambient * diffTex; - 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 specTex = texture(material.specularMap, texCoord); + if (!material.hasSpecularMap) + specTex = material.specular; - vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * material.specular * specTex; + vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * specTex; - vec4 lighting = (ambient + diffuse + specular) * lightColor; + FragColor = (ambient + diffuse + specular) * lightColor; - FragColor = lighting; }