발표: 최지호(zho@korea.com) Direct3D 10 API 개요 원저: Jack Hoxley 발표: 최지호(zho@korea.com) 2005.12.18 KASA(http://www.dev3d.net)
DirectX 10에 대하여 이전 버전(DirectX 9)과 상당 부분 유사. 완전히 다시 설계. 윈도우 비스타 전용. XP에서 실행되지 않음. KASA
VDDM Vista Display Driver Model. 비스타는 이전 운영체제보다 그래픽 기능과 이펙트에 신경을 많이 씀. “Aero Glass” GUI 스킨이 그 예. KASA
GPU 비스타에서, GPU는 여러 애플리케이션이 공유하는 자원. VDDM은 명령 스케쥴링 및 번역을 “User Mode”로 옮기고, “Kernel Mode”에는 핵심 기능만 남김. 하드웨어나 드라이버가 죽어도 운영체제는 죽지 않고, 드라이버/하드웨어만 리셋. KASA
GPU 공유 GPU를 공유한다는 것이 VDDM의 핵심. 운영체제에 의한 가상 비디오 메모리 관리. 쓰레드간 리소스 공유가 가능. “디바이스 손실”이 없어짐. 애플리케이션에서 처리할 필요가 없어짐. “디바이스 제거됨” 상태가 생김. 노트북이 도킹 스테이션에 연결된 경우. 드라이버 업그레이드 시. KASA
DXGI DirectX Graphics Infrastructure. Direct3D 10.1, 10.2, 11, 12 등이 새로 나와도 변하지 않는 인터페이스. 기본적인 저수준의 리소스와 오퍼레이션들이 이에 해당. KASA
프로그래머블 파이프라인 고정 함수 파이프라인은 사라짐. 새로운 프로그래머블 유닛: 모두 “셰이더 모델 4.0”. Vertex Shaders(VS) Geometry Shaders(GS) Pixel Shaders(PS) 모두 “셰이더 모델 4.0”. Geometry shader 완전히 새로 추가된 셰이더 유닛. 지오메트리를 추가하는 것이 가능. KASA
Stream Output(SO) 일반적인 그래픽 파이프라인은 단방향. 스트림 출력(SO)을 통해 GS의 결과를 다시 Input Assembler로 보낼 수 있음. GS의 결과를 IA로 보내는 동시에 렌더링하는 것도 가능. SO를 통해 CPU의 간섭을 최소화시킬 수 있음(병렬화). 예. 첫번째 패스에는 스키닝을, 두번째 패스에는 셰도우 볼륨 익스트루션을. KASA
Input Assembler(IA) 고정함수. 인덱스/버텍스 스트림을 사용해 VS/GS의 실제 지오메트리 데이터를 구성. 프리미티브 타입(선 리스트, 삼각형 스트립, 등등)으로 실제 삼각형을 구성. 지오메트리 인스턴싱 및 스트림 출력 데이터 관련. 버텍스 ID, 프리미티브 ID를 생성. KASA
Output Merger(OM) 고정함수. 파이프라인의 마지막. 모든 결과를 모아 스크린의 최종 픽셀로 통합시키는 작업 수행. 각 렌더타겟의 스텐실 값, 깊이 값 등을 다양한 블렌딩 함수를 사용하여 결정. KASA
Direct3D 10 파이프라인 KASA
Primitive ID IA가 설정하는 속성(GS도 삼각형 레벨에서는 가능). 재질 시스템이 GPU에 의해서 직접적으로 선택 가능. IA에 의해 지정된 Primitive ID를 통해 GS 혹은 PS에서 어떻게 렌더링 시킬지 결정. 애플리케이션 단에서의 재질 기반 소팅이 필요없게 될지도… KASA
Views 뷰(Views)를 사용한 통합 리소스 모델. 다른 스테이지(또는 같은 스테이지에서도)에서 동일한 리소스를 다르게 해석할 수 있음. 복잡한 리소스들을 다소 융통성 있게 만듦. 예. 입방체 맵을 6개의 렌더타겟들로 해석하는 동시에 단 패스 입방체 맵 렌더링을 수행. 다른 밉맵 레벨들들 입력/출력으로 사용하여, 다운샘플링 알고리즘의 “핑퐁”현상을 막음. KASA
Direct3D 10 애플리케이션 개발 새로운 API를 사용해야 하지만, 핵심은 변하지 않음. 새로운 운영체제, 드라이버 모델이기 때문에 변수가 적음. 테스트해야 할 하드웨어 개수도 적음. IHV간에 기본 기능은 동일하기 때문에, 성능과 품질로 구분하는 수 밖에 없음. 특정 기능이 벤더에 따라 너무 느리거나 하다면, 벤더 의존적인 다중 코드 패스가 여전히 존재할 가능성이 큼. KASA
생성시 리소스 유효성 체크 생성시에 리소스의 유효성을 체크함(성능을 위해서). 사용할 때마다 매번 체크하는 비용을 줄임. 생성시 한번만 체크하면 그 다음부터는 안심하고 사용할 수 있으므로 간결하고 간단한 코딩이 가능. KASA
렌더 스테이트 다수의 변경 불가능한 상태 객체. 각 객체는 해당 파이프라인에 관계된 렌더 상태의 그룹을 구성. 예. D3D10_DEPTH_STENCIL_DESC 객체는 깊이/스텐실 버퍼링에 관련된 렌더 상태들을 보관. 관리하기 편해짐. 이펙트에 사용될 여러 상태 객체들을 한번에 생성. KASA
HLSL(이펙트 프레임웍) 어셈블리 셰이더가 (거의) 사라짐. 어셈블리는 디버깅 용도로만 사용 가능. 컴파일러가 코어 런타임에 포함됨. 예전에는 D3DX에 있었음. HLSL의 기본기능은 변하지 않았지만, 많은 새로운 명령과 함수들이 추가됨. SAS 도 아직 존재함. 여러 상수들을 그룹화시킨 상수 버퍼 사용. KASA
HLSL(완전한 정수 연산 기능) 정수 명령과 연산이 가능. 논리 연산자와 비트 연산자. 예. 비트 연산을 사용한 순수 바이너리 데이터 접근이 가능하므로 압축된 지오메트리를 GPU에서 사용 가능. KASA
HLSL(기타) 명령어 개수가 무제한. 루프 및 실행 시간은 비스타 드라이버 모델에 의해 관리. GPU가 멈춰 있다면 리셋을 시켜야 하므로. 기존 API보다는 새로운 API를 사용하면 이점 있음. 재설계한 이펙트 파일은 기존보다 적은 메모리 사용. 이펙트 파일 내부(상수/인자, 테크닉 등)를 액세스하는 인터페이스가 경량화됨. 이펙트 풀 사용을 권장. KASA
앞으로 할일 고정 함수에 의존하지 말자. 어셈블리 셰이더를 사용하지 말자. 새로운 파이프라인 값(VertexID, PrimitiveID, InstanceID)들을 어떻게 사용할지 (창의적으로) 궁리하자. GS에 너무 큰 기대는 금물. 베이저 패치나 압축 메시 같은 용도로 생각하는 것은 무리. 초기 하드웨어는 GS에 대해 원하는 성능을 내지 못할 가능성이 큼. 윈도우XP와 DirectX 9이 갑자기 사라지는 것은 아님. 호환성을 위해, DirectX9의 업데이트이며, 비스타의 새 드라이버 모델을 사용할 수 있는 “DirectX 9.L”를 고려. KASA
참고링크 원문: PDC 2005 Presentations: DirectX and Windows Vista http://www.gamedev.net/reference/programming/features/d3d10overview/default.asp PDC 2005 Presentations: DirectX and Windows Vista http://msdn.microsoft.com/directx/archives/pdc2005/ KASA