Direct3D 9에서 Direct3D 11로 중요 한 변경 내용Important changes from Direct3D 9 to Direct3D 11

요약Summary

이 항목에서는 DirectX 9와 DirectX 11의 상위 수준 차이점에 대해 설명 합니다.This topic explains the high-level differences between DirectX 9 and DirectX 11.

Direct3D 11은 기본적으로 Direct3D 9와 동일한 유형의 API로, 그래픽 하드웨어에서 낮은 수준의 가상화 된 인터페이스입니다.Direct3D 11 is fundamentally the same type of API as Direct3D 9 - a low-level, virtualized interface into graphics hardware. 이를 통해 다양 한 하드웨어 구현에서 그래픽 그리기 작업을 수행할 수 있습니다.It still allows you to perform graphics drawing operations on a variety of hardware implementations. Direct3D 9 이후로 그래픽 API의 레이아웃이 변경되었습니다. 디바이스 컨텍스트의 개념이 확장되고 특히 그래픽 인프라에 대한 API가 추가되었습니다.The layout of the graphics API has changed since Direct3D 9; the concept of a device context has been expanded, and an API has been added specifically for graphics infrastructure. Direct3D 장치에 저장 된 리소스에는 리소스 뷰 라는 데이터 다형성을 위한 novel 메커니즘이 있습니다.Resources stored on the Direct3D device have a novel mechanism for data polymorphism called a resource view.

핵심 API 함수Core API functions

Direct3D 9에서 사용을 시작 하기 전에 Direct3D API에 대 한 인터페이스를 만들어야 했습니다.In Direct3D 9 you had to create an interface to the Direct3D API before you could start using it. UWP (Direct3D 11 유니버설 Windows 플랫폼) 게임에서 D3D11CreateDevice 라는 정적 함수를 호출 하 여 장치 및 장치 컨텍스트를 만듭니다.In your Direct3D 11 Universal Windows Platform (UWP) game, you call a static function called D3D11CreateDevice to create the device and the device context.

장치 및 장치 컨텍스트Devices and device context

Direct3D 11 장치는 가상화 된 그래픽 어댑터를 나타냅니다.A Direct3D 11 device represents a virtualized graphics adapter. 비디오 메모리에서 리소스를 만드는 데 사용 됩니다. 예를 들어 GPU에 질감 업로드, 질감 리소스 및 스왑 체인에 대 한 보기 만들기, 텍스처 샘플러 만들기 등이 있습니다.It's used to create resources in video memory, for example: uploading textures to the GPU, creating views on texture resources and swap chains, and creating texture samplers. Direct3D 11 장치 인터페이스를 사용 하는 방법에 대 한 전체 목록은 ID3D11DeviceID3D11Device1를 참조 하세요.For a complete list of what a Direct3D 11 device interface is used for see ID3D11Device and ID3D11Device1.

Direct3D 11.A Direct3D 11. 장치 컨텍스트는 파이프라인 상태를 설정 하 고 렌더링 명령을 생성 하는 데 사용 됩니다.device context is used to set pipeline state and generate rendering commands. 예를 들어 Direct3D 11 렌더링 체인은 장치 컨텍스트를 사용 하 여 렌더링 체인을 설정 하 고 장면을 그립니다 (아래 참조).For example, a Direct3D 11 rendering chain uses a device context to set up the rendering chain and draw the scene (see below). 장치 컨텍스트는 Direct3D 장치 리소스에 사용 되는 비디오 메모리에 액세스 (매핑) 하는 데 사용 됩니다. 또한 상수 버퍼 데이터와 같은 하위 리소스 데이터를 업데이트 하는 데 사용 됩니다.The device context is used to access (map) video memory used by Direct3D device resources; it's also used to update subresource data, for example constant buffer data. Direct3D 11 장치 컨텍스트를 사용 하는 방법에 대 한 전체 목록은 ID3D11DeviceContextID3D11DeviceContext1를 참조 하세요.For a complete list of what a Direct3D 11 device context is used for see ID3D11DeviceContext and ID3D11DeviceContext1. 이 샘플의 대부분은 직접 컨텍스트를 사용 하 여 장치에 직접 렌더링 하지만 Direct3D 11은 주로 다중 스레딩에 사용 되는 지연 된 장치 컨텍스트를 지원 합니다.Note that most of our samples use an immediate context to render directly to the device, but Direct3D 11 also supports deferred device contexts, which are primarily used for multithreading.

