OpenGL을 활용한 그래픽스 학습 및 실험 플랫폼

최근 업데이트 2025년 12월 13일 토요일


소개

방정현

계획

컴퓨터 과학

컴퓨터 공학

프로그래밍 언어

사전

게임 개발

언리얼 엔진

수학

사이트 스크랩

활동

학습

세미나/컨퍼런스

스터디 그룹

취미

프로젝트

ProjectH

CGWithOpenGL

격변의 땅

개발 도구

Git, GitHub, GitFork

Visual Studio

프로젝트 소개

주우석 저자의 [OpenGL로 배우는 3차원 컴퓨터 그래픽스] 서적을 읽고 학습한 내용을 바탕으로 진행한 프로젝트입니다. 예제 코드를 최신의 플러그인으로 재구성하고, 설명하고, 실행 결과를 통합하여 OpenGL을 학습하고 실험할 수 있는 플랫폼을 제작합니다.

2025년 1월 2일 첫 커밋을 시작으로 2025년 12월 13일 프로젝트를 완성했습니다.

레포지터리

아래 레포지터리에서 다운로드 받을 수 있습니다. 자세한 실행 방법은 설명 파일에 담았습니다.

https://github.com/biomaticals/3DComputerGraphicWithOpenGL

시연 영상

3DCGWithOpenGL_Demo.mkv

설명

CGWithOpenGL.drawio.png

플로우 & UML

가장 먼저 하는 일은 glfw를 통해 MainWindow와 OutputWindow 라는 이름의 윈도우를 만드는 것입니다. MainWindow 아래에는 ImGui 컨텍스트와 폰트를 세팅합니다. ImGui는 멀티 윈도우를 지원하지 않기에 하나의 윈도우에서만 UI를 그리도록 했습니다. 루프 내에서 매 프레임마다 MainWindow는 UI를 그리고, OutputWindow는 gl 명령대로 그래픽을 처리합니다. MainWindow가 닫히면 프로그램은 종료합니다.

MainWindow는 3개의 UI를 그립니다. SelectorWindow는 ResourceManager를 통해 TableOfContents.txt 파일을 읽어와 중첩된 구조의 책 정보를 접이식 패널로 보여줍니다. InputWindow와 DescriptionWindow은 OutputWindow에서 넘어온 문자열을 보여줍니다.

SelectorWindow에서 각각의 코드 예제 이름으로 된 메뉴를 선택하면 해당 예제의 코드, 설명, 예제를 보여줍니다. 이 때 이전에 선택한 예제의 Code_OO_End, 새로 선택한 예제의 Code__NN_Start를 순차적으로 호출하고 매프레임 마다 Code__NN 을 호출합니다.

코드 예제는 오픈 지엘의 렌더링 파이프라인을 학습하고 사용하는 간단한 예제들과 이들을 좀 더 복잡하게 활용한 프로젝트들로 이뤄져있습니다.

라이브러리

언리얼 엔진에서 플러그인을 런타임에 로드, 언로드하는 것을 보고, 정적 라이브러리와 동적 라이브러리에 대해 학습하고 활용해봤습니다. InsideStaticMathLibrary, InsideDynamicMathLibrary, OutsideStaticMathLibrary, OutsideDynamicMathLibrary가 그것들입니다. 명시적으로 lib를 로드하거나 dll을 내보내고 함수 포인터를 불러와 호출해보았습니다.

외부 라이브러리들(ImGui, GLFW, GLM, glad, stb_image, tinyobj_loader)의 종속성을 관리하고 빌드 환경을 구축했습니다. 플랫폼간 차이, 인클루드 시 발생하는 이슈들을 처리했습니다.

매크로를 사용하여 빌드 중간과 결과물들의 경로를 명확히 구분하여 관리했습니다.

성과

3DCGWithOpenGLAccomplishment.jpg

느낀 점

DirectX12의 이론을 공부할 때에는 튜토리얼만 실습해서 실전 경험이 많지 않았습니다. 그러나 이 프로젝트를 진행하면서 단순 예제를 구현할 때, 문제가 발생해서 해결 할 때, 코드를 정리 할 때 등 여러번 되짚어 보았습니다. 그 결과 개념과 흐름이 머릿속에 훨씬 더 깊게 자리 잡는 경험을 할 수 있었습니다. 이론으로만 이해했던 부분들이 실제 코드와 연결되며 자연스럽게 체화할 수 있었습니다.

이전에 언리얼 엔진에서 삼각형을 직접 그려보는 커스텀 렌더링 패스 실습을 해봤습니다. 그래픽을 처리하는 파이프라인은 OpenGL, DirectX, 언리얼 엔진 마다 조금씩 다릅니다. 이 세 개를 접하면서 공통점과 차이점을 느꼈습니다.

OpenGL에서는 상태 기반 방식과 GLSL 방식으로 렌더링 단계를 직접 제어했고, DirectX12에서는 명령 리스트와 리소스 배리어처럼 더 저수준의 개념을 다루었습니다. 언리얼 엔진에서는 이러한 복잡한 과정을 래핑하고 개발자가 어디까지 개입할 수 있는지 확인할 수 있었습니다.

이처럼 서로 다른 세 가지 렌더링 환경을 모두 경험하면서, 그래픽스 파이프라인의 본질적인 구조는 동일하다는 점과 각 기술들이 추구하는 방향과 방식으로 구현하고 확장하는 것을 체감할 수 있었습니다. 이 프로젝트는 제가 단순히 API 사용법을 익히는 수준을 넘어 렌더링 파이프라인 자체에 대한 이해와 자신감이 크게 성장하는 계기가 되었습니다.


개발 일지

기록


E-mail : [email protected]

Phone number : (+82) 010 3902 8624