# SDSL란? Stride 엔진을 위한 새로운(혹은 옛) 쉐이더 프로그래밍 언어 완전 정복

---

# # 서론 – “왜 새로운 쉐이더 언어가 필요할까?”

게임·실시간 렌더링 분야에서는 **쉐이더**가 그래픽 파이프라인의 핵심 역할을 합니다. 기존 HLSL, GLSL, Metal‑SL 등은 각각 플랫폼에 최적화돼 있지만, **다양한 플랫폼을 동시에 지원**해야 하는 엔진 입장에서는 여러 언어를 번역·관리하는 부담이 큽니다.

Stride 엔진(이전 XNA 기반 엔진)의 개발팀은 이런 문제를 해결하고자 **SDSL (Shader Description Language)** 을 만들었습니다. “HLSL에 믹스‑인(Mix‑in) 형태로 확장된 언어”라는 설명처럼, SDSL은 HLSL의 친숙함을 유지하면서 Stride 전용 기능을 **간결하게** 추가할 수 있게 설계되었습니다.

본 글에서는 **SDSL가 무엇인지**, **Stride 엔진과 어떤 관계가 있는지**, **초보자도 바로 활용할 수 있는 기본 문법**을 단계별로 살펴보겠습니다.

> **SEO 키워드**: SDSL, 쉐이더 언어, Stride 엔진

---

# # 본론

## # 1️⃣ SDSL의 핵심 개념 – HLSL 위에 얹은 레이어

| 특징 | 기존 HLSL | SDSL에서 추가된 내용 |

|------|-----------|----------------------|

| 문법 호환성 | DirectX 11/12 전용 | HLSL 코드 그대로 사용 가능 |

| 플랫폼 추상화 | Windows 전용 | Android, iOS, macOS까지 단일 소스 |

| 매크로·템플릿 | 제한적 | `#sdl` 블록을 통한 **컴파일 타임 옵션** 제공 |

| 리소스 바인딩 | 수동 바인딩 | `@resource` 어노테이션으로 자동 바인딩 |

SDSL은 **컴파일러 단계에서** HLSL 코드를 그대로 파싱하고, `@` 어노테이션이나 `#sdl` 디렉티브를 추가해 Stride 전용 최적화 정보를 삽입합니다. 따라서 기존 HLSL을 그대로 복사·붙여넣기만 해도 바로 SDSL 파일로 변환이 가능하죠.

## # 2️⃣ Stride 엔진과 SDSL의 연동 구조

1. **ShaderAsset** – Stride 프로젝트에 포함되는 쉐이더 파일(.sdsl)

2. **SDSL Compiler** – Stride 빌드 파이프라인에 통합, HLSL → SPIR‑V / DXBC 로 변환

3. **Effect System** – 변환된 바이너리를 런타임에 로드하고, 자동으로 **Material**에 바인딩

이 흐름을 그림으로 나타내면 다음과 같습니다.

```

[SDSL 파일] → (SDSL Compiler) → [바이너리] → (Effect System) → [Material] → 화면 출력

```

핵심은 **컴파일 단계에서** 플랫폼별 최적화 옵션을 자동 적용한다는 점입니다. 예를 들어, 모바일에서는 `#sdl mobile { ... }` 블록 안의 코드를 활성화하고, 데스크톱에서는 무시하도록 설정할 수 있습니다.

## # 3️⃣ 초보자를 위한 SDSL 기본 문법

### # 3.1 파일 선언 및 어노테이션

```
sdsl

// MyShader.sdsl

@sdl version = '1.0'

@resource Texture2D DiffuseMap : register(t0);

```

- `@sdl` 은 메타데이터를 선언합니다.

- `@resource` 로 텍스처, 버퍼 등 GPU 리소스를 **자동 바인딩**합니다.

### # 3.2 HLSL 코드와 섞어 쓰기

```
sdsl

float4 main(float4 position : POSITION) : SV_POSITION

{
    // HLSL 그대로 사용

    return mul(position, WorldViewProjection);

}

```

### # 3.3 플랫폼별 조건부 컴파일

```
sdsl

# sdl mobile {

    // 모바일 전용 코드

    #define MAX_LIGHTS 2

}
# sdl desktop {

    // 데스크톱 전용 코드

    #define MAX_LIGHTS 8

}

```

위와 같이 `#sdl` 블록을 사용하면 **빌드 타깃에 따라** 자동으로 코드가 포함·제외됩니다. 초보자도 `#ifdef` 대신 직관적인 디렉티브만 기억하면 됩니다.

### # 3.4 매크로와 템플릿 활용

```
sdsl

@sdl macro LIGHT_COUNT(count) {

    static const int LightCount = count;

}
LIGHT_COUNT(4);

```

매크로를 통해 **반복되는 상수**를 한 줄로 정의하고, 필요에 따라 값만 바꾸면 됩니다.

## # 4️⃣ 실제 프로젝트에 SDSL 적용하기 – 단계별 가이드

1. **Stride 프로젝트 생성** → `Graphics` 폴더에 `.sdsl` 파일 추가

2. **SDSL 컴파일러 설정** → `Project Settings > Shaders > Use SDSL` 활성화

3. **Material 만들기** → `Material Editor`에서 새 쉐이더 선택 → 자동으로 `DiffuseMap` 등 리소스 바인딩 확인

4. **플랫폼 별 빌드** → `Build > Build All` → 모바일/데스크톱 타깃을 각각 선택해 빌드하면, `#sdl` 블록에 따라 최적화된 바이너리가 생성

이 과정을 따라 하면 **코드 중복 없이** 여러 플랫폼을 동시에 지원하는 쉐이더를 손쉽게 만들 수 있습니다.

---

# # 결론 – 지금 바로 SDSL을 체험해 보세요!

SDSL은 **HLSL의 친숙함**과 **Stride 엔진 전용 최적화**를 하나의 파일에 담아, 멀티플랫폼 개발을 크게 단순화합니다.

- 기존 HLSL 코드를 그대로 재사용 → 학습 비용 최소화

- `@resource`, `#sdl` 디렉티브로 **자동 바인딩·조건부 컴파일** 구현

- Stride 빌드 파이프라인에 완전 통합 → 별도 툴 없이 바로 배포

아직 SDSL을 사용해 보지 않으셨다면, 오늘 프로젝트에 하나의 간단한 쉐이더만이라도 적용해 보세요. “코드 한 줄만 바꿔도” 모바일과 데스크톱에서 **동일한 시각적 퀄리티**를 유지할 수 있다는 것을 직접 체감하실 수 있을 겁니다.

> **행동 유도**: Stride 공식 GitHub(https://github.com/stride3d/stride)에서 최신 SDSL 컴파일러를 다운로드하고, 샘플 프로젝트를 실행해 보세요. 여러분의 첫 번째 SDSL 쉐이더가 곧 게임 화면에 살아 움직이는 모습을 확인할 수 있습니다!
