Allow materials to not have some properties
[opengl.git] / pbrfrag.glsl
index c45242dfadb39f834d56cc0c6cac828185a83c4c..1d0f759022b2acf8ee046c209f6ecd50784e95aa 100644 (file)
@@ -7,10 +7,15 @@ in vec2 texCoords;
 
 uniform vec3 camPos;
 
-uniform sampler2D albedoMap;
-uniform sampler2D normalMap;
-uniform sampler2D metallicRoughnessMap;
-uniform sampler2D aoMap;
+struct Material {
+       sampler2D albedoMap;
+       sampler2D normalMap;
+       sampler2D metallicRoughnessMap;
+       sampler2D aoMap;
+       bool hasAlbedo, hasNormal, hasMetallicRoughness, hasAo;
+};
+uniform Material mat;
+
 uniform samplerCube irradianceMap;
 uniform samplerCube prefilterMap;
 uniform sampler2D brdfMap;
@@ -51,7 +56,9 @@ float geometrySmith(vec3 N, vec3 V, vec3 L, float roughness) {
 }
 
 vec3 getNormalFromMap() {
-       vec3 tangentNormal = texture(normalMap, texCoords).xyz * 2.f - 1.f;
+       vec3 tangentNormal = vec3(0, 0, 1);
+       if (mat.hasNormal)
+               tangentNormal = texture(mat.normalMap, texCoords).xyz * 2.f - 1.f;
        vec3 Q1 = dFdx(worldPos);
     vec3 Q2 = dFdy(worldPos);
     vec2 st1 = dFdx(texCoords);
@@ -66,11 +73,18 @@ vec3 getNormalFromMap() {
 }
 
 void main() {
-       vec3 albedo = pow(texture(albedoMap, texCoords).rgb, vec3(2.2));
+       vec3 albedo = vec3(1);
+       if (mat.hasAlbedo)
+               albedo = pow(texture(mat.albedoMap, texCoords).rgb, vec3(2.2));
+
        vec3 normal = getNormalFromMap();
-       float metallic = texture(metallicRoughnessMap, texCoords).b;
-       float roughness = texture(metallicRoughnessMap, texCoords).g;
-       float ao = texture(aoMap, texCoords).r;
+
+       float metallic = 0, roughness = 1;
+       if (mat.hasMetallicRoughness) {
+               metallic = texture(mat.metallicRoughnessMap, texCoords).b;
+               roughness = texture(mat.metallicRoughnessMap, texCoords).g;
+       }
+       float ao = mat.hasAo ? texture(mat.aoMap, texCoords).r : 1;
 
        vec3 N = normalize(normal);
        vec3 V = normalize(camPos - worldPos);