2009년 02월 05일
Nebula3 Render Layer : CoreGraphics
이 포스트는 floh님의 블로그에 포스팅된 Nebula3 관련 내용을번역한 글입니다. Nebula3는 Nebula2의 기본적인 아키텍쳐를 계승하지만 구현에서는 이전과 비교해 보면 여러 면에서 많이 다릅니다. 특히 세 개의 레이어로 구성되어 있는 점이 가장 큰 특징 중의 하나인데이것은 이전의 망갈로(Mangalore)가 게임엔진에 포함되었기 때문입니다. 그래서 이 세 개의 레이어에 대한 이해를 위해서 관련된 포스트들만 먼저 번역해서 올립니다.
Nebula3 Render Layer : CoreGraphics
http://flohofwoe.blogspot.com/2007/07/nebula3-render-layer-coregraphics.html
CoreGraphics 서브시스템은 호스트 렌더링 API의 래퍼이다. 기능이나 성능을 희생하지 않고 프로그래밍 가능한 쉐이더와 함께 Direct3D나 OpenGL를 지원하도록 설계되었다. CoreGraphics의 일반적인 기능은 Nebula2의 gfx2 서브시스템과 동일하다.그러나 Nebula2를 사용하면서 겪은 많은 문제점들을 해결하였다.
이전의 Nebula2에 비해서 많은 클래스들이 존재하기 때문에 복잡해 보일 수도 있다. 이렇게 한 이유는 CoreGraphics 클래스들은 보다 작으면서도 특화되어 있기 때문이다. 대부분 클래스들의 기능은 한 문장으로 정의할 수 있다. 반면에 Nebula2의 클래스- nGfxServer2와 같은 - 는 여러가지 일을 처리하기 때문에 다소 몇개의 클래스를 합해 놓은 큰 클래스였다.
전형적인 Nebula3 애플리케이션에서는 CoreGraphics를 다룰 필요가 거의 없다. 대신에 Graphics와 같은 상위 레벨의 서브시스템을 다루게 된다.
CoreGraphics의 중요한 디자인 목표는 다음과 같다.
Nebula3 Render Layer : CoreGraphics
http://flohofwoe.blogspot.com/2007/07/nebula3-render-layer-coregraphics.html
CoreGraphics 서브시스템은 호스트 렌더링 API의 래퍼이다. 기능이나 성능을 희생하지 않고 프로그래밍 가능한 쉐이더와 함께 Direct3D나 OpenGL를 지원하도록 설계되었다. CoreGraphics의 일반적인 기능은 Nebula2의 gfx2 서브시스템과 동일하다.그러나 Nebula2를 사용하면서 겪은 많은 문제점들을 해결하였다.
이전의 Nebula2에 비해서 많은 클래스들이 존재하기 때문에 복잡해 보일 수도 있다. 이렇게 한 이유는 CoreGraphics 클래스들은 보다 작으면서도 특화되어 있기 때문이다. 대부분 클래스들의 기능은 한 문장으로 정의할 수 있다. 반면에 Nebula2의 클래스- nGfxServer2와 같은 - 는 여러가지 일을 처리하기 때문에 다소 몇개의 클래스를 합해 놓은 큰 클래스였다.
전형적인 Nebula3 애플리케이션에서는 CoreGraphics를 다룰 필요가 거의 없다. 대신에 Graphics와 같은 상위 레벨의 서브시스템을 다루게 된다.
CoreGraphics의 중요한 디자인 목표는 다음과 같다.
- 절충없이 Direct3D9, Direct3D10, XBbox360으로 포팅하는 것이 가능하다.
- CoreGraphics는 Nebula2에서 사용한 가상함수를 이용해서 포팅하는 방법 대신에 조건에 따른 매크로(typedef)를 사용함으로써 다른 플랫폼으로 훨씬 수월하게 포팅할 수 있다. 포팅은 이를 위해 희생하거나 절충하는 것 없이 하나의 클래스 상속만으로 처리할 수있다. 심지어는 플랫폼에 의존적인 인라인 함수를 사용하는 것도 가능하다.
- 향상된 리소스 관리
- Nebula3에서는 리소스의 사용과 초기화가 디커플링 되었다. 초기화는 ResourceLoader 클래스를 통해서 처리함으로써 실제 리소스클래스의 코드는 훨씬 적으며 리소스 시스템은 더욱 모듈화 되었다. (왜 이것이 해결했어야 할 문제인지는 Nebula2의nTexture2 클래스를 참고)
- (다수의 여러 클래스로)분리되어 있다.
- nGfxServer2 클래스와 같은 하나의 큰 클래스 대신에 몇 개의 특화된 싱글레톤 클래스로 분리되어 있다.
- RenderDevice : 렌더링 타겟으로 프리미티브 그룹을 렌더링하는 것을 처리한다.
- DisplayDevice : 디스플레이 설정과 관리를 다룬다. (win32에서는 응용 프로그램 윈도우를 가지며, 윈도우즈 메시지 펌프를 실행한다. 또 풀스크린 화면에 대한 질의 등도 처리한다)
- TransformDevice : 렌더링시 필요한 행렬 변환을 관리한다. 뷰, 프로젝션, 모델 행렬을 입력으로 ModelViewProjection, InvView 등의 연결된 행렬 연산 결과를 제공한다.
- ShaderServer : 쉐이더 처리의 핵심. 아래를 참조할 것.
- 향상된 오프스크린 렌더링
- Nebula2에서는 백버퍼에 렌더링하도록 디자인 되었는데 이와 반대로 이제 오프스크린 렌더링 타겟에 렌더링하는 것이 보편화 되었다. 다소 불편하긴 하지만 백버퍼에 렌더링하는 것도 가능하다.
- 쉐이더 시스템에 대한 중대한 향상
- 수많은 오브젝트와 재질을 가지고 있는 전형적인 장면을 렌더링할 때 일어나는 쉐이더의 스위칭과 갱신에 따른 때 오버헤드를 감소할 수 있는 기반을 제공한다.
- Nebula2에서처럼 쉐이더는 Direct3D의 이펙트 파일이다. ( 여러가지 pass로 구성된 technique의 집합이거나 렌더링 상태의 집합)
- ShaderInstance는 자기 자신만의 쉐이더 파라미터 값을 가지는 복제된 이펙트이다.
- ShaderVariable을 통해서 (DirectX10에서 하듯) 직접적으로(직관적으로?) 쉐이더 파라미터를 설정할수 있다.
- ShaderVariations와 ShaderFeature 비트: A shader may offer different specialized variationswhich are selectedthrough a feature bit mask. 예를 들어 특징(??)은 "Depth", "Color", "Opaque","Translucent", "Skinned", "Unlit","PointLight"과 같은 이름을 가지고 쉐이더는 특징(??)에 대해서 "Depth | Skinned", "Color |Skinned | Unlit", "Color| Skinned | PointLight"와 같은 조합을 사용하는 특별한 변형을 제공할 수도 있다.. The high levelrendering code would setfeature bits as needed (during the depth pass, the Depth feature wouldbe switched on for instance), and depending on the current feature bitmask, the right specialized shader variation would automatically beselected for rendering. 적절한 에셋 툴과 함께ShaderVariations와 ShaderFeatures는 프로그래밍 가능한 쉐이더와 관련한 여러가지 유지 보수 문제나 실행시문제점들을 수정하는 것을 돕는다. (think shader-library vs. über-shaders and so on...).
- DeviceRestore/Lost, WinProc, 마우스, 키보드 메시지의 처리가 그래픽 시스템에 고정된 것이 아니라 일반적인 EventHandler를 사용하여 관리된다.
- VertexBuffer와 IndexBuffer가 다시 공용 클래스로 제공된다.
- 버텍스 컴포넌트가 Short2, Short4, UByte4N와 같은 압축된 형태로 제공된다.
- DisplayDevice는 지원하는 렌더링 모드의 목록을 얻거나 현재 데스크탑 모드의 정보나 하드웨어, 벤더, 드라이버의 정보를 알아 내는데 유용한 몇 가지 메쏘드를 제공한다.
- 윈도우를 오픈하기 전에 RenderDevice::CanCreate() 메쏘드를 통해 호스트 플랫폼에서 3D 렌더링이 가능한지 미리 검사해 볼 수 있다.
# by | 2009/02/05 10:53 | Nebula Device | 트랙백 | 핑백(1) | 덧글(0)
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
... 말에 몇 개 번역해 놓은 포스팅이 있어 올립니다. Nebula3를 이해하기 위한 가장 중요한 포스팅들입니다. </a><a href="http://kimsama.egloos.com/1867940">Nebula3 Render Layer : CoreGraphicsNebula3 Resource subsystemNebula3 Graphics subsystemNebu ... more