TL;DR
- 가상현실(VR)에서 머리를 조금만 움직여도 보이는 반짝임 현상은 신호의 샘플링 부족으로 생기는 에일리어싱이며, 올바른 렌더링 설정으로 줄일 수 있음.
- 모든 텍스처에 밉맵(mip map)을 생성하고
GL_LINEAR_MIPMAP_LINEAR필터링을 적용하는 것이 기본임. - 렌더링에 MSAA(멀티샘플 안티앨리어싱)를 사용하고, 필요에 따라 알파 블렌딩과 알파 커버리지로 가장자리 품질을 보완함.
- 에일리어싱을 일으키기 쉬운 얇은 지오메트리, 부정확한 동적 그림자, 범프 맵의 반사 하이라이트, 셰이더 내 고주파 계산을 피해야 함.
- 감마 보정 렌더링, 공유 버텍스, 텍스처 사전 필터링 또는 LOD 바이어스도 에일리어싱을 줄이는 방법임.
VR에서 에일리어싱이 보이는 방식
- 에일리어싱은 신호가 충분히 샘플링되지 않을 때 생기는 현상이며, 그래픽과 오디오에서 여러 형태로 나타남.
- VR에서는 머리를 조금만 움직여도 이미지가 반짝이는 현상으로 가장 뚜렷하게 드러남. 이 현상은 필연적이지 않으며, 적절히 처리하면 주변을 둘러볼 때 세계가 안정적으로 보임.
Oculus 360 Photos앱의 사진은 적절히 필터링되어 있으며, 모든 이미지가 이처럼 안정적으로 보여야 함.- 각 항목의 전후 모습을 보여주는 반복 애니메이션과
Unity에서 필요한 체크박스를 안내하는 문서가 이상적이지만, 아직 그런 문서는 없음.
밉맵과 MSAA
- 가장 중요한 원칙은 사용 중인 모든 텍스처에 밉맵을 생성하고
GL_LINEAR_MIPMAP_LINEAR필터링을 설정하는 것임. 간단한 조치지만 많은 타이틀에서 빠져 있어 우려됨. - 텍스처를 동적으로 생성하는 경우에는 누락을 이해할 여지가 조금 더 있지만, 필요하다면 매 프레임
glGenerateMipmap()을 호출해도 무리한 일은 아님. - 렌더링에는 MSAA를 사용해야 함. MSAA가 없는 앱은 제출 단계에서 즉시 탈락시켜야 할 정도지만, 여전히 가장자리가 심하게 울퉁불퉁한 앱이 있음.
- 현재
Mali에서는 4배 MSAA,Adreno에서는 4배 적용에 따르는 성능 비용이 다소 있어 2배 MSAA를 기본값으로 사용함. 모든 기기에서 4배를 적용할 가능성도 있으며,Qualcomm S7에서는 눈 버퍼 해상도를 높이기 전에 가장 먼저 품질 조정 대상으로 고려해야 함. - MSAA를 사용하면 일반적으로 지연 렌더링 엔진을 사용할 수 없음. 성능 측면에서도 지연 렌더링은 바람직하지 않으며, PC에서는 풍부한 자원으로 감당할 수 있어도 모바일에서는 어려움.
알파 블렌딩과 가장자리 처리
- 4배 MSAA를 적용해도 블렌딩 품질이 2비트에 그쳐 가장자리가 약간 흔들릴 수 있음. 캐릭터와 환경은 감수할 수 있지만, 부동 UI 패널처럼 단순한 요소에는 알파 블렌딩을 적용해 8비트의 블렌딩 품질을 얻을 수 있으며, 이는 사실상 완벽한 수준임.
- 블렌딩에는 정렬이 필요함. 이미지 가장자리에 알파값 0인 테두리를 두는 일은 생각보다 까다로우며, 밉맵 단계가 하나씩 내려갈 때마다 테두리 폭이 절반으로 줄어듦. 이미지가 얼마나 축소되는지에 따라 투명 테두리를 8픽셀 이상 둘 수 있음.
- 그래픽 주변에 예상치 못한 테두리 색이 생기지 않도록 알파 채널이 0인 가장자리에서도 색상값을 일관되게 유지해야 함. 윤곽선에서 텍스처 색상을 곧바로
0 0 0 0으로 설정하면 블렌딩된 그래픽 주위에 어두운 테두리가 생기는 경우가 흔함. 색상을 유지하고 알파 채널에서만 잘라내야 함. - 알파 테두리는 UI 타일에
CLAMP_TO_EDGE를 제대로 설정하지 않아 생기는 흔한 문제도 해결함. 가장자리에서 투명해지면 반대편에서 텍셀의 절반이 감싸 들어오더라도 보이지 않음. - 픽셀이 프레임 버퍼에 기여하는 양이 0이 된 뒤에 폐기되는 것이 확실하지 않다면 알파 테스트나 프래그먼트 셰이더의
discard를 사용하지 않아야 함. 표준 컷아웃 용도에서는 블렌딩이 최선이며, 정렬이 현실적으로 어렵다면ALPHA_FROM_COVERAGE를 중간 대안으로 사용할 수 있음.
지오메트리와 셰이더
- 에일리어싱을 일으킬 수 있는 지오메트리를 피해야 함. 전선처럼 가늘고 긴 요소를 얇은 튜브나 교차 리본으로 세밀하게 모델링해도 멀어지면서 MSAA가 제공하는 1~2비트 블렌딩만 남은 픽셀의 산만한 에일리어싱으로 바뀔 수 있음.
- 이런 요소를 블렌딩으로 처리하는 기법도 있지만, 설계 단계에서 피하는 것이 가장 쉬움. 매우 얇은 요소는 신중히 검토해야 함.
GearVR에서 정확한 동적 그림자를 구현하려 하지 않아야 함. 동적 그림자는 AAA급 PC 게임에서도 에일리어싱 없이 높은 품질을 내기 어려우며,GearVR의 합리적인 성능을 위해 해상도를 16분의 1로 줄이고 단일 샘플을 사용하면 결과가 희망적이지 않음. 정말 자신 있는 경우가 아니라면Quake 3방식으로 돌아가 움직이는 물체 아래에 흐릿한 그림자를 블렌딩하는 편이 나음.- 범프 맵에 반사 하이라이트를 사용하지 않아야 함. 충분한 자원이 있어도 제대로 구현하기 어려움. 기하 구조 수준에서 계산하는 반사는 대체로 괜찮고, 강력한 입체 시각 단서이기도 함. 이 계산은 버텍스 단계가 아니라 프래그먼트 셰이더에서 수행해야 함.
- 텍스처 샘플링 외에 셰이더에서 수행하는 모든 그래픽 계산에도 같은 원칙이 적용됨. 픽셀 속도보다 높은 주파수 성분이 있으면 에일리어싱이 생기며, 클램프는 무한 주파수에 해당함. 셰이더에서 복잡한 처리를 하기 전에 신중히 검토해야 함.
감마 보정과 버텍스 공유
- 감마 보정 렌더링은 게임 개발에서 흔히 물리 기반 렌더링의 일부로 다뤄지며, 정확한 조명 계산에 중요함. 조명이 전혀 없어도 텍스처 샘플링과 MSAA에 영향을 준다는 점은 널리 인식되지 않음.
- 사진과 다른 연속 톤 이미지에서는 영향이 거의 없지만, 대비가 높은 선화에서는 여전히 중요하며 특히 텍스트가 가장 민감함.
- 적용하려면 윈도우, 모든 텍스처, 사용하는 프레임 버퍼 객체를 올바른 sRGB 형식으로 변환해야 함.
4444처럼 대응하는 sRGB 형식이 없는 포맷은 32비트 포맷으로 바꿔야 할 수도 있음. - 공유되지 않는 버텍스를 피해야 함. 두 표면 사이에서 급격히 바뀌는 모델의 모서리는 모델 실루엣과 같은 에일리어싱 특성을 가지며, MSAA의 블렌딩 비트만 얻을 수 있음.
- 텍스처가 모델 전체를 감싸고 버텍스 노멀과 다른 속성을 모두 공유하면, 텍스처 좌표를 일치시킬 수 없는 ‘펠팅 선’에서만 가장자리 효과가 나타남.
- 공유 버텍스를 사용하는 데는 지오메트리 비용이 들므로 항상 적절한 것은 아니지만, 칼날처럼 날카로운 90도 모서리보다 모든 모서리를 가로지르는 작은 베벨이 있는 큐브가 더 나은 결과를 냄.
- 표면에 베이크된 조명을 사용한다면 지오메트리에 노멀이 필요하지 않으며, 텍스처 좌표를 공유하는 한 날카로운 각도에서도 텍스처를 이어 붙여도 괜찮음.
텍스처 필터링과 품질 최적화
- 삼선형 필터링(trilinear filtering)은 이상적인 선택이 아님. 에일리어싱이 지나친 샘플과 지나치게 흐릿한 샘플을 섞어 각각의 단점을 줄이는 방식임.
Doom 3의 바닥 격자나Tuscany의 흰색 셔터처럼 대비가 높은 텍스처는 삼선형 필터링을 적용해도 눈에 띄게 에일리어싱될 수 있음.- 이미지 대비를 사전 필터링으로 낮추거나 프로그램에서 LOD 바이어스를 추가하면 문제를 해결할 수 있음.
- 에일리어싱을 제어한 뒤에 품질 최적화를 검토할 수 있음.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요