Blog iconJaeho Yi
30 Shaders in 30 Days

개요

notion image
💡
기간: 2026. 02. ~ 2026. 05.
사용 기술: Godot 4, GDShader, C#, Rust
30 Shaders in 30 Days 프로젝트는 Godot 엔진의 셰이딩 언어인 GDShader를 사용해 하루 하나의 주제의 셰이더를 구현하고 문서화한 개인 학습 프로젝트입니다. UV 개념, SDF, 애니메이션, 절차적 노이즈, 라이팅, 후처리 효과 등을 주제로 난이도를 높여가며 셰이더 기법을 학습하는 것을 목표로 했습니다.
기존에 제작한 GDShader 플러그인을 테스트하는 동시에 그래픽스, 셰이더 작업의 기초를 배우기 위해서 프로젝트를 시작했습니다. 이론을 읽기만 하는 것이 아니라 직접 구현하며 학습하고자 했습니다.

진행 방식

각 주제는 셰이더 코드로 구현되어 Godot 에디터 내에서 눈으로 확인할 수 있습니다. C# 스크립트로 에디터에 많은 파라미터를 노출하여 쉽게 확인하며 조절할 수 있도록 했습니다.
30가지 주제를 5개의 챕터로 나누어 진행했습니다. 각 챕터의 마지막에는 테마에 맞는 주제로 좀 더 실전적인 셰이더 효과를 구현했습니다.
챕터
테마
주요 키워드
1
Foundation
UV 좌표, mix()smoothstep(), SDF, 애니메이션
2
2D Effects
텍스처 샘플링, UV 변환, 색상 변환
3
Procedural
노이즈 함수, FBM, 레이어링
4
3D & Lighting
노말, Fresnel, tangent space, vertex deformation
5
Post-Processing
화면 공간 좌표, full-screen 효과

구현 예시

Day 07 - Animated Loading Spinner

notion image
notion image
notion image
챕터 1에서 배운 SDF, 회전, 안티앨리어싱, 애니메이션 효과 등을 활용한 프로젝트입니다.

Day 14 - 2D Character Effects Combo

notion image
notion image
notion image
챕터 2에서는 텍스처를 기반으로 하는 여러 기법을 배웠습니다. 플래시, 외곽선, dissolve, pixelation, color swap 등의 기법이 활용됐습니다.

Day 21 - Procedural Space Background

notion image
생성형 노이즈, FBM과 같은 기법을 기반으로 성운과 별이 보이는 우주의 모습을 구현했습니다.

반복 작업을 줄이기 위한 도구 제작

Uniform Wrapper Generator

셰이더의 유니폼 파라미터를 Godot 에디터에서 쉽게 조절할 수 있도록 C# 스크립트 래퍼를 작성하는 작업이 반복됐습니다. C# 스크립트에는 각 파라미터의 backing field를 만들고 setter를 구현하는 코드를 작성해야 했습니다.
따라서 Rust를 사용해 이 과정을 자동화하는 CLI 도구를 만들었습니다. 이 도구는 GDShader 파일을 입력으로 받아 유니폼 선언을 파싱해 대응되는 C# 프로퍼티 코드를 생성합니다. GDShader 타입과 C# 타입간의 변환도 문맥에 따라 적절하게 이루어지도록 구현하였습니다.
이 도구 덕분에 셰이더 코드를 작성한 뒤 C# 래퍼를 작성하는 시간을 거의 없는 수준으로 줄일 수 있었습니다. 결과적으로 셰이더 구현과 문서화에 더 많은 시간을 사용할 수 있었습니다.

Screenshot Capture Tool

예제를 문서화할 때 출력 결과를 이미지나 GIF로 첨부해야 했습니다. 하지만 매번 화면을 수동으로 캡처하면 해상도와 위치가 달라질 수 있고, 애니메이션이 있는 경우 GIF로 변환하는 작업이 필요했습니다.
이를 해결하기 위해서 Godot 에디터 안에서 사용할 수 있는 캡처 툴을 제작했습니다. 이 도구는 지정한 해상도의 viewport 내용을 PNG로 저장하거나, 일정 시간 동안 연속 촬영해 GIF로 변환할 수 있도록 만들었습니다.

결과

셰이더의 이론뿐만 아니라 파라미터를 조정할 수 있는 인터페이스를 설계하는 경험, 예제를 문서화하는 제작 흐름을 경험할 수 있었습니다. 도구를 제작해 반복 작업을 자동화한 덕분에 프로젝트의 핵심 주제인 셰이더 구현과 학습에 더욱 집중할 수 있었습니다.