From 8a4493b4d3076a25b20d159b388cd82ecfc3895e Mon Sep 17 00:00:00 2001 From: ahcorde Date: Tue, 22 Dec 2020 22:35:44 +0100 Subject: [PATCH 1/7] Added render order to material Signed-off-by: ahcorde --- include/ignition/rendering/Material.hh | 11 ++++++++ .../ignition/rendering/base/BaseMaterial.hh | 26 +++++++++++++++++++ .../ignition/rendering/ogre/OgreMaterial.hh | 6 +++++ ogre/src/OgreMaterial.cc | 13 ++++++++++ .../ignition/rendering/ogre2/Ogre2Material.hh | 6 +++++ ogre2/src/Ogre2Material.cc | 16 ++++++++++++ 6 files changed, 78 insertions(+) diff --git a/include/ignition/rendering/Material.hh b/include/ignition/rendering/Material.hh index b74c82774..eab0dee94 100644 --- a/include/ignition/rendering/Material.hh +++ b/include/ignition/rendering/Material.hh @@ -301,6 +301,17 @@ namespace ignition /// \brief Removes any emissive map mapped to this material public: virtual void ClearEmissiveMap() = 0; + /// \brief Set the render order. When polygons are coplanar, you can get + /// problems with 'depth fighting' where the pixels from the two polys + /// compete for the same screen pixel. This param help to avoid this + /// problem. + /// \param[in] _renderOrder Render order to set to + public: virtual void SetRenderOrder(const float _renderOrder) = 0; + + /// \brief Get the render order value of this material. + /// \return Material render order + public: virtual float RenderOrder() const = 0; + /// \brief Set the roughness value. Only affects material of type MT_PBS /// \param[in] _roughness Roughness to set to public: virtual void SetRoughness(const float _roughness) = 0; diff --git a/include/ignition/rendering/base/BaseMaterial.hh b/include/ignition/rendering/base/BaseMaterial.hh index f77200659..4494a6559 100644 --- a/include/ignition/rendering/base/BaseMaterial.hh +++ b/include/ignition/rendering/base/BaseMaterial.hh @@ -232,6 +232,12 @@ namespace ignition // Documentation inherited public: virtual void ClearEmissiveMap() override; + // Documentation inherited + public: virtual void SetRenderOrder(const float _renderOrder) override; + + // Documentation inherited + public: virtual float RenderOrder() const override; + // Documentation inherited public: virtual void SetRoughness(const float _roughness) override; @@ -322,6 +328,9 @@ namespace ignition /// \brief Enable two sided rendering protected: bool twoSidedEnabled = false; + /// \brief Material render order + protected: double renderOrder = 0.0; + /// \brief Shininess factor protected: double shininess = 0.0; @@ -513,6 +522,13 @@ namespace ignition this->receiveShadows = _receive; } + ////////////////////////////////////////////////// + template + void BaseMaterial::SetRenderOrder(const float _renderorder) + { + this->renderOrder = _renderorder; + } + ////////////////////////////////////////////////// template math::Color BaseMaterial::Ambient() const @@ -555,6 +571,13 @@ namespace ignition return this->transparency; } + ////////////////////////////////////////////////// + template + float BaseMaterial::RenderOrder() const + { + return this->renderOrder; + } + ////////////////////////////////////////////////// template double BaseMaterial::Reflectivity() const @@ -872,6 +895,7 @@ namespace ignition this->SetDiffuse(_material->Diffuse()); this->SetSpecular(_material->Specular()); this->SetEmissive(_material->Emissive()); + this->SetRenderOrder(_material->RenderOrder()); this->SetShininess(_material->Shininess()); this->SetTransparency(_material->Transparency()); this->SetAlphaFromTexture(_material->TextureAlphaEnabled(), @@ -910,6 +934,7 @@ namespace ignition this->SetAlphaFromTexture(_material.TextureAlphaEnabled(), _material.AlphaThreshold(), _material.TwoSidedEnabled()); // TODO(anyone): update common::Material + this->SetRenderOrder(_material.RenderOrder()); this->SetReflectivity(0); this->SetTexture(_material.TextureImage()); // TODO(anyone): update common::Material @@ -961,6 +986,7 @@ namespace ignition this->SetDiffuse(1.0, 1.0, 1.0); this->SetSpecular(0.2, 0.2, 0.2); this->SetEmissive(0, 0, 0); + this->SetRenderOrder(0); this->SetShininess(1.5); this->SetTransparency(0); this->SetReflectivity(0); diff --git a/ogre/include/ignition/rendering/ogre/OgreMaterial.hh b/ogre/include/ignition/rendering/ogre/OgreMaterial.hh index 1e14fe3ef..9f56aea64 100644 --- a/ogre/include/ignition/rendering/ogre/OgreMaterial.hh +++ b/ogre/include/ignition/rendering/ogre/OgreMaterial.hh @@ -103,6 +103,12 @@ namespace ignition public: virtual void SetReceiveShadows(const bool _receiveShadows) override; + // Documentation inherited + public: virtual float RenderOrder() const override; + + // Documentation inherited + public: virtual void SetRenderOrder(const float _enabled) override; + public: virtual bool ReflectionEnabled() const override; public: virtual void SetReflectionEnabled(const bool _enabled) override; diff --git a/ogre/src/OgreMaterial.cc b/ogre/src/OgreMaterial.cc index a92132791..7bb90d0c4 100644 --- a/ogre/src/OgreMaterial.cc +++ b/ogre/src/OgreMaterial.cc @@ -156,6 +156,19 @@ void OgreMaterial::SetEmissive(const math::Color &_color) #endif } +////////////////////////////////////////////////// +float OgreMaterial::RenderOrder() const +{ + return this->renderOrder; +} + +////////////////////////////////////////////////// +void OgreMaterial::SetRenderOrder(const float _renderOrder) +{ + this->renderOrder = _renderOrder; + this->ogrePass->setDepthBias(this->renderOrder); +} + ////////////////////////////////////////////////// double OgreMaterial::Shininess() const { diff --git a/ogre2/include/ignition/rendering/ogre2/Ogre2Material.hh b/ogre2/include/ignition/rendering/ogre2/Ogre2Material.hh index 56258eceb..f0cf01940 100644 --- a/ogre2/include/ignition/rendering/ogre2/Ogre2Material.hh +++ b/ogre2/include/ignition/rendering/ogre2/Ogre2Material.hh @@ -71,6 +71,12 @@ namespace ignition public: virtual void SetAlphaFromTexture(bool _enabled, double _alpha = 0.5, bool _twoSided = true) override; + // Documentation inherited + public: virtual float RenderOrder() const override; + + // Documentation inherited + public: virtual void SetRenderOrder(const float _enabled) override; + // Documentation inherited public: virtual bool ReceiveShadows() const override; diff --git a/ogre2/src/Ogre2Material.cc b/ogre2/src/Ogre2Material.cc index ce9a968a0..e8f83acd6 100644 --- a/ogre2/src/Ogre2Material.cc +++ b/ogre2/src/Ogre2Material.cc @@ -167,6 +167,22 @@ void Ogre2Material::SetAlphaFromTexture(bool _enabled, this->ogreDatablock->setTwoSidedLighting(_twoSided); } +////////////////////////////////////////////////// +float Ogre2Material::RenderOrder() const +{ + return this->renderOrder; +} + +////////////////////////////////////////////////// +void Ogre2Material::SetRenderOrder(const float _renderOrder) +{ + this->renderOrder = _renderOrder; + Ogre::HlmsMacroblock macroblock( + *this->ogreDatablock->getMacroblock()); + macroblock.mDepthBiasConstant = _renderOrder; + this->ogreDatablock->setMacroblock(macroblock); +} + ////////////////////////////////////////////////// bool Ogre2Material::ReceiveShadows() const { From b50de4286b586a1651e5f49467283641ac803e82 Mon Sep 17 00:00:00 2001 From: ahcorde Date: Wed, 23 Dec 2020 12:02:18 +0100 Subject: [PATCH 2/7] Improved docblock Signed-off-by: ahcorde --- ogre/include/ignition/rendering/ogre/OgreMaterial.hh | 5 ++++- ogre2/include/ignition/rendering/ogre2/Ogre2Material.hh | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ogre/include/ignition/rendering/ogre/OgreMaterial.hh b/ogre/include/ignition/rendering/ogre/OgreMaterial.hh index 9f56aea64..77c41a2e3 100644 --- a/ogre/include/ignition/rendering/ogre/OgreMaterial.hh +++ b/ogre/include/ignition/rendering/ogre/OgreMaterial.hh @@ -107,7 +107,10 @@ namespace ignition public: virtual float RenderOrder() const override; // Documentation inherited - public: virtual void SetRenderOrder(const float _enabled) override; + // Review the official documentation to get more details about this + // parameter, in particular Ogre::Pass::setDepthBias() + // https://www.ogre3d.org/docs/api/1.8/class_ogre_1_1_pass.html + public: virtual void SetRenderOrder(const float _renderOrder) override; public: virtual bool ReflectionEnabled() const override; diff --git a/ogre2/include/ignition/rendering/ogre2/Ogre2Material.hh b/ogre2/include/ignition/rendering/ogre2/Ogre2Material.hh index f0cf01940..66565cb41 100644 --- a/ogre2/include/ignition/rendering/ogre2/Ogre2Material.hh +++ b/ogre2/include/ignition/rendering/ogre2/Ogre2Material.hh @@ -75,7 +75,9 @@ namespace ignition public: virtual float RenderOrder() const override; // Documentation inherited - public: virtual void SetRenderOrder(const float _enabled) override; + // Review the official documentation to get more details about this + // parameter, in particular mDepthBiasConstant + public: virtual void SetRenderOrder(const float _renderOrder) override; // Documentation inherited public: virtual bool ReceiveShadows() const override; From 27574a35ed8393b847d2bb735d95a4377e38b396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Hern=C3=A1ndez=20Cordero?= Date: Tue, 29 Dec 2020 01:03:01 +0100 Subject: [PATCH 3/7] Extending simple_demo to include render order (#190) Signed-off-by: ahcorde --- examples/simple_demo/Main.cc | 16 +++++- include/ignition/rendering/MeshDescriptor.hh | 4 ++ ogre2/src/Ogre2Material.cc | 2 +- tutorials/21_render_order.md | 52 +++++++++++++++++++ tutorials/img/render_order_bad.png | Bin 0 -> 28393 bytes tutorials/img/render_order_good.png | Bin 0 -> 36242 bytes 6 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 tutorials/21_render_order.md create mode 100644 tutorials/img/render_order_bad.png create mode 100644 tutorials/img/render_order_good.png diff --git a/examples/simple_demo/Main.cc b/examples/simple_demo/Main.cc index 36f09cf4c..6f70ba2e8 100644 --- a/examples/simple_demo/Main.cc +++ b/examples/simple_demo/Main.cc @@ -79,7 +79,7 @@ void buildScene(ScenePtr _scene) center->SetMaterial(green); root->AddChild(center); - +//! [red material] // create red material MaterialPtr red = _scene->CreateMaterial(); red->SetAmbient(0.5, 0.0, 0.0); @@ -87,6 +87,8 @@ void buildScene(ScenePtr _scene) red->SetSpecular(0.5, 0.5, 0.5); red->SetShininess(50); red->SetReflectivity(0); + red->SetRenderOrder(3); +//! [red material] // create sphere visual VisualPtr sphere = _scene->CreateVisual(); @@ -116,12 +118,15 @@ void buildScene(ScenePtr _scene) box->SetMaterial(blue); root->AddChild(box); +//! [white material] // create white material MaterialPtr white = _scene->CreateMaterial(); white->SetAmbient(0.5, 0.5, 0.5); white->SetDiffuse(0.8, 0.8, 0.8); white->SetReceiveShadows(true); white->SetReflectivity(0); + white->SetRenderOrder(0); +//! [white material] // create plane visual VisualPtr plane = _scene->CreateVisual(); @@ -131,6 +136,15 @@ void buildScene(ScenePtr _scene) plane->SetMaterial(white); root->AddChild(plane); + // create plane visual + VisualPtr plane2 = _scene->CreateVisual(); + plane2->AddGeometry(_scene->CreatePlane()); + plane2->SetLocalScale(5, 8, 1); + plane2->SetLocalPosition(4, 0.5, -0.5); + plane2->Scale(0.1, 0.1, 1); + plane2->SetMaterial(red); + root->AddChild(plane2); + // create axis visual VisualPtr axis = _scene->CreateAxisVisual(); axis->SetLocalPosition(4.0, 0.5, -0.4); diff --git a/include/ignition/rendering/MeshDescriptor.hh b/include/ignition/rendering/MeshDescriptor.hh index ff6928a1d..ca71faf51 100644 --- a/include/ignition/rendering/MeshDescriptor.hh +++ b/include/ignition/rendering/MeshDescriptor.hh @@ -65,12 +65,16 @@ namespace ignition public: const common::Mesh *mesh = nullptr; IGN_COMMON_WARN_RESUME__DLL_INTERFACE_MISSING + IGN_COMMON_WARN_IGNORE__DLL_INTERFACE_MISSING /// \brief Name of the registered Mesh public: std::string meshName; + IGN_COMMON_WARN_RESUME__DLL_INTERFACE_MISSING + IGN_COMMON_WARN_IGNORE__DLL_INTERFACE_MISSING /// \brief Name of the sub-mesh to be loaded. An empty string signifies /// all sub-meshes should be loaded. public: std::string subMeshName; + IGN_COMMON_WARN_RESUME__DLL_INTERFACE_MISSING /// \brief Denotes if the loaded sub-mesh vertices should be centered public: bool centerSubMesh = false; diff --git a/ogre2/src/Ogre2Material.cc b/ogre2/src/Ogre2Material.cc index 1b9af6b4e..deb0a2f28 100644 --- a/ogre2/src/Ogre2Material.cc +++ b/ogre2/src/Ogre2Material.cc @@ -154,8 +154,8 @@ void Ogre2Material::SetAlphaFromTexture(bool _enabled, Ogre::HlmsBlendblock block; if (_enabled) { - block.setBlendType(Ogre::SBT_TRANSPARENT_ALPHA); this->ogreDatablock->setAlphaTest(Ogre::CMPF_GREATER_EQUAL); + block.setBlendType(Ogre::SBT_TRANSPARENT_ALPHA); this->ogreDatablock->setBlendblock(block); } else diff --git a/tutorials/21_render_order.md b/tutorials/21_render_order.md new file mode 100644 index 000000000..8f56bc34f --- /dev/null +++ b/tutorials/21_render_order.md @@ -0,0 +1,52 @@ +\page render_order Render order + +This example shows how to set the render order for coplanar poligons. + +The material API allows changing the render order. When polygons are coplanar, you can get problems +with `depth fighting` where the pixels from the two polys compete for the same screen pixel. As you +can see in the following image: + +@image html img/render_order_bad.png + +The method `SetRenderOrder` in the Material class allows avoiding this issue. The higher value will +be rendered on top of other coplanar polygons. + +In the `simple_demo` example you can find two materials with different render orders. The red material +(`SetRenderOrder(3)`) has a higher value than the white material (`SetRenderOrder(3)`). + +\snippet examples/render_pass/Main.cc red material + +\snippet examples/simple_demo/Main.cc white material + +As you can see in the following image the z-fighting issue is resolved. + +@image html img/render_order_good.png + +You can set this in your SDF file including in the material tag a new tag called `render_order` with +a float value: + +```xml + + 5 + 0 0 1 1 + 0 0 1 1 + 0 0 1 1 + +``` + +Clone the source code, create a build directory and use `cmake` and `make` to compile the code: + +```{.sh} +git clone https://github.com/ignitionrobotics/ign-rendering +cd ign-rendering/examples/simple_demo +mkdir build +cd build +cmake .. +make +``` + +Execute the example: + +```{.sh} +./simple_demo +``` diff --git a/tutorials/img/render_order_bad.png b/tutorials/img/render_order_bad.png new file mode 100644 index 0000000000000000000000000000000000000000..40ad77ca1f1e332a06e70fedb7496ec339696a4b GIT binary patch literal 28393 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 literal 0 HcmV?d00001 diff --git a/tutorials/img/render_order_good.png b/tutorials/img/render_order_good.png new file mode 100644 index 0000000000000000000000000000000000000000..1ecba89506d7353be56d076fc022bd132d616013 GIT binary patch literal 36242 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 Date: Wed, 30 Dec 2020 13:33:49 +0100 Subject: [PATCH 4/7] place TODO in the right place Signed-off-by: ahcorde --- include/ignition/rendering/base/BaseMaterial.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/ignition/rendering/base/BaseMaterial.hh b/include/ignition/rendering/base/BaseMaterial.hh index b10b67825..f46513841 100644 --- a/include/ignition/rendering/base/BaseMaterial.hh +++ b/include/ignition/rendering/base/BaseMaterial.hh @@ -986,8 +986,8 @@ namespace ignition this->SetTransparency(_material.Transparency()); this->SetAlphaFromTexture(_material.TextureAlphaEnabled(), _material.AlphaThreshold(), _material.TwoSidedEnabled()); - // TODO(anyone): update common::Material this->SetRenderOrder(_material.RenderOrder()); + // TODO(anyone): update common::Material this->SetReflectivity(0); this->SetTexture(_material.TextureImage()); // TODO(anyone): update common::Material From 243e46d9fea93e333ae717119c345e52526cd765 Mon Sep 17 00:00:00 2001 From: ahcorde Date: Tue, 5 Jan 2021 08:42:43 +0100 Subject: [PATCH 5/7] Added feedback Signed-off-by: ahcorde --- tutorials.md.in | 1 + tutorials/21_render_order.md | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/tutorials.md.in b/tutorials.md.in index 28beae56a..d5c8d6bac 100644 --- a/tutorials.md.in +++ b/tutorials.md.in @@ -22,6 +22,7 @@ Ignition @IGN_DESIGNATION_CAP@ library and how to use the library effectively. 8. \subpage simple_demo "Simple demo" 9. \subpage text_geom "Text geom" 10. \subpage particles "Particles" +10. \subpage render_order "Render Order" ## License diff --git a/tutorials/21_render_order.md b/tutorials/21_render_order.md index 8f56bc34f..c6a37daf3 100644 --- a/tutorials/21_render_order.md +++ b/tutorials/21_render_order.md @@ -1,24 +1,24 @@ \page render_order Render order -This example shows how to set the render order for coplanar poligons. +This example shows how to set the render order for coplanar polygons. The material API allows changing the render order. When polygons are coplanar, you can get problems -with `depth fighting` where the pixels from the two polys compete for the same screen pixel. As you -can see in the following image: +with `depth fighting` (also known as z fighting) where the pixels from the two polys compete for the same screen pixel. +As you can see in the following image: @image html img/render_order_bad.png -The method `SetRenderOrder` in the Material class allows avoiding this issue. The higher value will -be rendered on top of other coplanar polygons. +The method `SetRenderOrder` in the Material class allows you to avoid this issue. The higher value will +be rendered on top of other coplanar polygons. This method will set the depth bias value of objects that the material is assigned to. In the `simple_demo` example you can find two materials with different render orders. The red material (`SetRenderOrder(3)`) has a higher value than the white material (`SetRenderOrder(3)`). -\snippet examples/render_pass/Main.cc red material +\snippet examples/simple_demo/Main.cc red material \snippet examples/simple_demo/Main.cc white material -As you can see in the following image the z-fighting issue is resolved. +As you can see in the following image the depth fighting issue is resolved. @image html img/render_order_good.png From 5b64d96b2aec82afa5b8b1714bfa8951a200eda6 Mon Sep 17 00:00:00 2001 From: ahcorde Date: Tue, 5 Jan 2021 19:58:44 +0100 Subject: [PATCH 6/7] Fixed tutorial number Signed-off-by: ahcorde --- tutorials.md.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials.md.in b/tutorials.md.in index d5c8d6bac..6b248afcb 100644 --- a/tutorials.md.in +++ b/tutorials.md.in @@ -22,7 +22,7 @@ Ignition @IGN_DESIGNATION_CAP@ library and how to use the library effectively. 8. \subpage simple_demo "Simple demo" 9. \subpage text_geom "Text geom" 10. \subpage particles "Particles" -10. \subpage render_order "Render Order" +11. \subpage render_order "Render Order" ## License From 4b9c5844a0e4eabdf404da2dfdec2b6d20e8425b Mon Sep 17 00:00:00 2001 From: Louise Poubel Date: Tue, 5 Jan 2021 17:22:03 -0800 Subject: [PATCH 7/7] Depend on ign-common 3.10.0 Signed-off-by: Louise Poubel --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bde066f92..b5e956aa0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ set(IGN_MATH_VER ${ignition-math6_VERSION_MAJOR}) # Find ignition-common ign_find_package(ignition-common3 REQUIRED COMPONENTS graphics events - VERSION 3.9) + VERSION 3.10) set(IGN_COMMON_VER ${ignition-common3_VERSION_MAJOR}) #--------------------------------------