TECHARTNOMAD | MAZELINE.TECH

TECH.ART.FLOW.IO

[번역] 넷이즈 레이훠(LGDC) 시리즈|모바일 파이프라인 상수 소개 및 구현 공유

jplee 2026. 5. 24. 01:17

저자: 网易游戏 레이훠(雷火) 사업부

도입: 모바일 파이프라인 상수(Pipeline Constants)는 Vulkan/Metal 그래픽스 API에서 제공되는 기능으로, GraphicsPipeline을 생성할 때 특정 상수 값을 지정할 수 있게 해 줍니다. 이를 통해 렌더링 명령의 파라미터를 최적화하는 데 도움이 됩니다.

본 글의 작성자는 网易 레이훠의 ‘希洛’이며, 2022년 졸업 후 레이훠에 합류해 엔진 렌더링과 Shader 관련 기능 구현/최적화를 주로 담당하고 있습니다.


소개

Vulkan과 Metal에서 파이프라인 상수를 사용하는 방식은 비교적 단순합니다. Shader 레벨에서 관련 상수를 선언하고, 엔진 레벨에서 해당 데이터를 채워 넣으면 됩니다. 아래는 GLSL(Vulkan)과 MSL(Metal)에서 파이프라인 상수를 선언하고 값을 주입하는 예시 코드입니다. 자세한 내용은 아래 링크를 참고하세요: Vulkan, Metal. Shader 내부에서 c0, c1의 사용 방식은 다른 shader 변수와 동일합니다.

구현

지면 관계상, 그리고 필자가 사용한 엔진(Unity)이 오픈소스가 아니기 때문에 엔진 코드는 공개하지 않습니다. 대신 상용 엔진에 통합할 때 중요해지는 몇 가지 핵심 포인트를 정리합니다.

컴파일

현재 주류 Shader 워크플로우는 개발 측에서 HLSL을 많이 사용합니다. Vulkan을 예로 들면, HLSL을 DXCode로 컴파일한 뒤 GLSL로 역변환하고, 다시 SPIRV로 컴파일합니다. 이후 압축 저장하고, 직렬화된 리플렉션 정보를 함께 저장합니다. (Metal의 흐름도 기본적으로 유사하므로 생략합니다.)

현행 HLSL 컴파일러는 실제로 [vk::constant_id(0)] 같은 선언을 인식할 수 있습니다. 다만 크로스 플랫폼 호환성과 Metal의 작성 방식과의 일관성을 위해 컴파일러를 확장해, 해당 문법을 추가로 지원하도록 했습니다.

파이프라인 상수 문법으로 변수를 선언했을 때의 처리:

  1. 플랫폼이 파이프라인 상수를 지원하면: 파이프라인 상수 파싱 및 대응 IR을 생성하고, 파이프라인 상수의 리플렉션 정보를 직렬화한다.
  2. 플랫폼이 지원하지 않으면: Fallback으로 일반 변수처럼 컴파일한다.

런타임

핵심은 “파이프라인 상수의 크로스플랫폼 데이터 업데이트 체계”를 마련하는 것입니다.

파이프라인 상수 데이터 초기화

GpuProgram을 생성할 때 직렬화된 리플렉션 정보가 있다면, 그에 대응하는 데이터를 생성합니다.

변수 문자열 대신 ID 사용

  • 전역 파이프라인 상수 ID = IDGenerator(변수 문자열)
  • 로컬 파이프라인 상수 ID = IDGenerator(Shader 문자열, 변수 문자열)

PSO 캐시(PSOCache) 매칭

파이프라인 상수가 바뀌면 GraphicsPipeline을 재생성해야 하므로, 캐시 Key에는 “파이프라인 상수 값 정보”가 포함되어야 합니다. 하지만 값의 개수는 가변적일 수 있고, PSOCache의 Key는 고정 길이여야 하므로 값을 그대로 Key로 쓸 수는 없습니다.

따라서 파이프라인 상수를 두 가지 유형으로 나누고, Hash 조합으로 Key를 만듭니다.

  1. 로직 용도 파이프라인 상수: 값이 0/1만 사용되는 경우가 많으므로, 비트 단위로 저장합니다. 최대 개수를 제한하고 이를 Hash로 사용합니다.
  2. 값 용도 파이프라인 상수: 매핑 인덱스를 기록하고, 해당 인덱스를 Hash 구성 요소로 사용합니다.

PSOCache 매칭에 성공하면 그대로 반환하고, 실패하면 그래픽 API로 새 GraphicsPipeline을 생성해 PSOCache에 추가합니다.

Pipeline Warmup

요즘 대부분의 게임은 첫 진입 시 “셰이더 컴파일 중” 진행 바(프로그레스)를 보여줍니다. 이를 구현하려면 GraphicsPipeline 생성에 필요한 정보를 수집해야 하고, 파이프라인 상수 정보도 포함되어야 하므로 Pipeline Warmup 수집 플로우를 이에 맞게 확장해야 합니다.

엔진 기능 적응

예: SRP Batcher, Keyword Match 등.

예시

기본 사용

로직 명령 테스트

XCode 프레임 캡처(좌/중/우: 파이프라인 상수, Keyword, Uniform 변수)

Snapdragon Profiler 프레임 캡처(좌/중/우: 파이프라인 상수, Keyword, Uniform 변수)

루프 명령 테스트

파이프라인 상수(빨강) 루프와 Uniform 변수(초록) 루프의 명령 차이

이상으로 공유를 마칩니다. 본 내용이 여러분께 도움이 되었기를 바랍니다.


넷이즈 레이훠 사업부의 또 다른 글

[번역] 넷이즈 레이훠 LGDC 시리즈 《영겁무간 모바일》RenderGraph 개조 공유

 

[번역] 넷이즈 레이훠 LGDC 시리즈 《영겁무간 모바일》RenderGraph 개조 공유

역자의 말: 중국 넷이즈 항저우 스튜디오에서 첫 중국 직장생활을 할 때 근무했던 곳이라 할 수 있다. 레이훠와 형제 스튜디오인 반구 스튜디오가 레이훠 스튜디오로 통합되었다. 자체 엔진 개

techartnomad.tistory.com