How to Apply 3D Effects and Shadows to Shapes
This guide shows how to apply 2D and 3D visual effects to PowerPoint shapes using Aspose.Slides FOSS for C++. Use shape.effect_format() for 2D effects such as outer shadow, glow, blur, and soft edge. Use shape.three_d_format() for 3D appearance including bevel, camera perspective, light rig, material, and depth. Both effect systems can be combined on the same shape.
Prerequisites
Clone the repository and build with CMake to produce the static library to link against:
git clone https://github.com/aspose-slides-foss/Aspose.Slides-FOSS-for-Cpp.git
cd Aspose.Slides-FOSS-for-Cpp && mkdir build && cd build
cmake .. && cmake --build .Add an Outer Drop Shadow
Call shape.effect_format().enable_outer_shadow_effect() to activate the outer shadow, then configure blur_radius, direction, and distance via the returned effect object:
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::RECTANGLE, 100, 100, 300, 120);
shape.text_frame()->set_text("Shadowed Shape");
auto& ef = shape.effect_format();
ef.enable_outer_shadow_effect();
auto* shadow = ef.outer_shadow_effect();
shadow->set_blur_radius(10); // softness in points
shadow->set_direction(315); // 315 deg = upper-left
shadow->set_distance(8); // offset in points
shadow->shadow_color().set_color(
asf::Drawing::Color::from_argb(128, 0, 0, 0));
prs.save("shadow.pptx", asf::SaveFormat::PPTX);
return 0;
}Common direction values: 0=right, 45=lower-right, 90=down, 180=left, 270=up, 315=upper-left.
Add a Glow Effect
Call shape.effect_format().enable_glow_effect() to activate the glow, then set radius and color on the returned glow object:
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::ELLIPSE, 150, 100, 250, 250);
auto& ef = shape.effect_format();
ef.enable_glow_effect();
auto* glow = ef.glow_effect();
glow->set_radius(20);
glow->color().set_color(asf::Drawing::Color::gold);
prs.save("glow.pptx", asf::SaveFormat::PPTX);
return 0;
}Apply a Gaussian Blur
Apply a Gaussian blur to a shape by calling shape.effect_format().set_blur_effect(radius, grow) where radius controls the blur spread in points:
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::RECTANGLE, 100, 100, 350, 180);
shape.effect_format().set_blur_effect(10, true);
prs.save("blur.pptx", asf::SaveFormat::PPTX);
return 0;
}grow=true expands the blur region beyond the shape boundary; grow=false clips the blur inside the shape.
Apply a 3D Bevel
Access shape.three_d_format().bevel_top() and set bevel_type, width, and height to add a raised 3D border around the shape:
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::RECTANGLE, 150, 150, 280, 120);
shape.text_frame()->set_text("3D Button");
auto& tdf = shape.three_d_format();
tdf.bevel_top().set_bevel_type(asf::BevelPresetType::CIRCLE);
tdf.bevel_top().set_width(12);
tdf.bevel_top().set_height(6);
prs.save("bevel.pptx", asf::SaveFormat::PPTX);
return 0;
}BevelPresetType values: CIRCLE, RELAXED_INSET, COOL_SLANT, DIVOT, RIBLET, HARD_EDGE, SLOPE, CONVEX
3D Bevel with Camera and Light Rig
Set three_d_format().camera().set_camera_type(), light_rig().set_light_type(), set_material(), and set_depth() together to achieve a fully rendered 3D appearance:
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::RECTANGLE, 150, 150, 280, 120);
shape.text_frame()->set_text("Metal Button");
auto& tdf = shape.three_d_format();
tdf.bevel_top().set_bevel_type(asf::BevelPresetType::CIRCLE);
tdf.bevel_top().set_width(10);
tdf.bevel_top().set_height(5);
tdf.camera().set_camera_type(asf::CameraPresetType::PERSPECTIVE_ABOVE);
tdf.light_rig().set_light_type(asf::LightRigPresetType::BALANCED);
tdf.light_rig().set_direction(asf::LightingDirection::TOP);
tdf.set_material(asf::MaterialPresetType::METAL);
tdf.set_depth(20);
prs.save("3d-metal.pptx", asf::SaveFormat::PPTX);
return 0;
}Combine Shadow and 3D Bevel
Both effect systems can be active simultaneously on the same shape:
#include <Aspose/Slides/Foss/presentation.h>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::ROUND_CORNER_RECTANGLE, 150, 150, 320, 130);
shape.text_frame()->set_text("Premium Card");
// Solid fill
shape.fill_format().set_fill_type(asf::FillType::SOLID);
shape.fill_format().solid_fill_color().set_color(
asf::Drawing::Color::from_argb(255, 30, 80, 180));
// 3D bevel
auto& tdf = shape.three_d_format();
tdf.bevel_top().set_bevel_type(asf::BevelPresetType::CIRCLE);
tdf.bevel_top().set_width(8);
tdf.camera().set_camera_type(asf::CameraPresetType::PERSPECTIVE_ABOVE);
tdf.set_material(asf::MaterialPresetType::PLASTIC);
// Drop shadow
auto& ef = shape.effect_format();
ef.enable_outer_shadow_effect();
auto* shadow2 = ef.outer_shadow_effect();
shadow2->set_blur_radius(12);
shadow2->set_direction(270);
shadow2->set_distance(6);
shadow2->shadow_color().set_color(
asf::Drawing::Color::from_argb(80, 0, 0, 0));
prs.save("premium-card.pptx", asf::SaveFormat::PPTX);
return 0;
}Check and Remove Effects
Use effect_format().is_no_effects() to detect whether any effects are active, and call disable_outer_shadow_effect() or disable_glow_effect() to remove individual effects:
#include <Aspose/Slides/Foss/presentation.h>
#include <iostream>
int main() {
namespace asf = Aspose::Slides::Foss;
asf::Presentation prs;
auto& shape = prs.slides()[0].shapes().add_auto_shape(
asf::ShapeType::RECTANGLE, 100, 100, 200, 100);
auto& ef = shape.effect_format();
ef.enable_outer_shadow_effect();
ef.enable_glow_effect();
std::cout << "Has effects: " << !ef.is_no_effects() << "\n"; // 1
ef.disable_outer_shadow_effect();
ef.disable_glow_effect();
std::cout << "Has effects: " << !ef.is_no_effects() << "\n"; // 0
return 0;
}