How to Apply 3D Effects and Shadows to Shapes

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;
}

See Also

 English