From e196a09d1df1e8504ff037d1701b7159c4f04e84 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Wed, 5 Oct 2022 00:34:03 +0300 Subject: [PATCH] Rearrange some things in the shader library 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 | 2 +- demos/desertpillars/data/sphere_morph.glsl | 2 + shaderlib/common.glsl | 15 ---- shaderlib/cooktorrance.glsl | 88 +-------------------- shaderlib/lighting.glsl | 33 ++++++++ shaderlib/msp_interface.glsl | 17 ---- shaderlib/pbr_material.glsl | 91 ++++++++++++++++++++++ shaderlib/phong.glsl | 1 + shaderlib/shadow.glsl | 2 +- source/materials/pbrmaterial.cpp | 2 +- 10 files changed, 131 insertions(+), 122 deletions(-) create mode 100644 shaderlib/lighting.glsl create mode 100644 shaderlib/pbr_material.glsl diff --git a/demos/desertpillars/data/sphere.glsl b/demos/desertpillars/data/sphere.glsl index 0dd872bd..46dd1f67 100644 --- a/demos/desertpillars/data/sphere.glsl +++ b/demos/desertpillars/data/sphere.glsl @@ -1,2 +1,2 @@ -import cooktorrance; +import pbr_material; import sphere_morph; diff --git a/demos/desertpillars/data/sphere_morph.glsl b/demos/desertpillars/data/sphere_morph.glsl index e020ed68..2f71cf56 100644 --- a/demos/desertpillars/data/sphere_morph.glsl +++ b/demos/desertpillars/data/sphere_morph.glsl @@ -1,3 +1,5 @@ +import msp_interface; + uniform Morph { float morph; diff --git a/shaderlib/common.glsl b/shaderlib/common.glsl index 695bce3b..249cae7c 100644 --- a/shaderlib/common.glsl +++ b/shaderlib/common.glsl @@ -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) diff --git a/shaderlib/cooktorrance.glsl b/shaderlib/cooktorrance.glsl index 5e933d5a..79b059c0 100644 --- a/shaderlib/cooktorrance.glsl +++ b/shaderlib/cooktorrance.glsl @@ -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 index 00000000..762eb493 --- /dev/null +++ b/shaderlib/lighting.glsl @@ -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); +} diff --git a/shaderlib/msp_interface.glsl b/shaderlib/msp_interface.glsl index b3202738..2b878b2b 100644 --- a/shaderlib/msp_interface.glsl +++ b/shaderlib/msp_interface.glsl @@ -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 index 00000000..7af4ea2f --- /dev/null +++ b/shaderlib/pbr_material.glsl @@ -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); +} diff --git a/shaderlib/phong.glsl b/shaderlib/phong.glsl index 5ce5cb91..7c555e75 100644 --- a/shaderlib/phong.glsl +++ b/shaderlib/phong.glsl @@ -1,5 +1,6 @@ import msp_interface; import common; +import lighting; import shadow; import environment; diff --git a/shaderlib/shadow.glsl b/shaderlib/shadow.glsl index 049ec188..d533b4ec 100644 --- a/shaderlib/shadow.glsl +++ b/shaderlib/shadow.glsl @@ -1,4 +1,4 @@ -import msp_interface; +import lighting; struct ShadowParameters { diff --git a/source/materials/pbrmaterial.cpp b/source/materials/pbrmaterial.cpp index c5d849c1..b153a2cb 100644 --- a/source/materials/pbrmaterial.cpp +++ b/source/materials/pbrmaterial.cpp @@ -66,7 +66,7 @@ const Texture2D &PbrMaterial::get_or_create_fresnel_lookup() void PbrMaterial::fill_program_info(string &module_name, map &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); -- 2.45.2