VirtualGL

**VirtualGL**(**VGL**)은 오픈 소스 소프트웨어 패키지로서 유닉스 및 리눅스 OpenGL 애플리케이션의 3D 렌더링 명령을 전용 서버의 3D 가속기 하드웨어로 리디렉션하고, 렌더링된 출력을 네트워크의 다른 위치에 있는 (신) 클라이언트로 전송한다. 서버 측에서 VirtualGL은 리디렉션을 처리하는 라이브러리와 애플리케이션에 이 라이브러리를 사용하도록 지시하는 래퍼 프로그램으로 구성된다. 클라이언트는 원격 X11 연결을 사용하거나 가상 네트워크 컴퓨팅 (VNC) 서버와 같은 X11 프록시를 사용하여 서버에 연결할 수 있다. X11 연결의 경우 렌더링된 그래픽 출력을 X11 스트림과 별도로 수신하려면 일부 클라이언트 측 VirtualGL 소프트웨어도 필요하다. VNC 연결의 경우 VNC 클라이언트 자체 외에 특정 클라이언트 측 소프트웨어는 필요하지 않다.

## 문제
OpenGL 애플리케이션의 성능은 일반적으로 GPU에 있는 전용 하드웨어 가속기에서 그래픽을 렌더링함으로써 크게 향상될 수 있다. GPU는 매우 보편화되어 애플리케이션이 허용 가능한 성능을 위해 GPU에 의존하게 되었다. 그러나 VNC 및 기타 유닉스 및 리눅스용 신 클라이언트 환경은 서버 측에서 이러한 하드웨어에 접근할 수 없다. 따라서 OpenGL 애플리케이션을 전혀 지원하지 않거나 클라이언트에서 렌더링하거나 서버에서 소프트웨어로 렌더링하는 느린 방법을 사용한다.

하드웨어 가속으로 3D 애플리케이션을 원격으로 표시하려면 전통적으로 "간접 렌더링"을 사용해야 했다. 간접 렌더링은 X 윈도 시스템("X11" 또는 "X")의 GLX 확장을 사용하여 OpenGL 명령을 X11 프로토콜 스트림 내에 캡슐화하고 애플리케이션에서 X 디스플레이로 전송한다. 전통적으로 애플리케이션은 원격 애플리케이션 서버에서 실행되고 X 디스플레이는 사용자 데스크톱에서 실행된다. 이 시나리오에서는 모든 OpenGL 명령이 사용자 데스크톱 머신에서 실행되므로 해당 머신은 빠른 3D 그래픽 가속기를 갖추고 있어야 한다. 이는 이 방법을 사용하여 3D 애플리케이션을 원격으로 표시할 수 있는 머신의 유형을 제한한다.

간접 렌더링은 네트워크가 충분히 빠르고(예: 기가비트 이더넷), 애플리케이션이 렌더링되는 객체의 형상을 동적으로 수정하지 않고, 애플리케이션이 디스플레이 목록을 사용하고, 애플리케이션이 많은 텍스처 매핑을 사용하지 않는 경우 잘 작동할 수 있다. 그러나 많은 OpenGL 애플리케이션은 이러한 기준을 충족하지 못한다. 문제를 더욱 복잡하게 만드는 것은 일부 OpenGL 확장이 간접 렌더링 환경에서 작동하지 않는다는 것이다. 이러한 확장 중 일부는 3D 그래픽 하드웨어에 직접 접근할 수 있는 기능을 요구하므로 간접적으로는 작동할 수 없다. 다른 경우에는 사용자 X 디스플레이가 필요한 OpenGL 확장을 명시적으로 지원하지 않거나, 확장이 사용자 데스크톱 머신에 존재하지 않는 특정 하드웨어 구성에 의존할 수 있다.

