전체 글 78

[Shader] URP 포트폴리오에 반드시 들어가야 할 심화 무기 Top 3

1. Lightmapping (라이트 베이킹): 모바일/최적화의 신실시간 조명(Realtime Light)은 그림자를 계산하느라 GPU를 엄청나게 갉아먹습니다.개념: 움직이지 않는 배경(건물, 땅)에 맺히는 빛과 그림자를 유니티가 미리 계산해서 '한 장의 텍스처(Lightmap)'로 구워버리는 기술입니다.실무: 조명이 100개가 있어도, 구워버리면 연산 비용은 '텍스처 1장 읽기'로 압축됩니다. 고정된 맵이나, 거대한 배경은 100% 라이트매핑의 산물입니다.2. URP Decal Projector (데칼): 텍스처 한 장으로 디테일 뻥튀기하기벽에 총알 자국, 바닥에 핏자국, 도로의 맨홀 뚜껑을 표현할 때마다 3D 모델링을 새로 할 수는 없죠.개념: 빔 프로젝터처럼 특정 표면에 이미지를 '투사'해서 도장처..

Devs 2026.04.29

[Shader] 유니티 URP Volume 시스템 완벽 해부

화면의 공기를 바꾸는 포스트 프로세싱 유니티 URP에서 씬의 전반적인 그래픽 분위기(Mood)를 결정하는 1등 공신은 바로 Volume 시스템이다. 화면 전체에 필터를 씌우는 이 시스템은 잘 쓰면 마법이지만, 각 옵션의 의미를 모른 채 숫자만 올리면 화면이 금방 지저분해진다.기본 템플릿에 세팅되어 있는 핵심 Volume 기능들의 진짜 의미와 실무 최적화 포인트를 해부해 보자.⚙️ 1. Volume 컴포넌트 기초 (껍데기 설정)인스펙터 최상단을 보면 Volume 자체가 어떻게 작동할지 결정하는 기초 설정이 있다.Mode (Global / Local):Global: 씬 전체에 무조건 적용된다. (현재 세팅)Local: 콜라이더(Collider) 영역 안에 들어갔을 때만 적용된다. (예: 독늪에 빠졌을 때 화..

Devs 2026.04.29

[Shader] URP 셰이더 예약어(Macro)

1. 🔍 #ifdef SHADERGRAPH_PREVIEW (에디터 미리보기용 더미 데이터)존재 이유: 셰이더 그래프 창 우측 하단을 보면 항상 둥근 구(Sphere)가 빙글빙글 돌고 있는 '미리보기(Preview)' 창이 있죠?문제점: 이 미리보기 창 안에는 실제 게임 씬(Scene)에 있는 태양빛(Directional Light)이 존재하지 않습니다. 빛이 없는데 GetMainLight()(빛 정보 가져오기) 함수를 호출하면 셰이더가 즉시 에러를 뿜고 뻗어버립니다.해결: "만약 지금 셰이더를 컴파일하는 곳이 '미리보기 창'이라면, 에러 나지 않게 (0.5, 0.5, 0) 방향에서 오는 하얀색 가짜 빛(더미 데이터)을 쏘아줘라!"라고 예외 처리를 해주는 것입니다.2. 🛡️ #if defined(UNI..

Devs 2026.04.29

[Shader] 역법선(Inverted Hull) 외곽선 만들기

이제 이 툰 셰이딩 위에 화룡점정이 될 '검은색 외곽선(Outline)'을 씌워볼 차례입니다.유니티 URP의 셰이더 그래프는 기본적으로 '하나의 패스(Pass, 한 번 그리기)'만 지원하기 때문에, 가장 고전적이면서도 확실한 실무 꼼수인 "머티리얼 2개 겹쳐 입히기" 방식을 사용해서 역법선 외곽선을 구현해 보겠습니다.원리는 아주 간단합니다.구(Sphere)를 원래 크기보다 아주 살짝 뚱뚱하게 부풀려서 한 번 더 그립니다.부풀린 구를 검은색으로 칠합니다.가장 중요한 점: 부풀린 구의 '뒷면(안쪽 면)'만 화면에 그리도록(Cull Front) 설정합니다. 이렇게 하면 뚱뚱한 검은 구의 '껍데기 테두리'만 얇게 보이게 되어 완벽한 외곽선이 됩니다.바로 실습으로 들어가 보죠!1단계: 외곽선 전용 셰이더 그래프 ..

Devs 2026.04.29

[Shader] NPR(Non-Photorealistic Rendering) - Toon Shading & Outline

🎨 카툰 렌더링(Toon Shading)의 원리PBR이 "빛이 물리적으로 어떻게 튕기는가"를 고민했다면, 카툰 렌더링은 "어떻게 하면 빛의 경계를 인위적으로 끊어서 애니메이션처럼 보일까?"를 고민합니다.1. 핵심 원리: 조명값의 양자화(Quantization)우리가 이전에 배운 램버트(Lambert) 공식은 dot(Normal, LightDir)이었습니다. 이 결과값은 0에서 1까지 아주 부드러운 그라데이션을 가집니다.PBR/Lambert: 부드러운 회색조 그라데이션.Toon Shading: 이 부드러운 값을 강제로 깎아내서 '밝은 곳'과 '어두운 곳' 딱 두 개(혹은 세 개)의 단계로 나누어 버립니다.2. Shader Graph에서의 구현 (Step 노드의 마법)Shader Graph에서 가장 핵심이..

Devs 2026.04.28

[Shader] 포스트 프로세싱 실전: 내가 원할 때만 켜고 끄는 법 (제어와 최적화)

Universal Renderer Data에 그냥 띡 하고 올려두면 게임이 시작될 때부터 끝날 때까지 전역적으로(Globally) 계속 실행됩니다. 만약 피격당할 때만 화면이 빨개져야 하거나, 보스방에 들어갈 때만 흑백으로 변해야 한다면 지금 방식으로는 곤란하죠.게다가 앞으로 만들 모든 효과(독 중독, 스나이퍼 줌, 빙결 효과 등)를 저기에 다 때려 넣으면, 스마트폰(GPU)은 아무 효과가 없는 평상시에도 수십 번의 빈 화면 복사(Blit)를 수행하다가 열이 나서 터져버릴 겁니다.이 실무적인 고민을 단번에 해결해 줄 "제어와 최적화의 원리"를 블로그 포스팅의 후속편으로 이어서 작성해 보았습니다.우리는 Universal Renderer Data에 렌더러 피처(Renderer Feature)를 추가하여 화면..

Devs 2026.04.28

[Shader] 유니티 URP 완벽 이해: Shader Graph와 Renderer Data는 어떻게 화면을 그릴까?

유니티 URP(Universal Render Pipeline) 프로젝트를 처음 열어보고 튜토리얼을 따라 하다 보면, 화면에 멋진 효과(비네팅, 흑백, 외곽선 등)가 나타나긴 하는데 찜찜할 때가 있습니다. "그냥 노드를 연결하고, Settings 폴더에 있는 파일에 추가했더니 되네? 근데 이게 실제 게임에서 어떻게 작동하는 거지?"오늘은 그래픽스 초보자도 단번에 이해할 수 있도록, 이 두 가지 핵심 시스템이 실제 게임 개발에서 어떤 역할을 하는지 비유를 통해 아주 쉽게 파헤쳐 보겠습니다.🎨 1. Universal Renderer Data: 렌더링 파이프라인의 '총감독'프로젝트의 Settings 폴더를 보면 Mobile_Renderer, PC_Renderer 같은 이름의 Universal Renderer ..

Devs 2026.04.28

[Shader] 12-2. 비네팅(Vignette) 효과

🚀 실전 워크플로우: Full Screen Shader Graph로 비네팅 만들기유니티 6에서는 포스트 프로세싱 전용 셰이더 그래프 에셋을 지원합니다. 불필요한 3D 연산(정점, 라이팅 등)이 싹 빠진, 오직 '화면 픽셀 제어'에 특화된 캔버스입니다.1단계: 셰이더 그래프 에셋 생성프로젝트 창 우클릭 -> Create > Shader Graph > URP > Full Screen Shader Graph를 선택합니다.이름을 Vignette_Graph로 짓고 엽니다.열어보면 아주 심플하게 Fragment(색상 출력) 블록 딱 하나만 존재합니다. 화면 전체를 덮는 Quad 연산은 엔진이 이미 백그라운드에서 처리했기 때문입니다.2단계: 화면 낚아채기 (The Blit Source)HLSL 코드로 짤 때는 TE..

Devs 2026.04.28

[Shader] 유니티 6 시대의 셰이더 파이프라인: C# 보일러플레이트를 버리고 본질에 집중하기

📌 들어가며: 포스트 프로세싱, 꼭 C#으로 직접 짜야 할까?최근 URP(Universal Render Pipeline) 환경에서 PBR 셰이더의 구조와 커스텀 포스트 프로세싱을 바닥부터 다시 뜯어보았다. 비네팅(Vignette)이나 색상 반전 같은 후처리 효과를 넣으려면 과거에는 어김없이 ScriptableRendererFeature와 ScriptableRenderPass를 상속받아 C# 코드를 작성해야 했다.하지만 유니티 6(Unity 6)의 Render Graph 시대로 넘어오면서 깊은 의문이 들었다. "이 복잡한 C# 파이프라인 제어 코드를 굳이 직접 짜는 게 의미가 있을까?"결론부터 말하자면, 특수한 엔진 커스터마이징 상황이 아니라면 직접 짜는 것은 비효율적이며, 엔진이 제공하는 최신 워크플로..

Devs 2026.04.28

[Shader] 12-1. Post-Processing

이제 셰이더 프로그래밍의 마지막 큰 산인 "화면 전체를 요리하는 기술", Post-Processing에 진입합니다. 지금까지 우리가 짠 셰이더들은 "오브젝트 한 개"를 그리는 셰이더였습니다. 하지만 포스트 프로세싱은 "이미 완성된 한 장의 그림(FrameBuffer)"을 입력으로 받아, 거기에 효과를 입히고 다시 화면에 뿌리는 '이미지 처리(Image Processing)' 과정입니다.🖥️ Post-Processing의 핵심 파이프라인포스트 프로세싱은 물리적으로 "렌더링이 다 끝난 텍스처를 가져와서, 화면 전체를 덮는 사각형(Fullscreen Quad)에 입히는 작업"입니다. 이를 실무에서는 Blit(Bit Block Transfer)이라고 부릅니다.1. 포스트 프로세싱의 3단계 흐름모든 후처리는 이..

Devs 2026.04.28