JavaFX | 그래픽 특수 효과 | 효과 체인 여러 시각 효과를 적용

다양한 시각 효과를 소개했지만, 이 모든 Node의 “setEffect"로 설정을 했었다. 결국은 동시에 여러 Effect를 설정할 수 없다는 것이다.

하지만 실제에 여러 시각 효과를 동시에 사용하고 싶은 경우가 있다. 이런 경우는 어떻게 해야 할까?

이것은 좀 발상을 바꾸어 생각해야할 필요가 한다. setEffect에서 설정할 수 있는 Effect는 1개뿐이다. 이것은 바꾸려는 것이 아니다. 주목해야 하는 것은 적용하는 Node가 아니라 시각적 효과가 될 Effect 클래스이다.

Effect 클래스는 입력된 이미지에 효과를 적용하여 출력하는 역할을 한다. 즉 “입력 이미지"을 변환해서 “출력 이미지"를 생성하여 전달하는 것이다. 결국은 어떤 시각 효과의 출력을 다른 시각 효과의 입력에 전달할 수 있다면, 여러 시각 효과를 사용할 수있을 것이다.

즉, “시각 효과 A” → “시각 효과 B"→ “시각 효과 C”……로 차례로 시각 효과를 적용해 가고, 최종 결과를 setEffect로 설정하는 것이다. 이것을 “효과 체인(effect chain)“이라고 한다. 이 효과 체인은 “setInput “라는 메소드를 이용하여 설정할 수 있다.

"Effect".setInput("Effect");

setInput는 시각 효과가 있는 Effect 클래스의 메소드이다. 인수에는 다른 Effect 인스턴스를 지정한다. 따라서 인수로 설정된 Effect의 결과를 바탕으로 더욱 시각적 효과를 설정할 수 있다.

실제 사용 예제는 아래와 같다.

public void createShape(Pane root){
    InnerShadow is = new InnerShadow(10.0, 2.0, 2.0, Color.rgb(0, 100, 100));
    DropShadow ds = new DropShadow(20.0, 10.0, 5.0, Color.BLACK);
    ds.setInput(is);
    Reflection rf = new Reflection(0.0, 2.0, 0.5, 0);
    rf.setInput(ds);
 
    Rectangle r = new Rectangle(20, 20, 100, 50);
    r.setFill(Color.CYAN);
    r.setEffect(rf);
    root.getChildren().add(r);
}

여기서 InnerShadow, DropShadow, Reflection 3가지 Effect를 setInput에 이어 시각 효과를 생성한다. 효과 체인 사용법을 알면 얼마든지 시각 효과를 조합해 사용할 수 있다.