Direct3D 11에서 장치 핸들 및 장치 컨텍스트 핸들은 모두 D3D11CreateDevice를 호출 하 여 가져옵니다.In Direct3D 11, the device handle and device context handle are both obtained by calling D3D11CreateDevice. 이 방법은 특정 하드웨어 기능 집합을 요청 하 고 그래픽 어댑터에서 지 원하는 Direct3D 기능 수준에 대 한 정보를 검색 하는 데도 사용할 수 있습니다.This method is also where you request a specific set of hardware features and retrieve information on Direct3D feature levels supported by the graphics adapter. 장치, 장치 컨텍스트 및 스레딩 고려 사항에 대 한 자세한 내용은 Direct3D 11의 장치 소개 를 참조 하세요.See Introduction to a Device in Direct3D 11 for more info on devices, device contexts, and threading considerations.

장치 인프라, 프레임 버퍼 및 렌더링 대상 뷰Device infrastructure, frame buffers, and render target views

Direct3D 11에서 장치 어댑터 및 하드웨어 구성은 Idxgid 어댑터IDXGIDevice1 COM 인터페이스를 사용 하 여 DXGI (DIRECTX Graphics Infrastructure) API를 사용 하 여 설정 됩니다.In Direct3D 11, the device adapter and hardware configuration are set with the DirectX Graphics Infrastructure (DXGI) API using the IDXGIAdapter and IDXGIDevice1 COM interfaces. 버퍼 및 기타 창 리소스 (표시 또는 오프 스크린)는 특정 DXGI 인터페이스에 의해 생성 및 구성 됩니다. IDXGIFactory2 factory 패턴 구현은 프레임 버퍼와 같은 DXGI 리소스를 가져옵니다.Buffers and other window resources (visible or offscreen) are created and configured by specific DXGI interfaces; the IDXGIFactory2 factory pattern implementation acquires DXGI resources such as the frame buffer. DXGI는 스왑 체인을 소유 하므로 DXGI 인터페이스를 사용 하 여 화면에 프레임을 표시 합니다. IDXGISwapChain1를 참조 하세요.Since DXGI owns the swap chain, a DXGI interface is used to present frames to the screen - see IDXGISwapChain1.

IDXGIFactory2 를 사용 하 여 게임과 호환 되는 스왑 체인을 만듭니다.Use IDXGIFactory2 to create a swap chain compatible with your game. HWND에 대 한 스왑 체인을 만드는 대신 핵심 창 또는 컴퍼지션 (XAML interop)의 스왑 체인을 만들어야 합니다.You need to create a swap chain for a core window, or for composition (XAML interop), instead of creating a swap chain for an HWND.

장치 리소스 및 리소스 뷰Device resources and resource views

Direct3D 11은 보기 라고 하는 비디오 메모리 리소스에서 추가 수준의 다형성을 지원 합니다.Direct3D 11 supports an additional level of polymorphism on video memory resources known as views. 기본적으로 질감에 대 한 단일 Direct3D 9 개체를 사용 하는 경우 데이터를 보관 하는 질감 리소스와 뷰가 렌더링에 사용 되는 방식을 나타내는 리소스 뷰에 두 개체가 있습니다.Essentially, where you had a single Direct3D 9 object for a texture, you now have two objects: the texture resource, which holds the data, and the resource view, which indicates how the view is used for rendering. 리소스를 기반으로 하는 뷰를 사용 하면 특정 용도에 해당 리소스를 사용할 수 있습니다.A view based on a resource enables that resource to be used for a specific purpose. 예를 들어 2D 질감 리소스가 ID3D11Texture2D으로 생성 된 다음 셰이더에ID3D11ShaderResourceView(셰이더 리소스 뷰)를 만들어 셰이더에 질감으로 사용할 수 있습니다.For example, a 2D texture resource is created as an ID3D11Texture2D, then a shader resource view (ID3D11ShaderResourceView) is created on it so it can be used as a texture in a shader. 렌더링 대상 뷰 (ID3D11RenderTargetView)는 그리기 화면으로 사용할 수 있도록 동일한 2d 질감 리소스에도 만들 수 있습니다.A render target view (ID3D11RenderTargetView) can also be created on the same 2D texture resource so that it can be used as a drawing surface. 또 다른 예로 동일한 픽셀 데이터는 단일 질감 리소스에 대해 2 개의 개별 뷰를 사용 하 여 2 개의 다른 픽셀 형식으로 표현 됩니다.In another example, the same pixel data is represented in 2 different pixel formats by using 2 separate views on a single texture resource.

