조명과 환경 대기(Atmosphere)는 로블록스 경험에서 플레이어의 시각적 몰입도, 시각적 계층 구조, 감정적 분위기를 좌우하는 핵심 요소입니다. 최신 Future 라이팅 기술의 보편화로 개발자는 물리적으로 정확한 포인트/서피스 라이트 그림자, 고역광 HDR 블룸, 볼류메트릭 클라우드를 구현할 수 있게 되었습니다. 그러나 제약 없이 배치된 동적 라이트와 섀도우 맵은 중저사양 모바일 기기에서 프레임 드랍과 발열을 초래합니다.
본 테크니컬 아트 및 렌더링 최적화 가이드에서는 로블록스 라이팅 파이프라인의 내부 구조를 분석합니다. 동적 시간대(Time-of-Day) 전환, 데스크톱 Future 라이팅과 모바일 ShadowMap/Voxel 간 적응형 퀄리티 스케일링, 세밀한 ColorCorrection 및 피사계 심도(DepthOfField) 조절 Luau 시스템을 제공합니다.
1. 로블록스 라이팅 파이프라인: Compatibility vs Voxel vs ShadowMap vs Future
로블록스 스튜디오는 Lighting 서비스 하에 4가지 렌더링 기술을 제공합니다. 각 기술의 광원 계산 및 섀도우 프러스텀 처리 방식을 이해하는 것이 크로스 플랫폼 최적화의 첫걸음입니다:
- Compatibility & Voxel: 픽셀 단위 동적 그림자 없이 복셀 격자로 근사 계산하는 초경량 기술로 캐주얼 게임에 적합합니다.
- ShadowMap: 태양광 및 지향성 빛의 그림자 캐스케이드를 고해상도로 렌더링하지만 로컬 광원 그림자는 지원하지 않습니다.
- Future (Phase 3): PointLight, SpotLight, SurfaceLight 등 모든 로컬 광원에서 실시간 동적 그림자와 반그림자(Penumbra) 및 스펙큘러를 계산합니다.
- 동적 섀도우 맵 예산: Future 라이팅은 동적 광원마다 섀도우 아틀라스 메모리를 할당하므로 시야각 내 그림자 광원이 10~15개를 초과하면 GPU 병목이 발생합니다.
2. 적응형 라이팅 퀄리티 스케일러 구현 코드
아래는 플레이어의 하드웨어 프레임레이트를 실시간 모니터링하여 원거리 로컬 광원의 그림자를 자동 컬링하고 포스트 프로세싱을 조절하는 클라이언트 Luau 모듈입니다:
- 하드웨어 인식 자동 튜닝: RunService.RenderStepped 델타 스무딩을 통해 프레임 드랍 발생 여부를 감지합니다.
- 광원 그림자 컬링: 원거리 또는 중요도가 낮은 광원의 Shadows 속성을 동적으로 비활성화하여 GPU 필레이트를 보존합니다.
- 애트모스피어 및 포스트FX 보간: 구역 이동 시 Atmosphere 밀도, ColorCorrection 대비, Bloom 강도를 부드럽게 크로스페이드합니다.
--!strict
local Lighting = game:GetService("Lighting")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local AdaptiveLighting = {}
AdaptiveLighting.__index = AdaptiveLighting
local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled
local camera = workspace.CurrentCamera
local function ConfigureBaselineSettings()
Lighting.Technology = Enum.Technology.Future
Lighting.GlobalShadows = true
Lighting.GeographicLatitude = 41.5
local atmosphere = Lighting:FindFirstChildOfClass("Atmosphere")
if not atmosphere then
atmosphere = Instance.new("Atmosphere")
atmosphere.Density = 0.35
atmosphere.Offset = 0.25
atmosphere.Haze = 1.2
atmosphere.Color = Color3.fromRGB(199, 199, 215)
atmosphere.Decay = Color3.fromRGB(106, 112, 125)
atmosphere.Parent = Lighting
end
end
local trackedLights: { Light } = {}
function AdaptiveLighting.RegisterLight(light: Light)
table.insert(trackedLights, light)
end
local frameSamples = {}
local sampleIndex = 1
local maxSamples = 60
local function GetAverageFPS(): number
local sum = 0
for _, dt in ipairs(frameSamples) do sum += dt end
if #frameSamples == 0 then return 60 end
return #frameSamples / sum
end
local updateTimer = 0
RunService.RenderStepped:Connect(function(dt: number)
frameSamples[sampleIndex] = dt
sampleIndex = (sampleIndex % maxSamples) + 1
updateTimer += dt
if updateTimer < 0.5 then return end
updateTimer = 0
local avgFps = GetAverageFPS()
local camPos = camera.CFrame.Position
local shadowDistanceThreshold = (avgFps < 45 or isMobile) and 40 or 100
for _, light in ipairs(trackedLights) do
local parentPart = light.Parent
if parentPart and parentPart:IsA("BasePart") then
local dist = (parentPart.Position - camPos).Magnitude
if dist > shadowDistanceThreshold then
light.Shadows = false
else
light.Shadows = true
end
end
end
end)
ConfigureBaselineSettings()
return AdaptiveLighting
3. 애트모스피어, 볼류메트릭 클라우드 및 대기 산란
대기 효과는 단조로운 블록 환경을 한 편의 영화 같은 예술적 공간으로 바꿉니다. 로블록스의 Atmosphere와 Clouds 인스턴스는 레일리 산란과 고도별 구름을 모사합니다:
- 레일리 및 미 산란: Atmosphere.Haze와 Decay 속성을 통해 정오의 청명한 하늘과 일몰 골든아워의 붉은 노을을 정밀하게 연출합니다.
- 볼류메트릭 구름 연동: Clouds.Cover(구름양)와 Clouds.Density(밀도)를 동적으로 제어하여 실시간 기상 악화 및 폭풍 전조를 표현합니다.
- 원근 대기 안개: 거리 기반 포그(Fog)로 깊이감을 형성하고 원거리 지오메트리 스트리밍 경계선을 자연스럽게 차폐합니다.
- 선레이 및 블룸의 조화: SunRaysEffect(Intensity 0.15)와 Bloom(Intensity 0.25)을 적절히 결합하여 과하지 않은 자연스러운 렌즈 플레어를 연출합니다.
4. ColorCorrection 및 포스트FX 인체공학
포스트 프로세싱은 화면에 픽셀이 출력되기 직전의 최종 보정 파이프라인입니다. 과도한 포스트FX는 시각 피로를 부르고 전투 판정 시각성을 떨어뜨립니다:
- LUT 보정 모사: 약간의 대비(+0.08)와 채도(+0.1) 향상으로 암부 손실이나 하이라이트 클리핑 없이 선명한 색감을 구현합니다.
- 피사계 심도(DoF) 주의사항: 빠른 교전 상황에서는 전체 화면 DoF를 피하고 시네마틱 대화 연출 시에만 한정적으로 적용합니다.
- 하이라이트(Highlight) 인스턴스 제한: Highlight는 별도의 스텐실 버퍼 패스를 요구하므로 화면 내 20~30개를 초과하지 않도록 관리합니다.
- 접근성 색상 프로파일: 플레이어가 고대비 모드나 색약 보정 컬러 프로파일을 선택할 수 있는 클라이언트 옵션을 제공합니다.
5. 상용 배포 검증 및 최적화 체크리스트
데스크톱, 콘솔, 모바일 전반에서 고품질 라이팅을 안정적으로 유지하기 위한 필수 검증 단계입니다:
- 마이크로프로파일러 GPU 패스 확인: ScenePass와 ShadowMap 생성 시간을 점검하여 모바일에서 라이팅 패스가 3.5ms 미만을 유지하도록 합니다.
- 실내 빛 누출(Light Leaking) 점검: 지하 밀폐 공간이나 실내 방의 벽면 모서리에서 태양광이 새어나오지 않도록 양면 지오메트리를 설계합니다.
- 모바일 발열 및 배터리 테스트: iOS 및 안드로이드 기기에서 15분 이상 연속 플레이 시 쓰로틀링으로 인한 프레임 드랍이 없는지 검증합니다.
- PBR 텍스처 메모리 압축: 커스텀 표면 텍스처(Roughness, Metalness, Normal)를 1024x1024 이하로 압축하여 비디오 메모리 과점유를 방지합니다.
Frequently Asked Questions
ShadowMap과 Future 라이팅 기술의 가장 큰 차이점은 무엇인가요?
ShadowMap은 오직 태양/달의 지향성 빛에 대해서만 그림자를 만듭니다. 반면 Future 기술은 맵 곳곳에 배치된 전등, 횃불 등 모든 로컬 포인트/스팟 라이트에서 실시간 픽셀 그림자를 렌더링합니다.
모바일 기기에서 로컬 조명의 그림자가 보이지 않는 이유는 무엇인가요?
로블록스 모바일 클라이언트는 낮은 그래픽 품질 설정(1~3단계)에서 GPU 성능을 보호하기 위해 Future 기술을 ShadowMap이나 Voxel 모드로 자동 다운그레이드하기 때문입니다.
원활한 60 FPS를 유지하려면 몇 개의 동적 그림자 조명을 사용할 수 있나요?
화면 내에 동시에 보이는 그림자 지원 조명은 8~12개 이하로 제한하는 것이 좋습니다. 보조 간접광이나 잔잔한 조명은 Shadows 속성을 끄는 것이 권장됩니다.
Atmosphere와 Clouds가 프레임레이트에 큰 영향을 미치나요?
Atmosphere는 매우 가벼운 뎁스 패스로 프레임 영향이 거의 없습니다. 볼류메트릭 구름(Clouds)은 GPU 필레이트를 약간 소모하므로 Cover와 Density 값을 적절히 조절하는 것이 좋습니다.