OpenGL 렌더링을 애플리케이션 서버에서 수행하면 간접 렌더링으로 인해 발생하는 문제가 회피된다. 애플리케이션이 이제 3D 렌더링 하드웨어에 빠르고 직접적인 경로를 갖기 때문이다. 3D 렌더링이 애플리케이션 서버에서 발생하면 결과 2D 이미지("이메지")만 클라이언트에 전송하면 된다. 이미지는 3D 데이터를 생성하는 데 사용된 3D 데이터의 크기에 관계없이 동일한 프레임 속도로 전송될 수 있으므로, 애플리케이션 서버에서 3D 렌더링을 수행하는 것은 3D 성능 문제를 효과적으로 2D 성능 문제로 전환한다. 이 문제는 이제 1-2 메가픽셀의 이미지 데이터를 네트워크를 통해 대화형 프레임 속도로 스트리밍하는 방법이 되지만, 상용 기술(예를 들어 HDTV)은 이미 이 문제를 해결하고 있다.

## VirtualGL의 해결책
VirtualGL은 "GLX 포크"를 사용하여 애플리케이션 서버에서 OpenGL 렌더링을 수행한다. 유닉스 및 리눅스 OpenGL 애플리케이션은 일반적으로 GLX 명령과 일반 X11 명령을 동일한 X 디스플레이로 보낸다. GLX 명령은 OpenGL 렌더링 컨텍스트를 특정 X 창에 바인딩하고, X 디스플레이가 지원하는 픽셀 형식 목록을 얻는 등의 용도로 사용된다. VirtualGL은 유닉스 및 리눅스의 한 기능을 활용하는데, 이 기능은 라이브러리를 애플리케이션에 "미리 로드"하여 애플리케이션이 일반적으로 연결된 공유 라이브러리에 수행할 특정 함수 호출을 효과적으로 가로채는(AKA "인터포징") 것을 허용한다. VirtualGL이 유닉스 또는 리눅스 OpenGL 애플리케이션에 미리 로드되면, 애플리케이션의 GLX 함수 호출을 가로채어 해당 GLX 명령이 애플리케이션 서버의 X 디스플레이("3D X 서버")로 전송되도록 다시 작성한다. 이 3D X 서버에는 3D 하드웨어 가속기가 연결되어 있을 것으로 추정된다. 따라서 VirtualGL은 GLX 명령이 네트워크를 통해 사용자 X 디스플레이나 GLX를 지원하지 않는 VNC와 같은 가상 X 디스플레이("X 프록시")로 전송되는 것을 방지한다. GLX 호출을 다시 작성하는 과정에서 VirtualGL은 OpenGL 렌더링을 오프스크린 픽셀 버퍼("Pbuffers")로 리디렉션한다. 한편, 애플리케이션의 사용자 인터페이스를 그리는 데 사용되는 일반 X11 명령을 포함한 나머지 함수 호출은 VirtualGL을 통해 수정 없이 통과할 수 있다.

내부적으로 VirtualGL의 인터포저 엔진은 또한 창과 Pbuffer의 맵을 유지하고, 대상 X 디스플레이("2D X 서버")와 3D X 서버 간의 시각적 속성을 일치시키며, GLX 리디렉션이 원활하도록 다양한 기타 해싱 함수를 수행한다. 그러나 본질적으로 OpenGL 컨텍스트가 애플리케이션 서버의 X 디스플레이에 설정되면 VirtualGL은 개입하지 않고 모든 후속 OpenGL 명령이 애플리케이션 서버의 3D 하드웨어로 방해 없이 통과하도록 허용한다. 따라서 애플리케이션은 애플리케이션 서버의 하드웨어 및 드라이버가 제공하는 모든 OpenGL 기능과 확장을 자동으로 사용할 수 있다.

GLX 명령을 마샬링하고 Pbuffer를 관리하는 것 외에도 VirtualGL은 적절한 시기(일반적으로 `glXSwapBuffers()` 또는 `glFinish()`를 모니터링하여) 렌더링된 픽셀을 다시 읽고, 표준 X 이미지 그리기 명령을 사용하여 해당 픽셀을 애플리케이션의 X 창에 그린다. VirtualGL은 GLX 명령을 2D X 서버에서 다른 곳으로 리디렉션하므로, X 프록시(예: VNC)에 가속화된 3D 지원을 추가하는 데 사용할 수 있을 뿐만 아니라 원격 X 디스플레이를 사용할 때 간접 OpenGL 렌더링이 발생하지 않도록 할 수 있다.