기본 리소스는 생성 되는 뷰의 형식과 호환 되는 속성을 사용 하 여 만들어야 합니다.The underlying resource must be created with properties that are compatible with the type of views that will be created from it. 예를 들어 ID3D11RenderTargetView 이 표면에 적용 되는 경우 D3D11 _ BIND _ 렌더링 _ 대상 플래그를 사용 하 여 해당 화면을 만듭니다.For example, if an ID3D11RenderTargetView is applied to a surface, that surface is created with the D3D11_BIND_RENDER_TARGET flag. 또한 표면에는 렌더링 ( dxgi _ 형식참조)과 호환 되는 DXGI 표면 형식이 있어야 합니다.The surface also has to have a DXGI surface format compatible with rendering (see DXGI_FORMAT).

렌더링에 사용 하는 대부분의 리소스는 ID3D11DeviceChild에서 상속 되는 ID3D11Resource 인터페이스에서 상속 됩니다.Most of the resources you use for rendering inherit from the ID3D11Resource interface, which inherits from ID3D11DeviceChild. 꼭 짓 점 버퍼, 인덱스 버퍼, 상수 버퍼 및 셰이더는 모두 Direct3D 11 리소스입니다.Vertex buffers, index buffers, constant buffers, and shaders are all Direct3D 11 resources. 입력 레이아웃 및 샘플러 상태는 ID3D11DeviceChild에서 직접 상속 됩니다.Input layouts and sampler states inherit directly from ID3D11DeviceChild.

리소스 뷰는 DXGI _ 형식 열거형 값을 사용 하 여 픽셀 형식을 표시 합니다.Resources views use a DXGI_FORMAT enum value to indicate the pixel format. 모든 D3DFMT가 DXGI 형식으로 지원 되는 것은 아닙니다 _ .Not every D3DFMT is supported as a DXGI_FORMAT. 예를 들어 DXGI에는 D3DFMT R8G8B8와 동일한 24bpp RGB 형식이 없습니다 _ .For example, there is no 24bpp RGB format in DXGI that is equivalent to D3DFMT_R8G8B8. 모든 RGB 형식에 해당 하는 BGR로 없습니다 _ . DXGI format _ R10G10B10A2 _ UNORM은 D3DFMT A2B10G10R10와 동일 _ 하지만 D3DFMT A2R10G10B10와는 직접적인 관계가 없습니다 _ .There are also not BGR equivalents to every RGB format (DXGI_FORMAT_R10G10B10A2_UNORM is equivalent to D3DFMT_A2B10G10R10, but there’s no direct equivalent to D3DFMT_A2R10G10B10). 이러한 레거시 형식의 콘텐츠를 빌드 시 지원 되는 형식으로 변환 하는 계획을 세워야 합니다.You should plan to convert any content in these legacy formats to supported formats at build-time. DXGI 형식의 전체 목록은 dxgi _ 형식 열거를 참조 하세요.For a complete list of DXGI formats see the DXGI_FORMAT enumeration.

Direct3D 장치 리소스 (및 리소스 뷰)는 장면을 렌더링 하기 전에 생성 됩니다.Direct3D device resources (and resource views) are created before the scene is rendered. 장치 컨텍스트는 아래에 설명 된 대로 렌더링 체인을 설정 하는 데 사용 됩니다.Device contexts are used to set up the rendering chain, as explained below.

장치 컨텍스트 및 렌더링 체인Device context and the rendering chain

