X-Git-Url: https://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=texturefrag.glsl;h=2a3de5508c2aa078cb47eb2220133581949c80c9;hp=83cce42cc72a6d42d97fbbda5d1e6761c0f80d57;hb=8abaf8f77191e1c660def0832d8036a8b4639ba8;hpb=ba9c738e8660304aa0341eb44118e63502a4a009 diff --git a/texturefrag.glsl b/texturefrag.glsl index 83cce42..2a3de55 100644 --- a/texturefrag.glsl +++ b/texturefrag.glsl @@ -1,13 +1,15 @@ #version 330 struct Material { - vec3 ambient; - vec3 diffuse; + vec4 ambient; + vec4 diffuse; sampler2D diffuseMap; - vec3 specular; + vec4 specular; 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,45 +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 diffuse = vec4(max(0, dot(lightDir, normal)) * material.diffuse, 1) * diffTex; + 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)) * diffTex; vec3 viewDir = normalize(viewPos - fragPos); vec3 reflectDir = reflect(-lightDir, normal); + vec4 specTex = texture(material.specularMap, texCoord); + if (!material.hasSpecularMap) + specTex = material.specular; - vec4 specTex; - if (material.hasSpecularMap) - specTex = texture(material.specularMap, texCoord); - else - specTex = vec4(1); - - vec4 specular = vec4(pow(max(0, dot(viewDir, reflectDir)), material.shininess) * material.specular, 1) * specTex; + vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * specTex; - vec4 lighting = (vec4(material.ambient, 1) + diffuse + specular) * lightColor; + FragColor = (ambient + diffuse + specular) * lightColor; - FragColor = lighting; }