OpenGL ES 2.0에서 Direct3D로 포트 계획Plan your port from OpenGL ES 2.0 to Direct3D

중요 APIImportant APIs

IOS 또는 Android 플랫폼에서 게임을 이식 하는 경우 OpenGL ES 2.0에 상당한 투자가 발생 했을 것입니다.If you are porting a game from the iOS or Android platforms, you have probably made a significant investment in OpenGL ES 2.0. 그래픽 파이프라인 코드 베이스를 Direct3D 11 및 Windows 런타임로 이동 하기 위해 준비 하는 경우 시작 하기 전에 몇 가지 사항을 고려해 야 합니다.When preparing to move your graphics pipeline codebase to Direct3D 11 and the Windows Runtime, there are a few things you should consider before you start.

대부분의 포팅 활동은 일반적으로 코드 베이스를 탐색 하 고 두 모델 간에 공통 Api 및 패턴을 매핑합니다.Most porting efforts usually involving initially walking the codebase and mapping common APIs and patterns between the two models. 이 항목을 읽고 검토 하는 데 시간이 오래 걸리는 경우이 프로세스를 조금 더 쉽게 찾을 수 있습니다.You'll find this process a bit easier if you take some time to read and review this topic.

OpenGL ES 2.0에서 Direct3D 11로 그래픽을 이식할 때 알아야 할 몇 가지 사항은 다음과 같습니다.Here are some things to be aware of when porting graphics from OpenGL ES 2.0 to Direct3D 11.

특정 OpenGL ES 2.0 공급자에 대 한 참고 사항Notes on specific OpenGL ES 2.0 providers

이 섹션의 포팅 항목에서는 Khronos 그룹에서 만든 OpenGL ES 2.0 사양의 Windows 구현을 참조 합니다.The porting topics in this section reference the Windows implementation of the OpenGL ES 2.0 specification created by the Khronos Group. 모든 OpenGL ES 2.0 코드 샘플은 Visual Studio 2012 및 기본 Windows C 구문을 사용 하 여 개발 되었습니다.All OpenGL ES 2.0 code samples were developed using Visual Studio 2012 and basic Windows C syntax. 목적-C (iOS) 또는 Java (Android) 코드 베이스에서 제공 되는 경우 제공 된 OpenGL ES 2.0 코드 샘플은 유사한 API 호출 구문 또는 매개 변수를 사용 하지 않을 수 있습니다.If you are coming from an Objective-C (iOS) or Java (Android) codebase, be aware that the provided OpenGL ES 2.0 code samples may not use similar API calling syntax or parameters. 이 지침은 플랫폼을 최대한 독립적으로 유지 하려고 시도 합니다.This guidance tries to stay as platform agnostic as possible.

이 설명서에서는 OpenGL ES 코드 및 참조에 대해서만 2.0 사양 Api를 사용 합니다.This documentation only uses the 2.0 specification APIs for the OpenGL ES code and reference. OpenGL ES 1.1 또는 3.0에서 이식 하는 경우 일부 OpenGL ES 2.0 코드 예제 및 컨텍스트가 익숙하지 않을 수 있지만이 콘텐츠는 여전히 유용 합니다.If you are porting from OpenGL ES 1.1 or 3.0, this content can still prove useful, although some of the OpenGL ES 2.0 code examples and context may be unfamiliar.

이러한 항목의 Direct3D 11 샘플은 CX (구성 요소 확장)와 함께 Microsoft Windows c + +를 사용 합니다.The Direct3D 11 samples in these topics use Microsoft Windows C++ with Component Extensions (CX). 이 버전의 c + + 구문에 대 한 자세한 내용은 Visual C++, 런타임 플랫폼용 구성 요소 확장빠른 참조 (c + + \ CX)를 참조하세요.For more info on this version of the C++ syntax, read Visual C++, Component Extensions for Runtime Platforms, and Quick Reference (C++\CX).

하드웨어 요구 사항 및 리소스 이해Understand your hardware requirements and resources

