순수 C++ 500줄로 구현하는 소프트웨어 렌더러

14 hours ago 5
  • OpenGL·Vulkan·Metal·DirectX의 내부 작동 원리를 이해하기 위해 외부 그래픽 라이브러리 없이 소프트웨어 렌더러를 처음부터 구현함
  • 삼각형 메시와 텍스처로 구성된 3D 모델을 이미지로 변환하며, GUI나 GPU 애플리케이션 구현은 다루지 않음
  • 완성 코드는 약 500줄이고, 학생들은 일반적으로 10~20시간을 들여 작동하는 렌더러를 만들기 시작함
  • RGB·RGBA·회색조를 지원하는 TGA 처리 클래스와 단일 픽셀 설정 기능만 주어지며, 선분과 삼각형 그리기는 직접 구현해야 함
  • 완성 코드를 복사하기보다 직접 작성해야 렌더링 개념을 이해하고, 3D 라이브러리의 내부 동작도 파악할 수 있음

렌더링 파이프라인을 직접 만드는 과정

  • 최신 3D 그래픽 라이브러리의 구조를 느슨하게 따라가며 렌더링 파이프라인의 작동 원리를 학습함
    • GPU 애플리케이션 작성법 대신 소프트웨어 렌더러로 내부 동작을 재현함
    • 입력은 삼각형 메시와 텍스처로 구성된 3D 모델이며, 출력은 렌더링된 이미지임
    • 그래픽 인터페이스 없이 프로그램이 이미지 파일을 생성함
  • 외부 의존성을 줄이기 위해 단순한 이미지 형식인 TGA를 사용함
    • 처음 제공되는 기능은 이미지 불러오기·저장하기와 픽셀 하나의 색상 설정뿐임
    • 선분이나 삼각형을 그리는 내장 함수가 없어 모두 직접 작성해야 함
  • 시작 예제는 64x64 RGB 프레임버퍼를 만들고 세 좌표의 픽셀을 흰색으로 설정한 뒤 framebuffer.tga로 저장함
    • 색상 값은 BGRA 순서로 지정함

코드 빌드와 실행

git clone https://github.com/ssloy/tinyrenderer.git && cd tinyrenderer && cmake -Bbuild && cmake --build build -j && build/tinyrenderer obj/diablo3_pose/diablo3_pose.obj obj/floor.obj
  • 실행 결과는 framebuffer.tga 에 저장됨
  • 완성 코드는 약 500줄이지만, 직접 구현하는 과정이 개념 이해에 필수이므로 제공 코드를 그대로 사용하는 방식은 권장하지 않음
Read Entire Article