21. Virtual and Augmented Reality
가상현실(VR)과 증강현실(AR)은 실제 세계처럼 감각을 자극하는 기술로, 증강현실은 인조물을 실제 세상과 통합하려 하고, 가상현실은 세상을 완전히 대체하려 합니다. 이 장에서는 이 두 가지 기술에 특화된 렌더링 기술에 초점을 맞추고 있으며, XR이라는 포괄적 용어를 사용하여 함께 기술할 수도 있습니다.
21.1. Equipment and Systems Overview
그래픽용 가상 및 증강현실 장비는 CPU와 GPU를 제외하고 센서 또는 디스플레이로 분류할 수 있습니다. 센서에는 무수히 다양한 입력 방법과 장치로 사용자의 회전 및 위치를 감지하는 추적기가 포함됩니다. 디스플레이의 경우는 논리적으로 화면을 두개로 나눌 수 있다면, 휴대폰을 사용할 수도 있고, 전용 시스템을 사용하여 가상 현실을 보여줄 수 있습니다. 증강 현실의 경우, 가상은 특별히 설계된 광학 장치를 사용하여 실제 세계의 장면과 결합됩니다.
휴대폰은 직접적으로도, 기어VR과 같은 헤드 마운트 디스플레이로도 사용이 가능하며, 이는 휴대폰 내의 중력, 자력 및 다른 여러 메커니즘을 통해 디스플레이의 방향을 정할 수 있습니다. 고정 뷰 파노라마 및 비디오와 같은 실제 세계를 담은 콘텐츠는 사용자의 방향에 대한 정확한 2차원 장면을 보여주는 비용이 상당히 낮기 때문에 휴대폰을 이용한 장치들과 잘 작동할 수 있습니다. 하지만 휴대폰을 이용한 경우는 하드웨어 사양 및 전력 요구량 측면에서 좋지 않습니다. 따라서, 이동성이 제한되지만 직접 컴퓨터에 연결하여 사용하는 오큘러스와 같은 장치도 존재합니다. 또한 핸드 컨트롤러는 표준 장비로 마우스나 키보드와 달리 추적 가능하고 사용자와 함께 이동할 수 있으며 다양한 기술을 기반으로 VR을 위해 다른 많은 유형의 입력 장치가 개발되었습니다.
증강현실은 사용자의 실제 세계관과 결합된 컴퓨터 생성 콘텐츠로 정의됩니다. 텍스트 데이터가 이미지에 중첩된 헤드업 디스플레이(HUD)를 제공하는 모든 애플리케이션은 증강 현실의 기본 형태입니다. 혼합 현실(MR)은 실제와 3차원 가상 콘텐츠가 실시간으로 혼합되고 상호 작용하는 증강 현실의 하위 집합입니다.
21.2. Physical Elements
이 섹션은 현대 VR 및 AR 시스템의 다양한 구성 요소와 특징, 특히 이미지 디스플레이와 관련된 요소에 대해 설명합니다.
21.2.1 Latency
대기 시간의 영향을 완화하는 것은 VR 및 AR 시스템에서 특히 중요합니다. 여기서 의미하는 것은 움직임에서 이에 대한 화면이 생성되기까지의 대기 시간을 의미합니다. 일반적인 경우의 지연은 거슬리는 정도이지만 XR의 경우는 짧으면 픽셀 고정이 일어나고, 길면 더 이상한 연출을 하게 될 것입니다. 행동과 화면 과의 지연이 20ms 쯤부터 지각이 가능하다고 합니다. 이를 방지하는 방법은 다양하게 존재합니다. 움직임을 제한하게 사물을 배치하여 시각적 변화를 최소화하거나 음악 재생을 통한 심리적 접근도 존재합니다.
트래킹 포즈는 보통 머리 위치를 가리키는 말로, 렌더링에 필요한 카메라 매트릭스를 형성하기 위해 사용됩니다. 프레임의 시작부터 포즈에 대한 대략적인 예측을 통해 요소들과의 충돌 감지와 같은 시뮬레이션을 수행할 수 있습니다. 렌더링이 시작되려고 할 때, 새로운 포즈 예측을 통해 장면을 업데이트할 수 있으며, 이미지가 표시되려고 할 때 보다 정확한 다른 포즈 예측을 통해 사용자의 위치에 더 잘 맞게 이미지를 만드는데에 사용할 수 있습니다. 각각의 이후의 예측은 이전의 부정확한 예측을 기반으로 한 계산을 완전히 메꿀수는 없지만 전체적으로 더 향상될 여지를 보이게 됩니다.
21.2.2 Optics
가상현실 디스플레이 시스템이 망막에 바로 이미지를 매핑하는 것은 상당히 비용이 많이 들기에, GPU가 생산한 이미지가 후공정을 통해 눈으로 들어오게 하기에 적당한 비용으로 사용가능합니다. VR 시스템의 렌즈는 이미지의 가장자리가 안쪽으로 휘어지는 것처럼 보이는 핀쿠션 왜곡이 있는 넓은 시야 이미지를 제공하는데 생성된 각 이미지를 뒤틀어 왜곡을 만들어 이를 상쇄합니다. 광학계도 보통 프리즘처럼 렌즈가 색을 분리시키는 색도의 차이를 겪는데 역으로 색도 차이를 만들어 내는 이미지를 생성하여 해결 가능합니다.
디스플레이에는 롤링과 글로벌, 두 가지 유형이 있습니다. 두 디스플레이 유형 모두 영상이 직렬 스트림으로 전송됩니다. 롤링 디스플레이에서 이미지를 한 줄씩 받자마자 출력을 하고, 글로벌 디스플레이는 전체 이미지를 받으면 한번에 표시합니다. 각각의 서로 다른 장점이 존재하는데, 롤링 디스플레이는 가능한 한 빨리 결과를 표시한다는 점에서 대기 시간을 최소화할 수 있지만 서로 다른 픽셀이 다른 시간에 조명되므로 망막과 디스플레이 사이의 상대적인 움직임에 따라 이미지가 흔들리는 것으로 인식될 수 있습니다. 이러한 불일치는 증강 현실 시스템에 특히 혼란을 줄 수 있습니다. 이는 헤드 포즈를 예측하여 보간할 수 있지만, 속도가 빨라지는 경우는 힘듭니다.
21.2.3 Stereopsis
두 이미지는 각각의 눈으로 보기에 상쇄되는데 이로 인해 깊이를 인식하는 입체시들을 자극합니다. 효과는 존재하지만 입체시는 거리가 멀면 약해지고, 깊이를 인식하는 유일한 방법은 아니다. 모니터를 볼 때는, 전혀 작동하지 않고, 객체 크기나 텍스처 패턴 변화 등의 시각적 정보를 통해 자각합니다. 눈이 물체에 집중하기 위해 얼마나 안쪽으로 향해야 하는가를 베전스 수요라고 하며, 이때 현실 세계에서 눈은 렌즈 모양을 바꾸고 일제히 안쪽으로 향하는데, 이것은 accomodation-convergence 반사라고 합니다. 디스플레이의 경우 accomodation적 수요는 동일하지만, 서로 다른 인식 깊이에 있는 물체에 눈이 집중됨에 따라 convergence적 수요가 변화하기에 불일치가 생겨 눈의 피로를 유발할 수 있으며, 사용자가 실제 세계의 먼 물체에 집중할 수 있지만 눈 근처의 고정된 깊이에 있는 관련 가상 게시판에 다시 초점을 맞춰야 하는 일부 AR 시스템에서 지각 효과를 가져올 수도 있다.
VR과 AR을 위한 스테레오 쌍을 생성하는 규칙은 단일 디스플레이 시스템의 규칙과는 다릅니다. VR에서 각각의 눈은 별도의 디스플레이를 가지고 있는데, 이는 망막에 투영된 이미지가 현실에 가깝게 위치하도록 해야하기 때문입니다. 눈에서 눈까지의 거리를 IPD라고 하는데, VR과 AR 시스템은 사용자의 IPD를 결정하고 조정할 수 있는 보정 방법이 있어 이미지 품질과 편안함을 향상시킵니다. 시스템의 API는 이 IPD를 포함하는 카메라 모델을 제어합니다. 효과를 얻기 위해 사용자의 인식 IPD를 수정하지 않는 것이 가장 좋습니다. 예를 들어, 눈-분리 거리를 늘리면 깊이에 대한 인식이 향상될 수 있지만 눈의 피로감을 유발할 수도 있습니다.
21.3. APIs and Hardware
특별한 이유가 없는 한 시스템 공급자가 제공하는 SDK(VR 소프트웨어 개발 키트) 및 API(애플리케이션 프로그래밍 인터페이스)를 항상 사용하십시오. 자신만의 코드를 통해 구축을 하고자 한다면 광범위한 테스트를 거치지 않고는 이에 대한 성능을 확신할 수 없습니다. 이러한 이유 및 다른 사유로, 애플리케이션 제어 왜곡은 모든 주요 API에서 제거되어, VR 디스플레이를 올바르게 표시하며 성능을 최적화하고 품질을 유지하는 것은 시스템에서 작업합니다.
대부분의 가상 및 증강 현실에서 API에서 공통적으로 사용하는 3차원 장면의 렌더링된 이미지를 헤드셋으로 전송하는 과정은 간단합니다. 먼저, 렌더링되려는 프레임의 시간의 시간을 결정하여 시간 지연을 측정가능하도록 합니다. 이 값은 SDK가 프레임을 보는 순간 눈이 어디에 어느 방향으로 위치할 것인지에 대한 추정치를 계산할 수 있도록 합니다. 이 예상 대기 시간이 주어지면 각 눈의 카메라 설정에 대한 정보나 헤드 방향과 위치 혹은 자세 등의 정보를 API에 보내면 렌더링된 이미지가 보낸 정보에 맞춰 예상 위치와 방향을 고려하여 만들어지며 이를 보여줍니다. 이를 통해 지연 시간의 영향을 최소화할 수 있습니다.
각 눈에 대해 예측된 포즈가 이에 맞게 두개의 장면이 개별적으로 주어지며주어지면 일반적으로 장면을 두 개의 개별 표적으로 렌더링합니다. 이러한 대상은 텍스처로 SDK의 합성기로 보내져 이미지를 헤드셋에서 가장 잘 보이는 형태로 변환합니다. 또한 합성기는 다양한 층들을 함께 합성할 수 있습니다. 각 눈에 대해 영상이 구성되면 왜곡, 색차 및 필요한 기타 프로세스가 SDK에 의해 수행된 후 결과가 표시됩니다.
API를 사용한다면 알고리즘에 대해 전부 이해할 필요는 없지만, 알아두는 것이 나중을 위해 좋습니다. 이미지 합성부터 시작하면, 간단한 방법은 전부 합한 이후에 다양한 이미지 보정을 사용하는 것입니다. 하지만 각 층에 대한 보정을 먼저 적용시킬 수도 있습니다. 이 방법의 장점은 다른 해상도에 대해서 자체적으로 적용되어 이미지 품질이 향상될 수 있다는 점입니다.
사용자가 인식하는 시야는 원형에 가까우므로, 모서리 근처의 픽셀은 렌더링할 필요가 없습니다. 따라서 모서리 근처를 스텐실 버퍼 같은 것으로 막아 렌더링하지 않도록 막아 시간 낭비를 줄일 수 있습니다. 또한 렌더링된 이미지를 화면이 원하는 모양으로 재매핑시켜 왜곡시킬 필요가 있는데, 이는 픽셀 셰이더에서 출력 디스플레이 픽셀에 해당하는 텍스처의 정확한 위치를 계산하여 수행가능하지만 비쌉니다. 삼각형에 대해서는 텍스처를 적용하는 것이 더 효율적인데, 메시가 왜곡되면 색깔 차이가 보정되지 않기에, 텍스처 좌표를 이용하는 것이 더 안정적입니다.
21.3.1 Stereo Rendering
두 개의 화면에 대해 각각 렌더링하면 많은 비용이 듭니다. 이는 같지 않고, 다른 요소들을 포함하기에 단순하게 복사도 불가능하기에 많은 방법들이 연구되었습니다.
Frustrum culling은 종종 GPU의 파이프라인으로 메시가 전송되기 전에 수행되는데, 한쪽에 대해서만 수행하더라도 양쪽 모두에 적용도리 수 있습니다. 이는 렌더링 전에 수행되므로, 사용할 렌더링된 정확한 뷰는 컬링이 발생한 후에 다시 수습될 수 있습니다.하지만 이는 제거된 모델을 다시 수습해서 볼 수도 있기에, culling을 하는 동안 안전 영역을 필요로 합니다.
두개의 장면를 만들 때, 하나의 장면을 완전히 렌더링하고 나서 차례로 나머지 하나를 렌더링할 수 있습니다. 이는 상태 변화도 두 배로 증가한다는 결정적 단점을 가지고 있으며, 타일 기반 렌더러의 경우 보기 및 렌더 대상을 자주 변경하면 성능이 저하됩니다. 더 나은 대안은 카메라 변환을 중간에 전환하면서 각 개체를 두 번 렌더링하는 것이지만 이도 API draw 호출수가 2배인 상태 이빈다. 다른 하나의 방법은 geometry shader를 통해 각 뷰에 삼각형을 보충하는 방법이지만, 이는 처리량의 효율을 낮추기에 사용되지 않습니다. 좀 더 나은 방법으로는 한 번의 드로우 호출에 2번 그려지도록 인스턴스화 하는 방법이 존재합니다. 또 다른 접근법은 한 눈의 이미지를 렌더링할 때 명령 목록을 형성하고 참조된 상수 버퍼를 다른 눈의 변환으로 이동한 다음 이 목록을 재생하여 두 번째 눈의 이미지를 렌더링하는 것입니다. 파이프라인 아래로 지오메트리를 두 번 이상 전송하지 않도록 하는 몇 가지 확장들이 존재하며, 구현에 자유를 줍니다. 2번 렌더링하되 각각의 화면에 맞는 삼각형을 각각 보내기도 합니다.
멀티 GPU는 각각의 화면을 두개의 GPU에서 각각 렌더링하는 방법입니다. affinity mask를 통해 API 호출에 대해 지정된 GPU로 가도록 합니다. 만약 하나의 렌더링 이미지를 필요로 한다면, 한 GPU에서 다른 GPU로 작업 결과를 보내어 합치도록 합니다.
스테레오 시야로 얻는 시차는 가까이있는 경우는 중요하지만 멀리 있는 경우는 무시됩니다. 이 사실을 활용하면 수직 분리 평면을 통하여, 가까운 것은 따로 멀리 있는 것은 한꺼번에 그려 좀 더 효율적으로 그릴 수 있습니다.
광학에 필요한 왜곡으로 인해 각 눈의 이미지 주변에 더 높은 픽셀 밀도가 생성됩니다. 또한 사용자가 화면의 중앙을 상당 시간 바라보기 때문에 주변부의 중요성은 보통 떨어지기에 이에 대해 적은 비용으로 처리하려는 연구가 많았습니다. 주변부 해상도를 낮추기 위해 화면을 3x3 섹션으로 나누어 주변부 주변을 더 낮은 해상도로 렌더링하는 방법이 존재합니다.
21.3.2 Foveated Rendering
눈에 대해서 조금 더 깊게 파고 들면 눈의 망막의 중심의 오목한 곳은 색각과 관련된 광수용체인 원추체가 많이 포함된 곳이기에 우리의 시력은 이 지역에서 가장 높으며, 우리는 비행 중인 새를 추적하거나 페이지의 텍스트를 읽는 것과 같은 이 능력을 활용하기 위해 눈을 회전시킵니다. 시력은 중심에서 멀어질수록 빠른 속도로 떨어지는데, 처음 30도 동안 중심에서 2.5도마다 약 50%씩 떨어지며, 더 가파르게 바깥쪽으로 떨어집니다. 우리의 눈은 두 눈이 같은 물체를 볼 수 있는 양안 시야를 114도 수평으로 가지고 있습니다.
낮은 시력 영역에서 디스플레이의 픽셀이 눈에 많이 보이기에 이를 통해 작업량을 줄일련느 것이 foveated rendering입니다. 이는 눈이 가리키는 부분을 다른 모든 것에 적은 노력을 들이지 않고 높은 해상도와 품질로 렌더링하는 것입니다. 문제는 눈이 빠르게 움직이면 렌더링할 영역이 바뀐다는 것인데 이를 눈 추적 하드웨어를 통해 해결하려고 하지만 아직은 어렵습니다. 또한 주변부에서 "더 큰" 픽셀을 렌더링하면 앨리어싱 문제가 증가하는 경향이 있습니다. 해상도가 낮은 주변 영역의 렌더링은 대비를 유지하려고 시도하고 시간이 지남에 따라 큰 변화를 피함으로써 잠재적으로 개선될 수 있으며, 그러한 영역을 보다 지각적으로 수용할 수 있게 합니다.
21.4. Rendering Techniques
하나의 화면에 작용하는 것이 두 개에도 반드시 작용하는 건 아닙니다. 스테레오 내에서도 시청자와 함께 움직이는 화면과 비교해 고정된 단일 화면에서 작동하는 기술에는 상당한 차이가 존재합니다. 따라서 단일 화면에서의 알고리즘이 AR, VR에서 문제가 발생하는 경우에 대해서 언급을 하도록 하겠습니다.
범프 매핑은 평평한 표면에 그림자를 색칠하기에, 먼 물체에는 잘 작동하지만, 큰 기하학적 물체에 대해서는 착시 현상이 빠르게 깨지게 됩니다. 또한 스카이 박스는 무한에 가까운 곳에서 렌더링되도록 크기가 조정되어, 눈 위치의 차이가 렌더링에 영향을 미치지 말아야 합니다. 톤 매핑의 경우는 눈에 무리가 가지 않도록 렌더링된 이미지가 서로 같아야 합니다. SSAO와 반사는 잘못된 스테레오 차이를 만들게 할 수도 있으며, 이는 z-depth를 이용하는 bloom이나 flare에서도 일어날 수 있습니다. 물과 열에 의한 왜곡도 재작업이 필요합니다. 또한 광택 위치가 서로 다를 수 있는데, 이러한 차이가 비인지적으로 만들 수 있다고 합니다. 모션 블러 효과는 눈의 움직임으로 인해 발생하는 아티팩트를 넘어 이미지를 흐리게 하므로 사용하면 안 됩니다. AR은 실제 환경에 존재하는 것과 유사한 조명을 가상 객체에 적용하는 것과 같은 추가적인 과제가 발생합니다. 일부 상황에서는 실제 조명을 미리 제어하고 가상 조명으로 변환할 수 있지만 가능하지 않다면 다양한 조명 추정 기법을 사용하여 환경의 조명 조건을 즉시 캡처하고 근사할 수 있습니다.
21.4.1 Judder
완벽한 추적과 가상 세계와 실제 세계 간의 통신이 적절히 유지되더라도 지연 시간은 여전히 문제입니다. 영상이 합성기로 전송되고 표시될 때까지 생성되지 않으면 프레임이 손실됩니다. 프레임이 떨어지면 화면을 따라 눈이 이동할 때 가장 잘 보이는 VR 헤드셋의 자국 및 스트로빙 효과인 저더가 인식될 수 있습니다. 밑의 그림을 보면 프레임 기간 동안 픽셀이 조명되면 눈의 망막에 자국이 남습니다. 프레임 동안 디스플레이가 픽셀을 비추는 시간의 길이인 지속성을 낮추면 이러한 자국이 덜 보이지만. 그러나 프레임 간에 큰 변화가 있을 경우 여러 개의 개별 이미지가 인식되는 스트로빙으로 이어질 수 있습니다.
프레임이 떨어지면 더 심각한 경우가 발생한다. 여기에서는 화면에 무언가를 넣어야 하기 때문에 이전 프레임의 이미지를 사용하게 됩니다. 사용자 뷰에 대해 완벽하게 예측한다면 이미지를 수정하여 누락된 프레임에 이를 끼워맞출 수 있습니다. 이러한 작업을 타임 워프라고 하여 움직임에 맞추어 이를 교정 합니다. 속도를 넘어 순전히 회전 뒤틀림의 장점은 장면의 다른 요소들이 모두 일치하기에 보는 방향과 전체 방향만 잘 설정하면 빠르게 수정 가능합니다. 또한, 사용자가 위치를 이동하거나 이동하지 않더라도 헤드가 회전하거나 기울이면 눈의 위치를 변경됩니다. 이 때 생기는 이미지 왜곡도 적절하게 처리 해주어야 합니다.
위치 변경을 조정하려면 전체 3차원 재투영을 수행할 수 있습니다. 이미지의 모든 픽셀은 깊이와 연관되어 있으므로, 이 과정은 이 픽셀들을 세계의 그들의 위치에 투영하고, 눈의 위치를 이동한 다음, 이 점들을 다시 스크린으로 투영하는 것으로 생각할 수 있습니다. 앞서 얘기한 방법들의 문제는 색상이 이전 위치에 대해 계산된다는 것인데, 위치나 가시성은 이동 가능하지만 특정 반사는 변경되지 않습니다.
회전 보상 기법과 위치 보상 기법은 프레임 드롭에 대한 보험의 한 형태로 종종 별도의 비동기 프로세스로 실행되는데, 이러한 것을 비동기적 시공간왜곡 혹은 비동기적 재투영이라고 합니다. 이미지 기반이기 때문에 이 프로세스는 상당히 예측 가능한 시간이 소요되며, 이는 렌더링을 제때 완료할 수 없는 경우 일반적으로 재투사된 이미지를 사용할 수 있다는 것을 의미합니다.
21.4.2 Timing
비동기 시간 왜곡 및 공간 왜곡 기법이 판단을 피하는 데 도움이 될 수 있지만, 품질을 유지하기 위한 최선의 조언은 응용 프로그램 자체를 가능한 한 프레임이 떨어지는 것을 피하는 것입니다. 판단자가 없어도 표시 시 사용자의 실제 자세가 예측된 자세와 다를 수 있다는 점에 주목했습니다. 이와 같이, 후기 방향 뒤틀림이라고 불리는 기술은 사용자가 보아야 할 것을 더 잘 일치시키는 데 유용할 수 있습니다.
나중에 방향 데이터를 얻는 데 걸리는 시간은 이 프로세스가 별도의 CPU 스레드에서 실행되도록 함으로써 최소화될 수 있습니다. 이 CPU 스레드는 주기적으로 예측된 포즈를 GPU용 개인 버퍼로 전송하며, GPU는 이미지를 왜곡하기 전에 마지막 가능한 순간에 최신 설정을 잡아, 모든 헤드 포즈 데이터를 GPU에 직접 제공하기 위해 사용될 수 있습니다. 그렇게 하는 것은 GPU만이 이 정보를 제공하기 때문에 각 눈의 뷰 매트릭스를 그 순간에 응용 프로그램에서 사용할 수 없다는 한계를 가지고 있습니다.
위의 그림에서 CPU는 컴포지터가 끝날 때까지 처리를 시작하지 않기 때문에 CPU와 GPU에 상당한 다운타임이 있음을 알 수 있습니다. 모든 작업이 단일 프레임에서 수행되는 단일 CPU 시스템의 단순화된 보기입니다. 이는 파이프라인이 이루어지며, 여기서 GPU는 이전 프레임에서 CPU가 설정한 모든 것에 대해 작동합니다. 효과적으로 하기 위해서, CPU와 GPU는 각각 하나의 프레임보다 적게 거는 것이 좋습니다. 컴포지터는 종종 GPU가 언제 완료되었는지 알 수 있는 방법을 사용하는데, 이는 펜스라 불리며, 응용 프로그램에 의해 명령으로 실행되며, 완전히 실행되기 전에 모든 GPU 호출이 이루어졌을 때 신호를 보냅니다.
그림에 표시된 GPU 기간은 이미지를 렌더링하는 데 걸린 시간을 나타냅니다. 컴포지터가 최종 프레임을 만들고 표시하는 것이 끝나면 GPU는 다음 프레임의 렌더링을 시작할 준비가 됩니다. CPU는 컴포지팅이 완료될 때까지 기다려야 다음 프레임을 위해 GPU에 명령을 내릴 수 있습니다. 그러나 이미지가 표시될 때까지 기다리면 애플리케이션이 CPU에서 새로운 명령을 생성하는 데 걸리는 시간이 있는데, 이는 드라이버에 의해 해석되고 명령어는 마침내 GPU에 발행됩니다. 이 시간 동안 GPU는 유휴 상태가 되는데, 이 시간에 대해서 각 하드웨어에 따라 최적화시켜 사용하기도 합니다.