OpenGL ES 2.0에서 지원 되는 그래픽 처리 기능 집합은 Direct3D 9.1에서 제공 되는 기능에 약 매핑됩니다.The set of graphics processing features supported by OpenGL ES 2.0 roughly maps to the features provided in Direct3D 9.1. Direct3D 11에서 제공 되는 고급 기능을 활용 하려면 포트를 계획할 때 direct3d 11 설명서를 검토 하거나, 초기 노력으로 완료 된 경우 에는 DirectX 9에서 유니버설 Windows 플랫폼 (UWP) 항목의 포트를 검토 하세요.If you want to take advantage of the more advanced features provided in Direct3D 11, review the Direct3D 11 documentation when planning your port, or review the Port from DirectX 9 to Universal Windows Platform (UWP) topics when you're done with the initial effort.

초기 포팅 작업을 간단 하 게 하려면 Visual Studio Direct3D 템플릿부터 시작 합니다.To make your initial porting effort simple, start with a Visual Studio Direct3D template. 이 도구는 이미 구성 된 기본 렌더러를 제공 하며, 창 변경 및 Direct3D 기능 수준에서 리소스를 다시 만드는 것과 같은 UWP 앱 기능을 지원 합니다.It provides a basic renderer already configured for you, and supports UWP app features like recreating resources on window changes and Direct3D feature levels.

Direct3D 기능 수준 이해Understand Direct3D feature levels

Direct3D 11은 _ 11 1 (direct3d 9.1)의 하드웨어 "기능 수준"에 대 한 지원을 제공 _ 합니다.Direct3D 11 provides support for hardware "feature levels" from 9_1 (Direct3D 9.1) for 11_1. 이러한 기능 수준은 특정 그래픽 기능 및 리소스의 가용성을 표시 합니다.These feature levels indicate the availability of certain graphics features and resources. 일반적으로 대부분의 OpenGL ES 2.0 플랫폼은 Direct3D 9.1 (기능 수준 9 _ 1) 기능 집합을 지원 합니다.Typically, most OpenGL ES 2.0 platforms support a Direct3D 9.1 (feature level 9_1) set of features.

DirectX 그래픽 기능 및 Api 검토Review DirectX graphics features and APIs

