00. OpenGL 소개와 주의사항
목차
- OpenGL이란
- 2026년에 GL을 배워야 하는가?
- 알아야 할 사전지식
- 게시할 내용 정리
- 방향성과 여담
OpenGL이란
OpenGL(이하 GL)은 3D그래픽스 출력을 위한 규격 중 하나로, 1992년에 처음 발표되어
현재 2026년까지 30년동안 사용되어 왔습니다.
역사가 역사다 보니, 버전이 올라가면서 추가되고 삭제된 기능들이 많은 데다가
그 수많은 기능이 그래픽스 드라이버마다 다르게 구현되어 있습니다.
(그 때문에 특정 플랫폼 / 그래픽카드 / 버전에서만 특수적으로 해주어야 하는 것들이 가끔씩 있습니다.)
OpenGL이 담당하는 것은, GPU를 통한 화면 위에 무언가를 빠르게 그리기 위한
일련의 과정을 추상화하는 것입니다.
또한 Compute Shader라는 기능도 있어서, 사용자가 GPU를 마음대로 접근할 수 있도록 하기도 합니다.
2026년에 GL을 배워야 하는가?
GL은 첫 등장부터 30년이나 지난 오래된 규격이지만,
적어도 그래픽스에 관심을 가지고 깊게 파보고 싶다면 배워야 합니다.
이유는 다음과 같습니다.
-
Vulkan / DirectX 12 같은 최신 API를 배우기 전에 적어도 맛보기 식으로라도 배워보면 큰 도움이 된다.
-
최신 API 대신 OpenGL을 쓴다고 해서 AAA게임 정도 스케일이 아니라면, 성능 면에서 손해 보는 건 딱히 없다.
-
Vulkan에 비해서, GL로 개발 시 상대적으로 새로운 기능 / 기술들을 구현하기가 매우 간단하다.
OpenGL이 특정 그래픽스 드라이버에서 deprecated 된다던지 말이 많지만,
사실 현재 사용되는 게임 엔진들에도 GL이 쓰이는 경우가 꽤나 있습니다.
예를 들면 SDL을 기반으로 만든 Pygame도 그래픽스 확장으로 GL을 사용하고,
Love2D 나 Cocos2D, Godot 도 특정 버전에서는 오직 GL만을 지원했습니다.
유명 인디게임 아이작의 번제 : 리버스의 경우에도 2026년 지금까지 OpenGL로 작동하는 자체 엔진을 사용합니다.
특히 안드로이드의 경우, Vulkan은 아직 버전에 따른 호환성이 떨어지고, 기기에 따른 특수화도 무시 못할 수준이라 아직까지는 OpenGL을 유지시키는 경우가 많다고 합니다.
알아야 할 사전지식
- C++ 중급 (객체지향, 상속, STL)
- 선형대수학 기초 (벡터와 행렬)
- IDE에 따른 라이브러리 세팅
게시할 내용 정리
- 개발환경 세팅과 윈도우 열기
- 삼각형 그리기 (VA, 정점 버퍼, 인덱스 버퍼, 셰이더 프로그램)
- 윈도우 입력과 OpenGL에서의 멀티스레딩(Fence와 CPU-GPU 동기화)
- 좌표계와 WVP행렬(월드 행렬, 뷰 행렬, 투영 행렬, 2D 렌더러의 구현)
- 텍스쳐의 사용
- 중간점검 : 클래스 구현 완성시키기
- 3D로의 확장(WVP를 3D로 확장구현, 뎁스 테스트, 백페이스컬링)
- 3D카메라와 쿼터니언
- 스카이박스의 구현
- 3D에서의 기본 셰이딩 기법 (Phong, Blinn-Phong, Half-Lambert, Flat, Gouraud, Cel)
- 3D에서의 라이팅 (Point / Directional / Spot)
- 3D에서의 심화 라이팅 (TBN 행렬, Specular, Normal, Displacement)
- 프레임버퍼와 렌더버퍼, 첨부물 이해 (+ SRGB / UNORM 색공간, GL_FRAMEBUFFER_SRGB, GLFW_SRGB 관련, 첨부물 없이 렌더링)
- HDR 버퍼와 톤매퍼 사용 + .hdr 파일로 큐브맵 텍스쳐 구성하기 (톤매퍼 여러개, 감마 보정, Equirectangular 텍스쳐)
- MSAA 설정하기 (+MSAA resolving fbo Blit으로 resolve, sampler2DMS & texelFetch로 resolve, glEnable(GL_MULTISAMPLE), glEnable(GL_SAMPLE_COVERAGE), glSampleCoverage, gl_SampleMask)
- 중간점검 : OpenGL 렌더링 상태 이해하기 (뎁스, 스텐실, 시저 테스트 + 블렌딩 + 컬러 마스크)
- 셰도우 매핑과 Sampler(Point / Directional / Spot, PCF, PCSS, glCreateSamplers)
- 모델 로딩
- UBO와 인스턴싱
- 배치 렌더링
- 기하 셰이더 (geom, 법선 시각화)
- 테셀레이션 셰이더 (tessCtrl, tessEval)
- 버퍼 매핑 (glMapBuffer / glMapBuffer)과 버퍼 무효화(glInvalidate*)
- TBO (텍스쳐 버퍼), PBO (픽셀 팩 / 언팩 버퍼)
- 빌보드 렌더링
- 스텐실 테스트와 아웃라인 렌더링
- 마우스 피킹 (스텐실버퍼, 언프로젝션)
- Planar Reflection / Refraction 렌더링
- HDR 이미지와 Skybox 확장
- 환경 매핑 / 동적 환경 매핑
- 디퍼드 렌더러의 구현
- Normal 채널 패킹하기
- Z-Prepass 추가하기
- Forward Pass 추가하기
- 물리 기반 렌더링
- 이미지 기반 라이팅 (조도 맵, BRDF 룩업 테이블, PreFilter 맵)
- Bloom 의 구현과 Emmisive Mapping (Mip Chain, ComputeShader, Bloom Dirt, + Horizontal/Vertical Bloom)
- SSAO 의 구현
- 스켈레탈 애니메이션 (스키닝. bone, boneWeight)
- 텍스트 렌더링 - 비트맵
- 텍스트 렌더링 - MSDF (+outline, glow, shadow 효과)
- AreaLight 의 구현 (LTC, Circle, Rect, Cylinder)
- 고급 그림자 기법 - CSM (Casacades, 여러 분할방법 설명)
- 고급 그림자 기법 - VSM
- 고급 그림자 기법 - PSM (Perspective Shadow Map, 기존 SSM(standard shadow map)을 보완하기!)
- 기타 그림자 기법 - Stencil Shadow Volume, Screen-Space Shadow
- Z-Fighting 줄이기
- SSR
- GodRay의 구현 (SSGR, Radial Blur)
- 렌즈 플레어의 구현
- Water 렌더링 - (PlanarReflection + SSR, DuDv)
- Water 렌더링 - 상호작용하기
- Water 렌더링 - Caustics
- Grass 렌더링
- Atmospheric Scattering
- Volumetric Fog
- Depth Peeling (N개패스 - N개 레이어까지만 depth를 저장, minDepth & maxDepth, ++Dual Depth Peeling)
- Order-Independent Transparency (PPLL, Fragment linked list 및 근사 Weighted OIT, accum&reveal Buffer)
- HBAO+
- 컬링 - 절두체, Octree
- 컬링 - BSP
- Compute Shader와 SSBO
- Occlusion Query / 컨디셔널 렌더링 (glBeginConditionalRender, glQuery+GL_SAMPLE_PASSED)
- GPU-Driven 렌더링 - Multi Draw Indirect(MDI), Frustrum Culling in C.S, SSBO, atomicCounter
- GPU-Driven 렌더링 2 - HZB, Meshlet
- Bindless Texture 확장 (텍스쳐 핸들, MakeResident)
- Global Illumination의 개요
- Voxel GI
- Tile-Based Shading & Clustered Shading (2D분할 & 3D분할 선택적 조명 계산)
- Forward+ Rendering
- VRS (Variable Rate Shading, 구간마다 셰이딩 품질 다르게)
- SurfelGI
- 모션 블러 (Velocity Mapping, Camera Cut 무시)
- 안티 에일리어싱 - FXAA
- 안티 에일리어싱 - TAA
- Auto Exposure (Downsample chaining, + Bloom interaction)
- 정점 압축기법
- DoF
- SSS (Sub-Surface Scattering)
- 데칼 렌더링 (Projected Texture, Deferred Decal)
- Fur Rendering ( Kajiya-Kay 모델)
- Dynamic LoD (a.k.a. Terrain w. Tessellation)
- 청크 로딩 시스템 (마인크래프트)
- GPU 가속 (ComputeShader) 파티클 시스템과 Transform Feedback (트랜스폼 피드백, TFBO)
- 포인트 스프라이트 (Point Sprite) 사용하기
- 포탈 렌더링 (그래픽 부분만, 중력 적용같은 물리는 나중에)
- 구면조화함수 적용하기
- 비디오 재생 (FFmpeg, miniaudio)
- Mesh Shader 기능
- 씬 그래프 (SceneGraph / model <-> world transform)
- Wave Intrinsics (gpu 병렬연산)
- RayTracing 맛보기 + RTAO
- 패스 트레이싱 기초 (MIS)
번외
- OpenGL 디버깅 메신저 사용하기 (glDebugMessenger)
- 렌더독(RenderDoc) 사용하기, (glObjectLabel, glPushDebugGroup 등..)
- SPIR-V 컴파일러 사용하기 (GLSL / HLSL 상호 컴파일하기)
- SLang 사용하기 (Slang -> GLSL / HLSL)
- ktx 사용하기 (커맨드라인 사용법+ OpenGL / Vulkan에서로 라이브러리 통합)
- 텍스쳐 압축 인코딩 라이브러리
- 3D 기즈모(이동, 회전, 스케일) 직접 구현하기
방향성과 여담
이 시리즈는
최대한 빨리 OpenGL을 학습하고,
게임에 실질적으로 적용할 수 있는, 재미있고 효과적인 그래픽스 기술을
구현해 보는 것을 목표로 합니다.
인터넷에는 LearnOpenGL 이라는 훌륭한 교재가 있습니다.
제가 처음 LearnOpenGL을 보며 배울 떄 아쉬웠던 게
저는 2D 렌더링 - 특히 스크린 좌표계에 맞는
렌더러를 공부해보고 싶었으나,
2D 렌더링에 대한 설명이 제대로 되어 있지 않다는 점이었습니다.
아마 LearnOGL이 그래픽스 입문용 교재기 때문이겠죠.
텍스트 렌더링, 씬 그래프같이
매우 간단한 2D 엔진에 꼭 들어가있는 기능들도
교재 내에는 기초적인 부분만 설명되어 있었습니다.
그렇게 제 기준에서 중요하다고 판단되는 기술을 중점으로
이렇게 한국어로 정리하게 되었습니다.