X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=shaderlib%2Fpbr_material.glsl;fp=shaderlib%2Fpbr_material.glsl;h=7af4ea2f264b45cf0a3230dd7c441f0c6158e37b;hb=e196a09d1df1e8504ff037d1701b7159c4f04e84;hp=0000000000000000000000000000000000000000;hpb=7c797f8445ab02381e358472755e94e5c5125252;p=libs%2Fgl.git 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); +}