소개

OpenGL, Vulkan, DirectX는 그래픽 API(Application Programming Interface)로, 각기 다른 그래픽 하드웨어에서 실행되는 3D 응용 프로그램을 쉽게 개발할 수 있도록 돕는다. 이 장에서는 이들 API의 기본 개념과 동작 방식을 설명하고, 차이점을 비교하고, 예제 코드를 통해 이해를 돕겠다.

OpenGL

OpenGL(Open Graphics Library)은 표준화된 API로, 다양한 플랫폼과 언어에서 사용된다. 특히 게임 개발에서 많이 사용되며, 벡터 그래픽을 렌더링하는 데 주로 이용된다. 높은 호환성과 쉬운 사용성 때문에 다양한 분야에서 널리 사용된다.

기본 개념

주요 함수

예제 코드

// Vertex Shader (GLSL)
const char* vertexShaderSource = R"(
    #version 330 core
    layout(location = 0) in vec3 aPos;
    void main() {
        gl_Position = vec4(aPos, 1.0);
    }
)";

// Fragment Shader (GLSL)
const char* fragmentShaderSource = R"(
    #version 330 core
    out vec4 FragColor;
    void main() {
        FragColor = vec4(1.0, 0.5, 0.2, 1.0);
    }
)";

// C++ Code to Compile Shaders and Render
GLuint vertexShader, fragmentShader, shaderProgram;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);

fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);

shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);

glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);

Vulkan

Vulkan은 차세대 그래픽 및 컴퓨팅 API로, OpenGL에 비해 더 낮은 수준의 접근과 더 높은 성능을 제공한다. 더 많은 제어와 최적화를 가능하게 하며, 멀티스레딩에 최적화되어 있다. 이러한 이유로 고사양 게임 및 그래픽 소프트웨어에 많이 사용된다.

기본 개념

주요 함수

예제 코드

// Vulkan Instance Creation
VkInstanceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
createInfo.pApplicationInfo = &appInfo;

VkInstance instance;
vkCreateInstance(&createInfo, nullptr, &instance);

// Enumerate Physical Devices
uint32_t deviceCount = 0;
vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);
std::vector<VkPhysicalDevice> physicalDevices(deviceCount);
vkEnumeratePhysicalDevices(instance, &deviceCount, physicalDevices.data());

// Create Logical Device
VkDeviceCreateInfo deviceCreateInfo = {};
deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
// Set additional properties here

VkDevice device;
vkCreateDevice(physicalDevices[0], &deviceCreateInfo, nullptr, &device);

// Create Command Buffer
VkCommandBufferAllocateInfo allocInfo = {};
allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
allocInfo.commandPool = commandPool;
allocInfo.commandBufferCount = 1;

VkCommandBuffer commandBuffer;
vkAllocateCommandBuffers(device, &allocInfo, &commandBuffer);

DirectX

DirectX는 마이크로소프트에서 개발한 API로, 주로 윈도우 플랫폼에서 사용된다. Direct3D는 DirectX의 하위 컴포넌트로, 특히 3D 그래픽 렌더링을 위한 API이다. DirectX 12는 멀티스레드 성능을 향상시키고 하드웨어 접근 제어를 더 세밀하게 하는 등 많은 기능을 추가로 제공하였다.

기본 개념

주요 함수

예제 코드

// DirectX 12 Device and Swap Chain Creation
ComPtr<ID3D12Device> device;
D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device));

ComPtr<ID3D12CommandQueue> commandQueue;
D3D12_COMMAND_QUEUE_DESC queueDesc = {};
queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&commandQueue));

DXGI_SWAP_CHAIN_DESC swapChainDesc = {};
swapChainDesc.BufferCount = 2;
swapChainDesc.BufferDesc.Width = 800;
swapChainDesc.BufferDesc.Height = 600;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
swapChainDesc.OutputWindow = hwnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.Windowed = TRUE;

ComPtr<IDXGISwapChain> swapChain;
dxgiFactory->CreateSwapChain(commandQueue.Get(), &swapChainDesc, &swapChain);

비교

각 그래픽 API는 고유의 장점과 단점을 갖는다.

이처럼 각 API는 특정 용도나 환경에서 더 나은 성능을 제공한다. 개발자는 특정 프로젝트의 요구사항과 개발 환경을 고려하여 적합한 API를 선택해야 한다.


이 장에서는 OpenGL, Vulkan, DirectX의 기본 개념과 주요 함수, 그리고 간단한 예제 코드를 통해 각 API의 특징을 설명하였다. 각각의 그래픽 API는 그 나름의 장점과 단점을 가지며, 개발자는 이를 통해 다양한 요구사항을 충족시키는 최적의 솔루션을 찾아야 한다. 책의 다른 장과 함께 이 장의 내용을 활용하여 더 깊이 있는 그래픽 프로그래밍을 탐구해 보시길 바란다.