Direct3D 9 및 Direct3D 10. x에는 리소스 생성, 상태 및 그리기를 관리 하는 단일 Direct3D 장치 개체가 있습니다.In Direct3D 9 and Direct3D 10.x, there was a single Direct3D device object which managed resource creation, state, and drawing. Direct3D 11에서 Direct3D 장치 인터페이스는 여전히 리소스 만들기를 관리 하지만 모든 상태 및 그리기 작업은 Direct3D 장치 컨텍스트를 사용 하 여 처리 됩니다.In Direct3D 11, the Direct3D device interface still manages resource creation, but all state and drawing operations are handled by using a Direct3D device context. 다음은 장치 컨텍스트 (ID3D11DeviceContext1 인터페이스)를 사용 하 여 렌더링 체인을 설정 하는 방법의 예입니다.Here's an example of how the device context (ID3D11DeviceContext1 interface) is used to set up the rendering chain:

  • 렌더링 대상 뷰 설정 및 해제 (및 깊이 스텐실 뷰)Set and clear render target views (and depth stencil view)
  • 입력 어셈블러 단계 (IA 단계)에 대 한 꼭 짓 점 버퍼, 인덱스 버퍼 및 입력 레이아웃을 설정 합니다.Set the vertex buffer, index buffer, and input layout for the input assembler stage (IA stage)
  • 꼭 짓 점 및 픽셀 셰이더를 파이프라인에 바인딩Bind vertex and pixel shaders to the pipeline
  • 셰이더에 상수 버퍼 바인딩Bind constant buffers to shaders
  • 질감 뷰 및 샘플러를 픽셀 셰이더에 바인딩Bind texture views and samplers to the pixel shader
  • 장면 그리기Draw the scene

ID3D11DeviceContext::D raw 메서드 중 하나가 호출 되 면 렌더링 대상 보기에 장면이 그려집니다.When one of the ID3D11DeviceContext::Draw methods is called, the scene is drawn on the render target view. 완료 되 면 IDXGISwapChain1::P resent1를 호출 하 여 완료 된 프레임을 표시 하는 데 DXGI 어댑터의 모든 그리기가 사용 됩니다.When you're done will all your drawing the DXGI adapter is used to present the completed frame by calling IDXGISwapChain1::Present1.

상태 관리State management

개별 설정/해제 집합을 포함 하는 Direct3D 9 관리 되는 상태 설정은 SetRenderState, SetSamplerState 및 SetTextureStageState 메서드를 사용 하 여 설정 됩니다.Direct3D 9 managed state settings with a large set of individual toggles set with the SetRenderState, SetSamplerState, and SetTextureStageState methods. Direct3D 11은 레거시 고정 함수 파이프라인을 지원 하지 않으므로 SetTextureStageState는 픽셀 셰이더 (PS)를 작성 하 여 대체 됩니다.Since Direct3D 11 does not support the legacy fixed-function pipeline, the SetTextureStageState is replaced by writing pixel shaders (PS). Direct3D 9 state 블록에 해당 하는 항목이 없습니다.There is no equivalent to a Direct3D 9 state block. Direct3D 11은 렌더링 상태를 그룹화 하는 보다 간소화 된 방법을 제공 하는 4 가지 종류의 상태 개체를 사용 하 여 상태를 관리 합니다.Direct3D 11 instead manages state through the use of 4 kinds of state objects which provide a more streamlined way to group the rendering state.

예를 들어 D3DRS zenable과 함께 SetRenderState를 사용 하는 대신 _ 이 및 기타 관련 상태 설정을 사용 하 여 DepthStencilState 개체를 만들고 렌더링 하는 동안 상태를 변경 하는 데 사용 합니다.For example, instead of using SetRenderState with D3DRS_ZENABLE, you create a DepthStencilState object with this and other related state settings and use it to change state while rendering.

Direct3D 9 응용 프로그램을 상태 개체로 포팅 하는 경우 다양 한 상태 조합이 변경할 수 없는 상태 개체로 표시 된다는 점에 유의 하십시오.When porting Direct3D 9 applications to state objects, be aware that your various state combinations are represented as immutable state objects. 한 번 만든 후 유효한 경우에는 다시 사용 해야 합니다.They should be created once and re-used as long as they are valid.

Direct3D 기능 수준Direct3D feature levels