API 제품군API Family DescriptionDescription
DXGIDXGI DXGI (DirectX Graphics Infrastructure)는 그래픽 하드웨어와 Direct3D 간의 인터페이스를 제공 합니다.The DirectX Graphics Infrastructure (DXGI) provides an interface between the graphics hardware and Direct3D. Idxgid 어댑터IDXGIDevice1 COM 인터페이스를 사용 하 여 장치 어댑터 및 하드웨어 구성을 설정 합니다.It sets the device adapter and hardware configuration using the IDXGIAdapter and IDXGIDevice1 COM interfaces. 버퍼 및 기타 창 리소스를 만들고 구성 하는 데 사용 합니다.Use it to create and configure your buffers and other window resources. 특히 IDXGIFactory2 factory 패턴은 스왑 체인 (프레임 버퍼 집합)을 포함 하 여 그래픽 리소스를 가져오는 데 사용 됩니다.Notably, the IDXGIFactory2 factory pattern iis used to acquire the graphics resources, including the swap chain (a set of frame buffers). DXGI는 스왑 체인을 소유 하므로 IDXGISwapChain1 인터페이스를 사용 하 여 화면에 프레임을 표시 합니다.Since DXGI owns the swap chain, the IDXGISwapChain1 interface is used to present frames to the screen.
Direct3DDirect3D Direct3D는 그래픽 인터페이스의 가상 표현을 제공 하 고이를 사용 하 여 그래픽을 그릴 수 있도록 하는 Api 집합입니다.Direct3D is the set of APIs that provide a virtual representation of the graphics interface and allow you to draw graphics using it. 버전 11은 거의 비교할 수 있는 기능, 즉 OpenGL 4.3에 대 한 것입니다.Version 11, is roughly comparable, feature-wise, to OpenGL 4.3. 반면에 OpenGL ES 2.0은 DirectX9, 기능 및 OpenGL 2.0과 비슷하지만 OpenGL 3.0의 통합 셰이더 파이프라인을 사용 합니다. 대부분의 많은 리프트는 개별 리소스 및 하위 리소스에 대 한 액세스를 제공 하는 ID3D11Device1 및 ID3D11DeviceContext1 인터페이스를 사용 하 여 수행 됩니다.(OpenGL ES 2.0, on the other hand, is similar to DirectX9, feature-wise, and OpenGL 2.0, but with OpenGL 3.0's unified shader pipeline.) Most of the heavy lifting is done with the ID3D11Device1 and ID3D11DeviceContext1 interfaces which provide access to individual resources and subresources, and the rendering context, respectively.
Direct2DDirect2D Direct2D는 GPU 가속 2D 렌더링을 위한 Api 집합을 제공 합니다.Direct2D provides a set of APIs for GPU-accelerated 2D rendering. OpenVG와 유사한 방식으로 간주할 수 있습니다.It can be considered similar in purpose to OpenVG.
DirectWriteDirectWrite DirectWrite는 GPU 가속 고품질 글꼴 렌더링을 위한 Api 집합을 제공 합니다.DirectWrite provides a set of APIs for GPU-accelerated, high-quality font rendering.
DirectXMathDirectXMath DirectXMath는 일반적인 선형 대 수 및 삼각 형식, 값 및 함수를 처리 하기 위한 Api 및 매크로 집합을 제공 합니다.DirectXMath provides a set of APIs and macros for handling common linear algebra and trigonometric types, values, and functions. 이러한 형식 및 함수는 Direct3D 및 해당 셰이더 작업에서 잘 작동 하도록 디자인 되었습니다.These types and functions are designed to work well with Direct3D and its shader operations.
DirectX HLSLDirectX HLSL Direct3D 셰이더에서 사용 되는 현재 HLSL 구문입니다.The current HLSL syntax used by Direct3D shaders. Direct3D 셰이더 모델 5.0을 구현 합니다.It implements Direct3D Shader Model 5.0.

 

Windows 런타임 Api 및 템플릿 라이브러리 검토Review the Windows Runtime APIs and template library

Windows 런타임 Api는 UWP 앱에 대 한 전체 인프라를 제공 합니다.The Windows Runtime APIs provide the overall infrastructure for UWP apps. 여기에서 검토 하세요.Review them here.

그래픽 파이프라인 포팅에 사용 되는 키 Windows 런타임 Api는 다음과 같습니다.Key Windows Runtime APIs used in porting your graphics pipeline include:

또한 Windows 런타임 c + + 템플릿 라이브러리 (WRL)는 Windows 런타임 구성 요소를 작성 하 고 사용 하는 하위 수준 방법을 제공 하는 템플릿 라이브러리입니다.Additionally, the Windows Runtime C++ Template Library (WRL) is a template library that provides a low-level way to author and use Windows Runtime components. UWP 앱 용 Direct3D 11 Api는 접속사에서 스마트 포인터 (ComPtr)와 같은이 라이브러리의 인터페이스 및 형식과 함께 사용 하는 것이 가장 좋습니다.The Direct3D 11 APIs for UWP apps are best used in conjunctions with the interfaces and types in this library, such as smart pointers (ComPtr). WRL에 대 한 자세한 내용은 c + + 템플릿 라이브러리 Windows 런타임 (WRL)를 참조 하세요.For more info on the WRL, read Windows Runtime C++ Template Library (WRL).

좌표계 변경Change your coordinate system

초기 포팅 작업에서 혼란을 일으키는 한 가지 차이점은 OpenGL의 경우 전통적인 오른손 좌표계를 사용하는 반면, Direct3D의 경우 기본적으로 왼손 좌표계를 사용한다는 점입니다.One difference that sometimes confuses early port efforts is the change from OpenGL's traditional right-handed coordinate system to Direct3D's default left-handed coordinate system. 이와 같이 좌표 모델링의 이러한 변화는 꼭 짓 점 버퍼의 설정 및 구성에서 많은 행렬 수학 함수에 이르기까지 게임의 많은 부분에 영향을 줍니다.This change in coordinate modeling affects many parts of your game, from the setup and configuration of your vertex buffers to many of your matrix math functions. 가장 중요 한 두 가지 변경 내용은 다음과 같습니다.The two most important changes to make are:

  • Direct3D가 앞에서 시계 방향으로 이동 하도록 삼각형 꼭 짓 점의 순서를 대칭 이동 합니다.Flip the order of triangle vertices so that Direct3D traverses them clockwise from the front. 예를 들어 꼭 짓 점이 OpenGL 파이프라인에서 0, 1, 2로 인덱싱되는 경우 대신 0, 2, 1로 Direct3D에 전달 합니다.For example, if your vertices are indexed as 0, 1, and 2 in your OpenGL pipeline, pass them to Direct3D as 0, 2, 1 instead.
  • 뷰 매트릭스를 사용 하 여 z 방향으로 세계 공간을 x 1.0 f로 확장 하 여 z 축 좌표를 효과적으로 반대로 합니다.Use the view matrix to scale world space by -1.0f in the z direction, effectively reversing the z-axis coordinates. 이렇게 하려면 뷰 매트릭스에서 M31, M32-16ms 및 M33 위치에 있는 값의 부호를 대칭 이동 합니다 ( 행렬 형식으로 이식 하는 경우).To do this, flip the sign of the values at positions M31, M32, and M33 in your view matrix (when porting it to the Matrix type). M34가 0이 아닌 경우에는 해당 부호도 전환 합니다.If M34 is not 0, flip its sign as well.

그러나 Direct3D는 오른손 좌표계를 지원할 수 있습니다.However, Direct3D can support a right-handed coordinate system. DirectXMath는 왼손 및 오른손 좌표계에서 작동 하는 다양 한 함수를 제공 합니다.DirectXMath provides a number of functions that operate on and across both left-handed and right-handed coordinate systems. 이러한 작업을 사용 하 여 원래 메시 데이터 및 matrix 처리를 유지할 수 있습니다.They can be used to preserve some of your original mesh data and matrix processing. 다음과 같은 변경 내용이 해당됩니다.They include:

DirectXMath 행렬 함수DirectXMath matrix function DescriptionDescription
XMMatrixLookAtLHXMMatrixLookAtLH 카메라 위치, 위쪽 방향 및 초점을 사용 하 여 왼손 좌표계의 뷰 행렬을 작성 합니다.Builds a view matrix for a left-handed coordinate system using a camera position, an up direction, and a focal point.
XMMatrixLookAtRHXMMatrixLookAtRH 카메라 위치, 위쪽 방향 및 초점을 사용 하 여 오른손 좌표계의 뷰 행렬을 작성 합니다.Builds a view matrix for a right-handed coordinate system using a camera position, an up direction, and a focal point.
XMMatrixLookToLHXMMatrixLookToLH 카메라 위치, 위쪽 방향 및 카메라 방향을 사용 하 여 왼손 좌표 시스템에 대 한 뷰 행렬을 작성 합니다.Builds a view matrix for a left-handed coordinate system using a camera position, an up direction, and a camera direction.
XMMatrixLookToRHXMMatrixLookToRH 카메라 위치, 위쪽 방향 및 카메라 방향을 사용 하 여 오른손 좌표계의 뷰 행렬을 작성 합니다.Builds a view matrix for a right-handed coordinate system using a camera position, an up direction, and a camera direction.
XMMatrixOrthographicLHXMMatrixOrthographicLH 왼쪽 좌표 시스템에 대 한 직교 프로젝션 행렬을 만듭니다.Builds an orthogonal projection matrix for a left-handed coordinate system.
XMMatrixOrthographicOffCenterLHXMMatrixOrthographicOffCenterLH 왼쪽 좌표 시스템에 대 한 사용자 지정 직교 투영 행렬을 만듭니다.Builds a custom orthogonal projection matrix for a left-handed coordinate system.
XMMatrixOrthographicOffCenterRHXMMatrixOrthographicOffCenterRH 오른손 좌표계에 대 한 사용자 지정 직교 투영 행렬을 만듭니다.Builds a custom orthogonal projection matrix for a right-handed coordinate system.
XMMatrixOrthographicRHXMMatrixOrthographicRH 오른손 좌표계에 대 한 직교 프로젝션 행렬을 만듭니다.Builds an orthogonal projection matrix for a right-handed coordinate system.
XMMatrixPerspectiveFovLHXMMatrixPerspectiveFovLH 뷰의 필드를 기반으로 왼쪽 원근 투영 행렬을 만듭니다.Builds a left-handed perspective projection matrix based on a field of view.
XMMatrixPerspectiveFovRHXMMatrixPerspectiveFovRH 뷰의 필드를 기반으로 하는 오른쪽 원근 투영 행렬을 만듭니다.Builds a right-handed perspective projection matrix based on a field of view.
XMMatrixPerspectiveLHXMMatrixPerspectiveLH 왼쪽 원근 투영 행렬을 만듭니다.Builds a left-handed perspective projection matrix.
XMMatrixPerspectiveOffCenterLHXMMatrixPerspectiveOffCenterLH 왼쪽 원근 투영 행렬의 사용자 지정 버전을 빌드합니다.Builds a custom version of a left-handed perspective projection matrix.
XMMatrixPerspectiveOffCenterRHXMMatrixPerspectiveOffCenterRH 오른쪽 원근 투영 행렬의 사용자 지정 버전을 빌드합니다.Builds a custom version of a right-handed perspective projection matrix.
XMMatrixPerspectiveRHXMMatrixPerspectiveRH 오른쪽 원근 투영 행렬을 만듭니다.Builds a right-handed perspective projection matrix.

 

OpenGL ES 2.0-Direct3D 11 포팅 faq (질문과 대답)OpenGL ES2.0-to-Direct3D 11 porting Frequently Asked Questions

  • 질문: "일반적으로 내 OpenGL 코드에서 특정 문자열이 나 패턴을 검색 하 고이를 해당 하는 Direct3D로 바꿀 수 있나요?"Question: "In general, can I search for certain strings or patterns in my OpenGL code and replace them with the Direct3D equivalents?"
  • 답변: 아니요.Answer: No. OpenGL ES 2.0 및 Direct3D 11은 다양 한 그래픽 파이프라인 모델 세대에서 제공 됩니다.OpenGL ES 2.0 and Direct3D 11 come from different generations of graphics pipeline modeling. 렌더링 컨텍스트 및 셰이더의 인스턴스화와 같이 개념 및 Api 사이에는 몇 가지 표면 유사점이 있지만,이 지침과 Direct3D 11 참조를 검토 하 여 일대일 매핑을 시도 하는 대신 파이프라인을 다시 만들 때 최상의 선택을 할 수 있습니다.While there are some surface similarities between concepts and APIs, such as the rendering context and the instancing of shaders, you should review this guidance as well as the Direct3D 11 reference so you can make the best choices when recreating your pipeline instead of attempting a 1-to-1 mapping. 그러나가 중 SL에서 HLSL로 이식 하는 경우, intrinsincs 및 함수에 대 한 일반적인 별칭 집합을 만들면 더 쉽게 이식할 수 있으며,이를 통해 셰이더 코드 파일의 집합을 하나만 유지할 수 있습니다.However, if you are porting from GLSL to HLSL, creating a set of common aliases for GLSL variables, intrinsincs, and functions can not only make porting easier, it allows you to maintain only one set of shader code files.