]> git.tdb.fi Git - libs/gl.git/commitdiff
Rearrange some things in the shader library
authorMikko Rasa <tdb@tdb.fi>
Tue, 4 Oct 2022 21:34:03 +0000 (00:34 +0300)
committerMikko Rasa <tdb@tdb.fi>
Wed, 5 Oct 2022 11:35:24 +0000 (14:35 +0300)
Lighting parameters and queries are now in their own module.  The Cook-
Torrance BRDF has been separated from the PBR material so it's easier to
use elsewhere.

demos/desertpillars/data/sphere.glsl
demos/desertpillars/data/sphere_morph.glsl
shaderlib/common.glsl
shaderlib/cooktorrance.glsl
shaderlib/lighting.glsl [new file with mode: 0644]
shaderlib/msp_interface.glsl
shaderlib/pbr_material.glsl [new file with mode: 0644]
shaderlib/phong.glsl
shaderlib/shadow.glsl
source/materials/pbrmaterial.cpp

index 0dd872bd71e4dc800b728e69abdeb46dd6cdcdf2..46dd1f67b8b7f3365726166bb4c7712508db52bd 100644 (file)
@@ -1,2 +1,2 @@
-import cooktorrance;
+import pbr_material;
 import sphere_morph;
index e020ed68f4b9f80e71ef4f930b79be7458942b1e..2f71cf56ea45154fab2602e8051bed13163217d0 100644 (file)
@@ -1,3 +1,5 @@
+import msp_interface;
+
 uniform Morph
 {
        float morph;
index 695bce3b5da4ca0d8b06c5785a8bcea6f2c1da3a..249cae7c67e9c65c64d6dd4ab8a9829dd0ed8ef8 100644 (file)
@@ -75,12 +75,6 @@ void main()
 }
 
 #pragma MSP stage(fragment)
-struct IncomingLight
-{
-       vec3 direction;
-       vec3 color;
-};
-
 layout(location=0) out vec4 frag_color;
 
 virtual vec3 get_fragment_normal()
@@ -93,15 +87,6 @@ virtual vec3 get_fragment_normal()
                return sgn*normalize(world_normal);
 }
 