Direct3D에는 기능 수준 이라는 하드웨어 지원을 결정 하는 새로운 메커니즘이 있습니다.Direct3D has a new mechanism for determining hardware support called feature levels. 기능 수준은 잘 정의 된 GPU 기능 집합을 요청할 수 있도록 하 여 그래픽 어댑터에서 수행할 수 있는 작업을 간소화 합니다.Feature levels simplify the task of figuring out what the graphics adapter can do by allowing you to request a well-defined set of GPU functionality. 예를 들어 9 _ 1 기능 수준은 Direct3D 9 그래픽 어댑터에서 제공 하는 기능을 구현 합니다 (셰이더 모델 2.x 포함).For example, the 9_1 feature level implements the functionality provided by Direct3D 9 graphics adapters, including shader model 2.x. 9 _ 1은 가장 낮은 기능 수준 이므로 모든 장치에서 꼭 짓 점 셰이더 및 픽셀 셰이더를 지원 하도록 할 수 있습니다 .이는 Direct3D 9의 프로그래밍 가능한 셰이더 모델에서 지 원하는 것과 동일한 단계 였습니다.Since 9_1 is the lowest feature level, you can expect all devices to support a vertex shader and a pixel shader, which were the same stages supported by the Direct3D 9 programmable shader model.

게임에서 D3D11CreateDevice 를 사용 하 여 Direct3D 장치 및 장치 컨텍스트를 만듭니다.Your game will use D3D11CreateDevice to create the Direct3D device and device context. 이 함수를 호출 하면 게임에서 지원할 수 있는 기능 수준 목록을 제공 합니다.When you call this function you provide a list of feature levels that your game can support. 이는 해당 목록에서 지원 되는 가장 높은 기능 수준을 반환 합니다.It will return the highest supported feature level from that list. 예를 들어 게임에서 BC4/BC5 질감 (DirectX 10 하드웨어의 기능)을 사용할 수 있는 경우 _ _ 지원 되는 기능 수준 목록에서 최소 9 1 및 10 0을 포함 합니다.For example if your game can use BC4/BC5 textures (a feature of DirectX 10 hardware), you would include at least 9_1 and 10_0 in the list of supported feature levels. 게임이 DirectX 9 하드웨어에서 실행 중이 고 BC4/BC5 텍스처를 사용할 수 없는 경우 D3D11CreateDevice 는 9 1을 반환 _ 합니다.If the game is running on DirectX 9 hardware and BC4/BC5 textures can't be used, then D3D11CreateDevice will return 9_1. 그러면 게임이 다른 질감 형식 (그리고 더 작은 질감)으로 대체 될 수 있습니다.Then your game can fall back to a different texture format (and smaller textures).

Direct3d 9 게임을 확장 하 여 더 높은 Direct3D 기능 수준을 지원 하도록 결정 한 경우 기존 Direct3D 9 그래픽 코드를 먼저 이식 하는 것이 좋습니다.If you decide to extend your Direct3D 9 game to support higher Direct3D feature levels then it's better to finish porting your existing Direct3D 9 graphics code first. Direct3D 11에서 게임을 진행 하 고 나면 향상 된 그래픽으로 렌더링 경로를 더 쉽게 추가할 수 있습니다.After you have your game working in Direct3D 11, it's easier to add additional rendering paths with enhanced graphics.

기능 수준 지원에 대 한 자세한 설명은 Direct3D 기능 수준 을 참조 하세요.See Direct3D feature levels for a detailed explanation of feature level support. Direct3D 11 기능에 대 한 전체 목록은 direct3d 11 기능direct3d 11.1 기능 을 참조 하세요.See Direct3D 11 Features and Direct3D 11.1 Features for a full list of Direct3D 11 features.

기능 수준 및 프로그래밍 가능 파이프라인Feature levels and the programmable pipeline

