Allow materials to return per-texture samplers master
authorMikko Rasa <tdb@tdb.fi>
Fri, 13 Aug 2021 10:54:33 +0000 (13:54 +0300)
committerMikko Rasa <tdb@tdb.fi>
Fri, 13 Aug 2021 10:57:06 +0000 (13:57 +0300)
source/materials/material.h
source/materials/pbrmaterial.cpp
source/materials/pbrmaterial.h
source/materials/renderpass.cpp

index 43da2542612d7ba50bbb4f4e0d2ee886f7a48483..23f4085760c412dcf01b4dc5e7fd13a062cd6f69 100644 (file)
@@ -105,7 +105,7 @@ public:
 
        virtual const Tag *get_texture_tags() const = 0;
        virtual const Texture *get_texture(Tag) const = 0;
-       const Sampler *get_sampler() const { return sampler; }
+       virtual const Sampler *get_sampler(Tag) const { return sampler; }
 
        void set_debug_name(const std::string &);
 
index 082218161dd3067846bf42463729323b2fa27f4d..f50baf9b7d4cdc019728315efb1a493fa19035d9 100644 (file)
@@ -23,7 +23,8 @@ const Tag PbrMaterial::texture_tags[] =
 };
 
 PbrMaterial::PbrMaterial():
-       fresnel_lookup(get_or_create_fresnel_lookup())
+       fresnel_lookup(get_or_create_fresnel_lookup()),
+       fresnel_sampler(Resources::get_global().get<Sampler>("_linear_clamp.samp"))
 {
        set_base_color(0.8f);
        set_metalness(0.0f);
@@ -94,6 +95,14 @@ const Texture *PbrMaterial::get_texture(Tag tag) const
                return 0;
 }
 
+const Sampler *PbrMaterial::get_sampler(Tag tag) const
+{
+       if(tag==texture_tags[6])
+               return &fresnel_sampler;
+       else
+               return sampler;
+}
+
 void PbrMaterial::set_base_color(const Color &color)
 {
        base_color.value = color;
index dadda9b52358c0b029f46971fcf4d2da73d088f1..0204451b63efa0b595f39552e374da2648d819c7 100644 (file)
@@ -32,6 +32,7 @@ private:
        Property<float> occlusion;
        Property<Color> emission;
        const Texture2D &fresnel_lookup;
+       const Sampler &fresnel_sampler;
 
        static const Tag texture_tags[];
 
@@ -47,6 +48,7 @@ protected:
 public:
        virtual const Tag *get_texture_tags() const { return texture_tags; }
        virtual const Texture *get_texture(Tag) const;
+       virtual const Sampler *get_sampler(Tag) const;
 
        void set_base_color(const Color &);
        void set_base_color_map(const Texture *);
index 475f3ed8797c4e6a0bbbda0b7d28938539be9d34..70143e96a497c7e299f088855c83903c4397fedc 100644 (file)
@@ -30,7 +30,7 @@ void RenderPass::set_material_textures()
 {
        const Tag *material_texture_tags = material->get_texture_tags();
        for(const Tag *tag=material_texture_tags; tag->id; ++tag)
-               set_texture(*tag, material->get_texture(*tag), material->get_sampler());
+               set_texture(*tag, material->get_texture(*tag), material->get_sampler(*tag));
 }
 
 void RenderPass::maybe_create_material_shader()