-virtual IncomingLight get_incoming_light(int index, vec3 world_pos)
-{
-       vec4 light_pos = light_sources[index].position;
-       vec3 rel_pos = light_pos.xyz-world_pos*light_pos.w;
-       float d = length(rel_pos);
-       float attenuation = 1.0/dot(vec3(1.0, d, d*d), light_sources[index].attenuation);
-       return IncomingLight(rel_pos/d, light_sources[index].color*attenuation);
-}
-
 float apply_alpha_cutoff(float alpha, AlphaCutoffParams params)
 {
        if(use_alpha_cutoff)
index 5e933d5a55239d7db0fb18a35b068c2b768975f2..79b059c0f5a1bcadbe63dd2fa9a889e256315d7b 100644 (file)
@@ -1,79 +1,12 @@
-import msp_interface;
-import common;
 import environment;
+import lighting;
 import shadow;
 
-struct PbrMaterialParameters
-{
-       vec4 base_color;
-       vec4 tint;
-       vec4 emission;
-       float metalness;
-       float roughness;
-};
-
-layout(set=1) uniform PbrMaterial
-{
-       PbrMaterialParameters pbr_material;
-       AlphaCutoffParams alpha_cutoff;
-};
-
-layout(set=1) uniform sampler2D base_color_map;
-layout(set=1) uniform sampler2D metalness_map;
-layout(set=1) uniform sampler2D roughness_map;
-layout(set=1) uniform sampler2D occlusion_map;
-layout(set=1) uniform sampler2D emission_map;
 layout(set=1) uniform sampler2D fresnel_lookup;
 
-layout(constant_id=auto) const bool use_base_color_map = false;
-layout(constant_id=auto) const bool use_metalness_map = false;
-layout(constant_id=auto) const bool use_roughness_map = false;
-layout(constant_id=auto) const bool use_occlusion_map = false;
-layout(constant_id=auto) const bool use_emission = false;
-layout(constant_id=auto) const bool use_emission_map = false;
 layout(constant_id=auto) const bool use_image_based_lighting = false;
 
 #pragma MSP stage(fragment)
-virtual vec4 get_base_color()
-{
-       if(use_base_color_map)
-               return texture(base_color_map, texcoord.xy)*pbr_material.tint;
-       else
-               return pbr_material.base_color*pbr_material.tint;
-}
-
-virtual float get_metalness_value()
-{
-       if(use_metalness_map)
-               return texture(metalness_map, texcoord.xy).r;
-       else
-               return pbr_material.metalness;
-}
-
-virtual float get_roughness_value()
-{
-       if(use_roughness_map)
-               return texture(roughness_map, texcoord.xy).r;
-       else
-               return pbr_material.roughness;
-}
-
-virtual float get_occlusion_value()
-{
-       if(use_occlusion_map)
-               return texture(occlusion_map, texcoord.xy).r;
-       else
-               return 1.0;
-}
-
-virtual vec3 get_emission_color()
-{
-       if(use_emission_map)
-               return texture(emission_map, texcoord.xy).rgb;
-       else
-               return pbr_material.emission.rgb;
-}
-
 /* Computes the diffuse reflection of the macrosurface */
 vec3 lambert_diffuse(vec3 base_color)
 {
@@ -168,22 +101,3 @@ vec3 cooktorrance_lighting(vec3 normal, vec3 look, vec3 base_color, float metaln
 
        return color;
 }
-
-void main()
-{
-       vec4 base_color = get_base_color();
-       float alpha = apply_alpha_cutoff(base_color.a, alpha_cutoff);
-
-       vec3 normal = get_fragment_normal();
-       vec3 look = normalize(world_look_dir);
-
-       float metalness = get_metalness_value();
-       float roughness = get_roughness_value();
-       float occlusion = get_occlusion_value();
-
-       vec3 lit_color = cooktorrance_lighting(normal, look, base_color.rgb, metalness, roughness, occlusion);
-       if(use_emission)
-               lit_color += get_emission_color();
-
-       frag_color = vec4(lit_color, alpha);
-}
diff --git a/shaderlib/lighting.glsl b/shaderlib/lighting.glsl
new file mode 100644 (file)
index 0000000..762eb49
--- /dev/null
@@ -0,0 +1,33 @@
+struct LightSourceParameters
+{
+       vec4 position;
+       vec3 color;
+       int type;
+       vec3 attenuation;
+};
+
+const int max_lights = 6;
+layout(set=0) uniform Lighting
+{
+       LightSourceParameters light_sources[max_lights];
+       vec4 ambient_color;
+       vec4 fog_color;
+       //float fog_start_distance;
+       float fog_density;
+};
+
+#pragma MSP stage(fragment)
+struct IncomingLight
+{
+       vec3 direction;
+       vec3 color;
+};
+
+virtual IncomingLight get_incoming_light(int index, vec3 world_pos)
+{
+       vec4 light_pos = light_sources[index].position;
+       vec3 rel_pos = light_pos.xyz-world_pos*light_pos.w;
+       float d = length(rel_pos);
+       float attenuation = 1.0/dot(vec3(1.0, d, d*d), light_sources[index].attenuation);
+       return IncomingLight(rel_pos/d, light_sources[index].color*attenuation);
+}
index b3202738def94e9c3e061f7ccb7304f47ad59104..2b878b2b14569a75aa77d5da5ef08c0cb130488f 100644 (file)
@@ -1,11 +1,3 @@
-struct LightSourceParameters
-{
-       vec4 position;
-       vec3 color;
-       int type;
-       vec3 attenuation;
-};
-
 layout(push_constant) uniform ObjectTransform
 {
        mat4 world_obj_matrix;
@@ -19,15 +11,6 @@ layout(set=0) uniform CameraTransform
        mat4 eye_clip_matrix;
 };
 
-const int max_lights = 6;
-layout(set=0) uniform Lighting
-{
-       LightSourceParameters light_sources[max_lights];
-       vec4 ambient_color;
-       vec4 fog_color;
-       float fog_density;
-};
-
 #pragma MSP stage(vertex)
 layout(location=0) in vec4 vertex;
 layout(location=1) in vec4 color;
diff --git a/shaderlib/pbr_material.glsl b/shaderlib/pbr_material.glsl
new file mode 100644 (file)
index 0000000..7af4ea2
--- /dev/null
@@ -0,0 +1,91 @@
+import msp_interface;
+import common;
+import cooktorrance;
+
+struct PbrMaterialParameters
+{
+       vec4 base_color;
+       vec4 tint;
+       vec4 emission;
+       float metalness;
+       float roughness;
+};
+
+layout(set=1) uniform PbrMaterial
+{
+       PbrMaterialParameters pbr_material;
+       AlphaCutoffParams alpha_cutoff;
+};
+
+layout(set=1) uniform sampler2D base_color_map;
+layout(set=1) uniform sampler2D metalness_map;
+layout(set=1) uniform sampler2D roughness_map;
+layout(set=1) uniform sampler2D occlusion_map;
+layout(set=1) uniform sampler2D emission_map;
+
+layout(constant_id=auto) const bool use_base_color_map = false;
+layout(constant_id=auto) const bool use_metalness_map = false;
+layout(constant_id=auto) const bool use_roughness_map = false;
+layout(constant_id=auto) const bool use_occlusion_map = false;
+layout(constant_id=auto) const bool use_emission = false;
+layout(constant_id=auto) const bool use_emission_map = false;
+
+#pragma MSP stage(fragment)
+virtual vec4 get_base_color()
+{
+       if(use_base_color_map)
+               return texture(base_color_map, texcoord.xy)*pbr_material.tint;
+       else
+               return pbr_material.base_color*pbr_material.tint;
+}
+
+virtual float get_metalness_value()
+{
+       if(use_metalness_map)
+               return texture(metalness_map, texcoord.xy).r;
+       else
+               return pbr_material.metalness;
+}
+
+virtual float get_roughness_value()
+{
+       if(use_roughness_map)
+               return texture(roughness_map, texcoord.xy).r;
+       else
+               return pbr_material.roughness;
+}
+
+virtual float get_occlusion_value()
+{
+       if(use_occlusion_map)
+               return texture(occlusion_map, texcoord.xy).r;
+       else
+               return 1.0;
+}
+
+virtual vec3 get_emission_color()
+{
+       if(use_emission_map)
+               return texture(emission_map, texcoord.xy).rgb;
+       else
+               return pbr_material.emission.rgb;
+}
+
+void main()
+{
+       vec4 base_color = get_base_color();
+       float alpha = apply_alpha_cutoff(base_color.a, alpha_cutoff);
+
+       vec3 normal = get_fragment_normal();
+       vec3 look = normalize(world_look_dir);
+
+       float metalness = get_metalness_value();
+       float roughness = get_roughness_value();
+       float occlusion = get_occlusion_value();
+
+       vec3 lit_color = cooktorrance_lighting(normal, look, base_color.rgb, metalness, roughness, occlusion);
+       if(use_emission)
+               lit_color += get_emission_color();
+
+       frag_color = vec4(lit_color, alpha);
+}
index 5ce5cb91c1cf0a9d4f00be8a6c51e9aa50c28fbd..7c555e75208344559195a68c1b9ad741bd884d24 100644 (file)
@@ -1,5 +1,6 @@
 import msp_interface;
 import common;
+import lighting;
 import shadow;
 import environment;
 
index 049ec188e5a97a67a6e42a6a87e5e3c315e284df..d533b4ec389913cef931cd7cce4021f5c253ef3d 100644 (file)
@@ -1,4 +1,4 @@
-import msp_interface;
+import lighting;
 
 struct ShadowParameters
 {
index c5d849c1cfcc6030a5caa5ff430907db439d9462..b153a2cbeb32b890aec9cb9219725d73fd18f92a 100644 (file)
@@ -66,7 +66,7 @@ const Texture2D &PbrMaterial::get_or_create_fresnel_lookup()
 
 void PbrMaterial::fill_program_info(string &module_name, map<string, int> &spec_values) const
 {
-       module_name = "cooktorrance.glsl";
+       module_name = "pbr_material.glsl";
        spec_values["use_base_color_map"] = (base_color.texture!=0);
        spec_values["use_normal_map"] = (normal.texture!=0);
        spec_values["use_metalness_map"] = (metalness.texture!=0);