섬네일|right|400px|X11 전송을 X 프록시와 함께 사용할 때 3D 및 2D 렌더링은 모두 애플리케이션 서버에서 발생한다. VirtualGL은 애플리케이션에서 3D 명령을 3D 가속기 하드웨어로 리라우팅하고, 렌더링된 이미지를 다시 읽어와서 압축되지 않은 비트맵 시리즈로 X 프록시(VNC 또는 유사 시스템)에 그린다. 한편, 애플리케이션의 2D 그리기 명령(X11 명령)은 X 프록시로 직접 전송된다. X 프록시는 이미지를 압축하여 원격 클라이언트로 전송하는 역할만 담당한다.

VirtualGL을 VNC 또는 다른 X 프록시와 함께 사용하면 여러 사용자가 단일 애플리케이션 서버에서 3D 애플리케이션을 동시에 실행하고 여러 클라이언트가 각 세션을 공유할 수 있다. 그러나 VNC 및 그와 유사한 프로그램은 단색 영역이 넓고 색상이 적으며 프레임 간 차이가 적은 2D 애플리케이션을 처리하도록 조정되어 있다. 반면에 3D 애플리케이션은 미세하고 복잡한 색상 패턴과 후속 프레임 간의 상관 관계가 훨씬 적은 이미지를 생성한다. OpenGL 애플리케이션에서 렌더링된 이미지를 X 창에 그리는 작업 부하는 본질적으로 비디오 플레이어의 작업 부하와 동일하며, 상용 신 클라이언트 소프트웨어는 일반적으로 대화형 프레임 속도로 이 작업 부하를 처리할 수 있을 만큼 충분히 빠른 이미지 코덱이 부족하다.

VirtualGL은 이 문제를 두 가지 방식으로 해결한다.
# TurboVNC
# VGL 전송

### TurboVNC 및 TigerVNC
TurboVNC와 TigerVNC는 TightVNC의 파생 프로그램으로, 부분적으로 libjpeg의 SIMD 가속 버전인 libjpeg-turbo를 사용하여 Tight 및 JPEG 인코딩을 가속화한다. 두 프로젝트 모두 VNC 서버와 클라이언트 애플리케이션을 제공한다.

TurboVNC는 VirtualGL과 동일한 팀에서 개발되었다. 100메가비트 이더넷 네트워크에서 인지할 수 없는 손실 없는 이미지 품질로 초당 50메가픽셀 이상을 표시할 수 있다. TurboVNC는 5메가비트 광대역 연결을 통해 초당 10-12메가픽셀을 표시할 수 있는 추가 최적화를 포함하고 있으며, 이미지 품질은 눈에 띄게 떨어지지만 사용할 수 있다. TurboVNC는 또한 클라이언트 측 이중 버퍼링 및 비활동 기간 동안 화면 이미지의 무손실 사본을 보낼 수 있는 기능과 같은 3D 애플리케이션을 대상으로 하는 다른 기능들을 포함하도록 TightVNC를 확장한다. TurboVNC와 VirtualGL은 텍사스 대학교 오스틴의 텍사스 첨단 컴퓨팅 센터에서 테라그리드 사용자들이 스탬피드 시각화 클러스터의 3D 렌더링 기능을 원격으로 접근할 수 있도록 하는 데 사용된다.

TigerVNC는 TightVNC의 더 최근 포크로, 대부분의 경우 TurboVNC와 유사한 성능을 제공하지만 프로젝트 목표와 기능이 다르다.