하드웨어는 Direct3D 9 이후 계속 진화 하 고 몇 가지 새로운 선택적 단계가 프로그래밍 가능한 그래픽 파이프라인에 추가 되었습니다.Hardware has continue to evolve since Direct3D 9, and several new optional stages have been added to the programmable graphics pipeline. 그래픽 파이프라인에 대 한 옵션 집합은 Direct3D 기능 수준에 따라 달라 집니다.The set of options you have for the graphics pipeline varies with the Direct3D feature level. 기능 수준 10.0에는 GPU에서 multipass 렌더링을 위한 선택적 스트림 출력을 포함 하는 기 하 도형 셰이더 단계가 포함 되어 있습니다.Feature level 10.0 includes the geometry shader stage with optional stream out for multipass rendering on the GPU. 기능 수준 11 _ 0에는 하드웨어 공간 분할에 사용할 선체 셰이더 및 도메인 셰이더가 포함 됩니다.Feature level 11_0 include the hull shader and domain shader for use with hardware tessellation. 기능 수준 11 _ 0에는 directcompute 셰이더에 대 한 완전 한 지원도 포함 되지만 기능 수준 10. x는 제한 된 형식의 DirectCompute에 대 한 지원도 포함 합니다.Feature level 11_0 also includes full support for DirectCompute shaders, while feature levels 10.x only include support for a limited form of DirectCompute.

모든 셰이더는 Direct3D 기능 수준에 해당 하는 셰이더 프로필을 사용 하 여 HLSL로 작성 됩니다.All shaders are written in HLSL using a shader profile that corresponds to a Direct3D feature level. 셰이더 프로필은 위쪽에서 호환 되므로 vs _ 4 _ 0 _ 수준 _ 9 _ 1 또는 ps 4 0 수준 9 1을 사용 하 여 컴파일하는 HLSL 셰이더는 _ _ _ _ _ 모든 장치에서 작동 합니다.Shader profiles are upwards compatible, so an HLSL shader that compiles using vs_4_0_level_9_1 or ps_4_0_level_9_1 will work across all devices. 셰이더 프로필은 하위 호환 되지 않으므로 vs 4 1을 사용 하 여 컴파일된 셰이더는 _ _ 기능 수준 10 _ 1, 11 _ 0 또는 11 _ 개 장치 에서만 작동 합니다.Shader profiles are not downlevel compatible, so a shader compiled using vs_4_1 will only work on feature level 10_1, 11_0, or 11_1 devices.

SetVertexShaderConstant 및 SetPixelShaderConstant가 포함 된 공유 배열을 사용 하는 셰이더 용 Direct3D 9 관리 되는 상수Direct3D 9 managed constants for shaders using a shared array with SetVertexShaderConstant and SetPixelShaderConstant. Direct3D 11은 꼭 짓 점 버퍼 또는 인덱스 버퍼와 같은 리소스에 해당 하는 상수 버퍼를 사용 합니다.Direct3D 11 uses constant buffers, which are resources like a vertex buffer or index buffer. 상수 버퍼는 효율적으로 업데이트 되도록 설계 되었습니다.Constant buffers are designed to be updated efficiently. 모든 셰이더가 단일 전역 배열로 구성 되는 대신 상수를 논리 그룹으로 구성 하 고 하나 이상의 상수 버퍼를 통해 관리 합니다.Instead of having all the shader contants organized into a single global array you organize your constants into logical groupings and manage them through one or more constant buffers. Direct3D 9 게임을 Direct3D 11로 이식 하는 경우 적절 하 게 업데이트할 수 있도록 상수 버퍼를 구성 하는 계획을 세워야 합니다.When you port your Direct3D 9 game to Direct3D 11, plan to organize your constant buffers so that you can update them appropriately. 예를 들어 모든 프레임을 별도의 상수 버퍼로 업데이트 하지 않는 셰이더 상수를 그룹화 하 여 더 많은 동적 셰이더 상수와 함께 그래픽 어댑터에 해당 데이터를 지속적으로 업로드 하지 않아도 되도록 할 수 있습니다.For example, group shader constants that aren't updated every frame into a separate constant buffer, so that you don't have to constantly upload that data to the graphics adapter along with your more dynamic shader constants.

참고    대부분의 Direct3D 9 응용 프로그램에서는 셰이더를 광범위 하 게 사용 하지만 때때로 레거시 고정 함수 동작을 사용 하는 경우를 혼합 했습니다.Note   Most Direct3D 9 applications made extensive use of shaders, but occasionally mixed in use of the legacy fixed-function behavior. Direct3D 11은 프로그래밍 가능 음영 모델만 사용 합니다.Note that Direct3D 11 only uses a programmable shading model. Direct3D 9의 레거시 고정 함수 기능은 더 이상 사용 되지 않습니다.The legacy fixed-function features of Direct3D 9 are deprecated.