간단한 OpenGL ES 2.0 렌더러를 Direct3D 11로 포팅
이 포팅 연습에서는 Visual Studio 2015의 DirectX 11 앱(유니버설 Windows) 템플릿과 일치할 수 있도록 OpenGL ES 2.0에서 Direct3D로 회전하는 꼭짓점 음영 큐브에 대한 간단한 렌더러를 가져오는 기본 사항부터 시작합니다. 이 포트 프로세스를 살펴보면서 다음을 알아봅니다.
- 간단한 꼭짓점 버퍼 집합을 Direct3D 입력 버퍼로 포팅하는 방법
- 상수 버퍼에 유니폼 및 특성을 포팅하는 방법
- Direct3D 셰이더 개체를 구성하는 방법
- Direct3D 셰이더 개발에 기본 HLSL 의미 체계를 사용하는 방법
- 매우 간단한 GLSL을 HLSL로 포팅하는 방법
이 토픽은 새 DirectX 11 프로젝트를 생성한 후에 시작됩니다. 새 DirectX 11 프로젝트를 생성하는 방법을 알아보려면 UWP(유니버설 Windows 플랫폼)을 위한 새 DirectX 11 프로젝트 생성을 참조하세요.
이러한 링크 중 하나에서 만든 프로젝트에는 Direct3D 인프라에 대한 모든 코드가 준비되어 있으며, 렌더러를 Open GL ES 2.0에서 Direct3D 11로 포팅하는 프로세스를 즉시 시작할 수 있습니다.
이 토픽에서는 동일한 기본 그래픽 작업을 수행하는 두 코드 경로(창에서 회전하는 꼭짓점 음영 큐브 표시)를 안내합니다. 두 경우 모두에서 코드는 다음 프로세스를 다룹니다.
- 하드 코딩된 데이터에서 큐브 메시 생성. 이 메시는 각 꼭짓점이 위치, 일반 벡터, 색 벡터를 포함하는 꼭짓점 목록으로 표시됩니다. 이 메시는 셰이딩 파이프라인이 처리할 꼭짓점 버퍼에 배치됩니다.
- 큐브 메시를 처리하는 셰이더 개체 생성. 래스터화를 위해 꼭짓점을 처리하는 꼭짓점 셰이더와 래스터화 이후 큐브의 개별 픽셀에 색을 지정하는 조각(픽셀) 셰이더의 두 셰이더가 있습니다. 이러한 픽셀은 표시를 위해 렌더링 대상에 기록됩니다.
- 각각 꼭짓점 및 조각 셰이더에서 꼭짓점 및 픽셀 처리에 사용되는 음영 언어를 형성합니다.
- 렌더링된 큐브를 화면에 표시.
이 연습을 완료하면 다음과 같은 Open GL ES 2.0와 Direct3D 11 간의 기본적인 차이점을 잘 알고 있어야 합니다.
- 꼭짓점 버퍼 및 꼭짓점 데이터의 표현.
- 셰이더를 생성하고 구성하는 프로세스.
- 셰이더 개체에 대한 언어 및 입력 및 출력을 음영 처리합니다.
- 화면 그리기 동작.
이 연습에서는 다음과 같이 정의된 단순하고 일반적인 OpenGL 렌더러 구조를 참조합니다.
typedef struct
{
GLfloat pos[3];
GLfloat rgba[4];
} Vertex;
typedef struct
{
// Integer handle to the shader program object.
GLuint programObject;
// The vertex and index buffers
GLuint vertexBuffer;
GLuint indexBuffer;
// Handle to the location of model-view-projection matrix uniform
GLint mvpLoc;
// Vertex and index data
Vertex *vertices;
GLuint *vertexIndices;
int numIndices;
// Rotation angle used for animation
GLfloat angle;
GLfloat mvpMatrix[4][4]; // the model-view-projection matrix itself
} Renderer;
이 구조에는 하나의 인스턴스가 있으며 매우 간단한 꼭짓점 음영 메시를 렌더링하는 데 필요한 모든 구성 요소가 포함되어 있습니다.
참고 이 항목의 OpenGL ES 2.0 코드는 Khronos 그룹에서 제공하는 Windows API 구현을 기반으로 하며 Windows C 프로그래밍 구문을 사용합니다.
알아야 하는 작업
기술
- Microsoft Visual C++
- OpenGL ES 2.0
필수 조건
- 선택 사항. EGL 코드를 DXGI 및 Direct3D로 포팅을 검토합니다. DirectX에서 제공하는 그래픽 인터페이스를 더 잘 이해하려면 이 항목을 참조하세요.
단계
항목 | 설명 |
---|---|
OpenGL ES 2.0에서 간단한 렌더러를 포팅할 경우, 첫 번째 단계는 Direct3D 11에서 동등한 꼭짓점 및 조각 셰이더 개체를 설정하고 기본 프로그램이 컴파일된 후 셰이더 개체와 통신할 수 있게 하는 것입니다. |
|
이 단계에서는 메시를 포함할 꼭짓점 버퍼와 셰이더가 지정된 순서로 꼭짓점을 트래버스할 수 있게 하는 인덱스 버퍼를 정의합니다. |
|
버퍼 및 셰이더 개체를 생성하고 구성하는 코드를 이동한 후에는 OpenGL ES 2.0의 GLSL(GL 셰이더 언어)에서 Direct3D 11의 HLSL(High-Level Shader Language)로 해당 셰이더 내의 코드를 포팅해야 합니다. |
|
마지막으로 회전하는 큐브를 화면에 그리는 코드를 포팅합니다. |
추가 리소스