Normal Render API

Normal Engine이 추구하는 장기적인 목표는 멀티플랫폼에서 동작하는 엔진입니다. 그러므로 각각의 그래픽 API에 종속되지 않도록 자체적인 렌더링 API를 구현해야 합니다. 이 솔루션의 장점은 특정 그래픽 API에 의존적이지 않다는 장점이 있습니다. 하지만 그래픽 API를 직접 하드코딩해서 작성하는 것보다는 추상화 단계가 하나 더 늘어나기 때문에, 속도가 아무래도 더 느릴 수 밖에 없습니다. 저는 차후에 API가 변경될 가능성이 있기 때문에, 특별히 API를 변경해도 코어 내부의 코드가 동작하는데 문제가 없도록 하드코딩을 최대한 지양하는 방향으로 진행하려고 합니다.

 

Vertex Buffer 및 Index Buffer

코드는 프로젝트를 진행함에 따라서 앞으로 구조가 바뀔 수도 있습니다. 이 두 클래스는 각 그래픽 API에 맞는 인터페이스 역할을 하기 때문에, 특별한 내부 구현이 없습니다. 생성자를 Protected로 감춘 이유는 외부로 부터 지역 변수로 생성되는 상황을 사전에 방지하기 위함입니다. 하지만, 스마트 포인터의 std::make_unique 등 함수로 생성해버리는 방식은 사전에 예방이 어렵습니다.

  • virtual Bind() const = 0
    등록된 Data를 Buffer에 바인딩합니다.
  • virtual UnBind() const = 0
    등록된 Data를 비웁니다. (삭제되진 않습니다.)
  • static Create( ~~ )
    각각에 맞는 Buffer를 생성해서 Return합니다.

위는 현재 활성화된 그래픽 API 종류에 맞게 특정 Buffer를 생성하는 방식입니다. 이외에 Shader, Context, VertexArray, Layout등 모두 구현되는 방식은 동일합니다.

 

다음 처럼 Vertex Data를 생성한 후 Create 함수를 통해 각 API에 맞는 Vertex Buffer를 생성할 수 있습니다.

 

코드 컨벤션 개선

#include "Nrpch.h"
#include "ImGuiLevel.h"

#include <Normal/Core/Application.h>
#include <Normal/Core/Window.h>

소스파일 및 헤더파일이 같은 폴더 디렉토리에 있을 경우는 " " 괄호로 Include하고, 외부 디렉토리에 존재하는 .h,cpp 파일일 경우 <> 꺽쇠 괄호를 사용하도록 컨벤션을 수정하였습니다.