### VGL 전송
섬네일|right|400px|VGL 전송을 사용할 때 3D 렌더링은 애플리케이션 서버에서 발생하지만 2D 렌더링은 클라이언트 머신에서 발생한다. VirtualGL은 3D 애플리케이션에서 렌더링된 이미지를 압축하고 이를 비디오 스트림으로 클라이언트에 실행 중인 VirtualGL 클라이언트 애플리케이션으로 전송한다. 이 클라이언트 애플리케이션은 비디오 스트림을 실시간으로 압축 해제하고 표시한다.
VGL 전송을 사용할 때 VirtualGL은 TurboVNC가 사용하는 것과 동일한 최적화된 JPEG 코덱을 사용하여 프로세스 내에서 렌더링된 3D 이미지를 압축한다. VirtualGL은 그런 다음 압축된 이미지를 전용 TCP 소켓을 통해 클라이언트 머신에서 실행되는 VirtualGL 클라이언트 애플리케이션으로 전송한다. VirtualGL 클라이언트는 이미지를 압축 해제하고 픽셀을 적절한 X 창에 그리는 역할을 한다. 한편, 애플리케이션 디스플레이의 비 OpenGL 요소는 표준 원격 X11 프로토콜을 사용하여 네트워크를 통해 전송되고 클라이언트 머신에서 렌더링된다.

이 접근 방식은 클라이언트 머신에 X 디스플레이가 있어야 하며, 2D 렌더링을 수행하기 위해 원격 X11 프로토콜에 의존하기 때문에 많은 애플리케이션이 고지연 네트워크에서 VGL 전송을 사용할 때 성능이 저하될 수 있다. 또한 VGL 전송은 이미지가 사용자 머신으로 푸시되는 방식이므로 본질적으로 협업(세션당 여러 클라이언트)을 지원하지 않는다. 그러나 VGL 전송을 사용하면 모든 애플리케이션 창이 단일 데스크톱 창에 해당하는 완벽하게 매끄러운 애플리케이션 경험을 제공한다. VGL 전송은 2D 렌더링이 클라이언트에서 발생하므로 서버 CPU 부하를 줄이고, 쿼드 버퍼링 스테레오와 같은 고급 OpenGL 기능을 사용할 수 있도록 한다.

VirtualGL 개발자들은 VGL 전송의 주요 사용자를 애플리케이션 서버에 802.11g 무선 또는 고속 이더넷 연결이 있는 랩톱 사용자라고 예상한다.

## VirtualGL을 사용하는 상용 제품
VirtualGL과 TurboVNC는 썬 마이크로시스템즈의 썬 비주얼라이제이션 시스템 제품의 핵심 구성 요소였지만 2009년 4월에 단종되었다. 두 오픈 소스 패키지는 VirtualGL이 압축된 이미지를 썬 레이 신 클라이언트로 보낼 수 있도록 하는 클로즈드 소스 플러그인과 VirtualGL을 선 그리드 엔진과 통합하여 원격 3D 작업에 대한 리소스 관리 및 스케줄링을 제공하는 또 다른 클로즈드 소스 패키지와 결합되었다. "썬 공유 시각화"라고 불리는 이러한 패키지의 조합은 무료 다운로드로 제공되었다. 썬은 지원 비용을 청구했다.

노머신(NoMachine)의 v4.x.x는 VirtualGL을 지원하여 사용자가 노머신 데스크톱 세션에서 3D 애플리케이션을 실행할 수 있도록 한다.

HP의 스케일러블 시각화 어레이 소프트웨어 v2.1에는 VirtualGL 및 TurboVNC와 통합되는 구성 요소가 포함되어 3D 작업을 시각화 클러스터에서 예약하고 원격으로 표시할 수 있다.

ThinLinc v3.0.0은 VirtualGL과 연동하도록 설계되었다.

EnginFrame Views v2010은 원격 프로토콜 옵션 중 하나로 VirtualGL을 지원한다.

오픈텍스트의 Exceed onDemand 및 Exceed Freedom 제품은 VirtualGL의 코드를 사용하여 서버 측 렌더링을 구현한다.

## 같이 보기

* Xgl
* AIGLX

## 각주

### 내용주

### 일반 참조
*
*
*

## 외부 링크
*
*
*
* Official TurboVNC website
*
*

분류:원격 데스크톱
분류:자유 윈도 시스템
분류:신 클라이언트
분류:OpenGL