퍼사드 패턴
퍼사드 패턴은 복잡한 시스템을 간단한 인터페이스를 통해 접근할 수 있도록 하는 구조를 의미합니다. 이 패턴의 주요 목적은 시스템의 복잡성을 숨기고, 사용자에게 간편하고 이해하기 쉬운 인터페이스를 제공하는 것입니다.
이 부분은 예시를 들기 어렵지만, 저희 회사에서는 주로 쉐이더와 관련된 부분을 이 패턴으로 처리합니다.
예를 들어, 쉐이더에서 Rim 효과를 주는 코드가 있다고 가정해봅시다. 이 코드는 HLSL로 작성되어 있고, 클라이언트가 이해하기 어려운 코드입니다. 이 코드를 쉽게 C#으로 제어할 수 있도록 만든 코드가 바로 퍼사드 패턴입니다.
일반적으로 이 부분은 TA분이 작성하시는 것으로 알고 있습니다.
퍼사드 패턴의 목적과 구조
목표는 복잡한 서브시스템에 대한 간결한 인터페이스를 제공하는 것입니다.
목적
1.
복잡성 감추기: 퍼사드 패턴의 주요 목표는 복잡한 서브시스템의 복잡성을 숨기고, 사용자에게 간편한 인터페이스를 제공하는 것입니다. 이를 통해 사용자는 서브시스템의 내부 구현에 대해 걱정하지 않고 필요한 기능을 사용할 수 있습니다.
a.
사실, 이 부분은 양날의 검입니다. 서브 시스템의 내부 구현에 대해 걱정하지 않는다는 것은, 문제가 발생했을 때 해당 부분의 내부 구조를 정확히 알고 있는 사람만이 문제를 찾고 해결할 수 있다는 것을 의미합니다. 따라서, 퍼사드 패턴을 사용하더라도, 대략적인 내부 코드는 파악할 수 있어야 합니다..
2.
시스템과 사용자 간 의존성 감소: 서브시스템의 구체적인 구현이 사용자 코드에서 분리되어 있어, 서브시스템을 변경해도 사용자 코드에 미치는 영향이 줄어듭니다. 이는 시스템의 유지보수와 확장성을 향상시킵니다.
3.
재사용성 향상: 퍼사드는 재사용 가능한 인터페이스를 제공하여 다양한 사용자가 동일한 인터페이스를 통해 서브시스템과 상호 작용할 수 있게 합니다.
구조
1.
퍼사드(Facade) : 이것은 클라이언트가 사용하는 주 인터페이스입니다. 퍼사드는 클라이언트의 요청을 받아 해당 요청을 서브시스템의 적절한 객체나 메서드에 전달합니다. 퍼사드는 클라이언트가 서브시스템의 복잡성을 직접 다루지 않도록 합니다.
2.
서브시스템(Subsystem) : 퍼사드 뒤에 숨겨진 다양한 모듈 또는 클래스로, 실제 작업을 수행하는 복잡한 로직을 구현합니다. 서브시스템은 자체적으로도 복잡하게 상호 작용할 수 있지만, 퍼사드를 통해 이러한 복잡성이 클라이언트에게는 노출되지 않습니다.
3.
클라이언트(Client): 이는 퍼사드를 사용하는 사용자 또는 다른 시스템입니다. 클라이언트는 퍼사드를 통해 서브시스템의 기능을 사용하며, 서브시스템의 복잡한 내부 구현에 대해서는 알 필요가 없습니다.
퍼사드 패턴 UML
퍼사드 패턴의 UML은 상황에 따라서 다르므로, 특정한 정형화된 구조는 없습니다.
퍼사드 패턴 구현
셰이더를 HLSL로 작성하고, 유니티에서 C#을 통해 이를 조작하려는 경우, 퍼사드 패턴을 적용하는 방법에 대해 설명하겠습니다.
서브시스템 : HLSL
먼저, Rim 효과를 구현하는 기본적인 HLSL 셰이더 코드입니다. 여기서 _RimColor와 _RimPower 같은 변수들이 셰이더의 키 요소입니다.
float4 _RimColor;
float _RimPower;
// Rim 효과를 계산하는 함수
float4 ComputeRimEffect(float3 normal, float3 viewDir)
{
float rim = 1.0 - max(0.0, dot(normal, viewDir));
rim = pow(rim, _RimPower);
return _RimColor * rim;
}
C#
복사
퍼사드 클래스(C#) 코드 예시
이제 C#에서 퍼사드 패턴을 사용하여 셰이더 변수를 조작하는 클래스를 구현합니다.
public class ShaderRimEffectFacade
{
private Material material;
public ShaderRimEffectFacade(Material material)
{
this.material = material;
}
public void SetRimColor(Color color)
{
material.SetColor("_RimColor", color);
}
public void SetRimPower(float power)
{
material.SetFloat("_RimPower", power);
}
}
C#
복사
클라이언트(C#) 사용 예시
마지막으로, 유니티에서 이 퍼사드 클래스를 사용하는 방법입니다.
public class GameDeveloperClient : MonoBehaviour
{
public Material materialToModify;
private ShaderRimEffectFacade rimEffectFacade;
void Start()
{
rimEffectFacade = new ShaderRimEffectFacade(materialToModify);
// Rim 효과의 색상과 강도를 설정
rimEffectFacade.SetRimColor(Color.blue);
rimEffectFacade.SetRimPower(1.5f);
}
}
C#
복사