Top

Game Programming in C++ [OpenGL과 SDL을 활용한 3D 게임 개발]

  • 원서명Game Programming in C++: Creating 3D Games (ISBN 9780134597201)
  • 지은이산자이 마드하브(Sanjay Madhav)
  • 옮긴이박주항
  • ISBN : 9791161753560
  • 45,000원
  • 2019년 09월 30일 펴냄
  • 페이퍼백 | 652쪽 | 188*235mm
  • 시리즈 : 게임 개발 프로그래밍

책 소개

요약

C++는 게임 개발을 선도하는 주요 스튜디오에서 핵심 언어로 사용한다. C++는 여러 코드 기반에서 사용되기 때문에 이들 스튜디오는 게임을 유지보수하거나 개선할 때 C++를 사용한다.
이 책은 C++로 3D 비디오 게임을 프로그래밍하는 데 현실적이고 실용적인 접근을 제공한다. USC 산자이 마드하브의 게임 프로그래밍 과정을 바탕으로 한 이 책은 쉽고 재밌으며, 직접 실습할 수 있어서 실용적이고 완벽하다.

이 책에서 다루는 내용

■ C++ 개발 도구를 빠르게 구축하고 개발 시작하기
■ 기초 2D 그래픽스와 게임 갱신, 벡터, 게임 물리 구현
■ 널리 사용되는 AI 알고리즘으로 더욱 지능적인 게임을 제작하기
■ OpenGL, 셰이더, 행렬, 변환 등의 내용을 포함한 3D 그래픽스 구현
■ 3D 위치기반 오디오를 포함한 오디오 통합 및 믹싱
■ 3D 환경에서 오브젝트 간 충돌 감지
■ 플레이어의 입력에 효율적으로 반응하기
■ 헤드업 디스플레이(HUD)를 포함한 유저 인터페이스 구축
■ 이방성 필터링과 지연 셰이딩을 통한 그래픽 품질 향상
■ 게임 레벨과 바이너리 게임 데이터 불러오기 및 저장

이 책의 대상 독자

C++에 익숙한 프로그래머나 3D 비디오 게임을 프로그래밍하는 방법을 배우려는 프로그래머를 대상으로 하는 책이다. C++에 익숙하지 않은 독자를 위해 부록 A, ‘중급 C++ 리뷰’에서 몇 가지 C++ 개념을 살펴본다. 그러나 C++ 경험이 거의 없거나 전혀 없는 경우라면 이 책을 읽기에 앞서 C++를 배워야 한다. 그리고 독자가 동적 배열(벡터), 트리, 그래프를 포함한 일반 데이터 구조에 친숙하며, 고등학교 수준의 대수학을 어느 정도 알고 있다고 가정한다.
이 책에서 다루는 내용은 게임 프로그래밍의 지식을 넓히고자 하는 학계의 독자와 취미로 게임 프로그래밍에 관심을 두는 사람, 초급 및 중급 게임 프로그래머에게 도움이 된다. 이 책의 내용은 대학에서 한 학기에 배우는 내용보다 좀 더 많은 분량에 해당한다.

이 책의 구성

처음에는 핵심 개념을 배우기 위해 게임 제작을 2D로 진행한다. 6장 이후부터는(8장 제외) 게임 제작을 3D로 진행한다.

각 장에서는 다음 내용을 다룬다.
1장, ‘게임 프로그래밍 개관’에서는 게임 프로그래밍의 기본 개념을 살펴보고 게임을 초기화하고 실행하는 방법을 확인한다. 또한 SDL(Simple DirectMedia Layer) 라이브러리를 소개한다.
2장, ‘게임 객체와 2D 그래픽스’에서는 프로그래머가 게임에서 객체를 구성하는 방법을 설명하고 플립북 애니메이션과 같은 추가 2D 그래픽 콘셉트를 살펴본다.
3장, ‘벡터와 기초 물리’에서는 모든 게임 프로그래머에게 중요한 도구인 수학 벡터를 설명한다. 또한 움직임 및 충돌에 사용하는 물리의 기초를 살펴본다.
4장, ‘인공지능’에서는 상태 기계와 길 찾기 같은 개념을 포함해 컴퓨터가 제어하는 게임 캐릭터를 만드는 방법을 살펴본다.
5장, ‘OpenGL’에서는 버텍스 셰이더와 프래그먼트 셰이더 구현을 포함해 OpenGL 렌더러를 생성하는 방법을 설명한다.
6장, ‘3D 그래픽스’에서는 뷰, 투영, 그리고 회전을 표현하는 방법을 포함해 지금까지 작성한 코드를 3D 게임에서 동작하는 데에 중점을 둔다.
7장, ‘오디오’에서는 FMOD API를 사용해서 오디오 시스템을 구축하는 방법을 설명한다. 3D 위치 기반 오디오에 관한 내용도 다룬다.
8장, ‘입력 시스템’에서는 키보드나 마우스 그리고 게임 컨트롤러 이벤트를 처리하기 위해 좀 더 견고한 입력 시스템을 설계하는 방법을 설명한다.
9장, ‘카메라’에서는 1인칭 카메라, 팔로우 카메라, 궤도 카메라를 포함해 여러 3D 카메라를 구현하는 방법을 보여준다.
10장, ‘충돌 감지’에서는 구체, 평면, 선분, 박스를 포함해 게임에서 충돌을 감지하는 방법을 자세히 알아본다.
11장, ‘유저 인터페이스’에서는 메뉴 시스템과 레이더와 조준 격자 같은 헤드업 디스플레이(HUD) 요소의 구현을 살펴본다.
12장, ‘뼈대 애니메이션’에서는 3D 캐릭터를 움직이는 방법을 다룬다.
13장, ‘중급 그래픽스’에서는 지연 셰이딩을 구현하는 방법을 포함해 몇 가지 중급 그래픽스 주제를 살펴본다.
14장, ‘레벨 파일과 바이너리 데이터’에서는 레벨 파일을 로드하고 저장하는 방법을 설명한다. 또한 바이너리 파일 포맷을 작성하는 방법을 다룬다.
부록 A, ‘중급 C++ 리뷰’에서는 메모리 할당과 컬렉션을 포함하여 책 전반에서 사용한 몇 가지 중급 C++ 주제를 살펴본다.
각 장은 게임 프로젝트와 추천 추가 독서 목록, 그리고 몇 가지 예제를 담고 있다. 연습에서는 각 장에서 구현한 코드에 추가 기능을 구현할 수 있도록 제시한다.

상세 이미지

저자/역자 소개

지은이의 말

오늘날 비디오 게임은 가장 인기 있는 엔터테인먼트 중 하나다. 게임 전문 조사 기관인 뉴주(Newzoo)의 「세계 게임 시장 보고서(Global Games Market Report)」에서는 2017년 게임 매출액이 1,000억 달러를 상회한다고 평가했다. 이 엄청난 금액은 비디오 게임이 얼마나 인기 있는지를 보여준다. 그만큼 비디오 게임 시장은 거대하고, 게임 프로그래머의 수는 항상 부족하다.
게임의 폭발적인 인기와 더불어 게임 기술의 장벽은 낮아졌다. 이제 한 명의 개발자가 여러 유명한 게임 엔진이나 툴을 사용해서 상을 받거나 히트 게임을 제작할 수 있게 됐다. 특히 게임 디자이너에게 이러한 툴은 많은 도움이 된다. 그렇다면 여기서 C++로 게임을 프로그래밍하는 방법을 배운다는 것은 어떤 가치가 있을까?
여러 게임이나 툴을 한 걸음 뒤에서 보면 핵심 코어가 C++로 작성된 것을 확인할 수 있다. 즉, C++는 툴이나 게임 엔진을 사용해서 제작된 게임의 모든 배후에 있는 근본적인 기술이다.
또한 ‘오버워치’, ‘콜 오브 듀티’, ‘언차티드’ 등 오늘날 가장 인기 있는 게임들을 출시한 일류 개발자는 아직도 C++를 사용한다. 왜냐하면 C++는 성능과 편리함이라는 훌륭한 조합을 제공하기 때문이다. 그래서 앞에서 예시로 든 게임들을 개발한 회사 중 한 곳에서 일하고 싶은 개발자라면 특히 C++를 깊이 있게 이해해야 한다.
이 책에서는 실제 게임 개발자가 사용하는 여러 기술과 시스템을 파고든다. 이 책의 많은 내용은 거의 10년 동안 서던캘리포니아대학교(USC, University of Southern California)에서 가르친 비디오 게임 프로그래밍 강의에서 비롯됐다. 이 책에서 사용한 접근법은 많은 학생이 비디오 게임 산업에서 성공할 수 있도록 도움을 줄 것이다.
또한 이 책은 게임 프로젝트 데모에 통합된 코드의 실제 동작 구현에 특히 집중한다. 게임처럼 다양한 시스템이 어떻게 작동하는지 이해하는 것은 중요하다. 이런 이유로 이 책을 읽는 동안에는 소스 코드를 언제든지 참조할 수 있도록 가까이 둬야 한다.

지은이 소개

산자이 마드하브(Sanjay Madhav)

서던캘리포니아대학교(USC)의 선임 강사로, 2008년부터 프로그래밍과 비디오 게임 프로그래밍을 가르친다.
USC 이전에 일렉트로닉 아츠(Electronic Arts), 네버소프트(Neversoft), 판데믹 스튜디오(Pandemic Studios)에서 비디오 게임 개발자를 위한 프로그래머로서 일했다. 게임 ‘메달 오브 아너(Medal of Honor: Pacific Assault)’, ‘토니 호크 프로젝트 8(Tony Hawk’s Project 8)’, ‘반지의 제왕(Lord of Rings: Conquest)’, ‘사보추어(Saboteur)’ 개발에 참여했다.
또한 『게임 프로그래밍 알고리즘』(에이콘, 2015)의 저자이며 『멀티플레이어 게임 프로그래밍』(길벗, 2017)의 공동 저자다. 컴퓨터 과학 학사 학위와 석사 학위를 받았으며 USC에서 박사 과정을 밟고 있다.

옮긴이의 말

게임업계에 종사한 사람으로서 이런 훌륭한 책을 번역하게 된 뜻깊은 일이다. 내용을 간단하게 설명하는 다른 책과 달리, 이 책은 게임에서 쓰이는 수학, AI, 사운드, 애니메이션 등 전반적인 기술을 자세하게 설명한다. 또한 C++로 제작된 예제 소스코드를 제공해 내용을 쉽게 전달하는 데 주력했다.
C++의 장점은 저수준 레벨에서 프로그램을 제어할 수 있다는 점이다. 즉, C++로 프로그램을 잘 작성한다는 것은 컴퓨터 아키텍처를 잘 이해하고 있다는 것과 일맥상통한다고 볼 수 있다. 그래서 컴퓨터 성능이 좋지 않았던 2000년대 초반에는 게임 개발 언어로 C++가 인기를 끌었다. 하지만 C++는 생산성 측면에서 후속 언어에 밀리면서 그 점유율이 굉장히 낮아졌다. 또한 유니티 같은 강력한 게임 제작 툴이 등장하면서 C++의 입지는 매우 줄어들었다. 하지만 C++ 언어는 지속해서 발전하고 있으며, 언리얼 엔진은 여전히 C++ 언어를 지원한다. 중견급 이상의 기업에서는 항상 C++ 스킬을 요구하기 때문에 프로그래머라면 C++는 기본으로 다룰 수 있어야 한다.
앞에서 언급한 툴이나 특정 언어가 영원히 시장을 장악한다고 볼 수는 없으며, 언젠가는 더 나은 게임 개발 모델이 나올 것이다. 그런 경우를 대비하기 위해서라도 특정 툴에 종속되는 내용이 아니라, 기반 기술을 이해하는 것은 큰 도움이 된다. 예를 들어, 클래스 간 계층 구조를 다루는 개념은 C++, 자바, C# 등의 객체지향 언어에 바로 적용해서 사용할 수 있으며, 새로운 언어가 등장하더라도 다시 활용할 수 있는 이론이다.
그리고 이 책은 샘플 코드를 위해 다양한 크로스 플랫폼 라이브러리를 활용했다. 이 책에서 사용한 SDL, OPENGL, FMOD 라이브러리는 다양한 플랫폼으로 이식할 수 있기에 알아두면 언젠가는 반드시 도움이 된다.
한 권의 책으로 게임에 사용된 모든 프로그래밍 기법을 담기에는 무리겠지만, 적어도 이 책은 게임 개발에 도전하려는 학생이나 일반인에게 좋은 지침서가 될 것이며, 현업 종사자에게는 자신의 실력을 점검해 볼 수 있는 가이드를 제공할 것이라고 확신한다.

옮긴이 소개

박주항

서강대학교에서 컴퓨터공학과 물리학을 복수 전공했으며, JCE(현 조이시티)의 온라인 게임 서버 프로그래머, 라인의 백엔드 프로그래머, 노리숲의 모바일 게임 개발 회사 대표를 거쳐 현재 프리랜서로 활동 중이다.
주요 저서로는 한빛미디어에서 출간한 『CGSF를 활용한 게임 서버 제작』(2014), 『CGSF 파헤쳐 보기』(2014), 『C++ 개발자를 위한 WIN32 오픈소스 라이브러리 100』(2015), 『SDL과 C++를 이용한 크로스 플랫폼 프로그래밍』(2015), 에이콘에서 출간한 『C++로 나만의 운영체제 만들기』(2018) 등이 있다. 번역서로는 한빛미디어에서 출간한 『데이터베이스 첫걸음』(2016)이 있다.
현재 『C++로 나만의 운영체제 만들기』의 후속 편을 집필하면서 운영체제인 SkyOS의 완성도를 높이기 위해 수많은 버그와 사투를 벌이고 있다.

목차

목차
  • 1장 게임 프로그래밍 개관
    • 개발 환경 설정하기
      • 마이크로소프트 윈도우
      • 애플 맥OS
    • 이 책의 소스 코드 얻기
    • C++ 표준 라이브러리를 넘어
    • 게임 루프와 게임 클래스
      • 프레임의 구조
      • 게임 클래스 골격 구현하기
      • 메인 함수
      • 기본 입력 처리
    • 기초 2D 그래픽스
      • 색상 버퍼
      • 더블 버퍼링
      • 기초 2D 그래픽스 구현하기
      • 벽, 공, 패들 그리기
    • 게임 갱신하기
      • 실시간 그리고 게임 시간
      • 델타 시간 함수 로직
      • 패들의 위치 갱신하기
      • 공의 위치 갱신하기
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 2장 게임 객체와 2D 그래픽스
    • 게임 객체
      • 게임 객체의 타입
      • 게임 객체 모델
      • 게임 객체를 게임 루프에 통합하기
    • 스프라이트
      • 이미지 파일 로딩
      • 스프라이트 그리기
      • 스프라이트 애니메이션
    • 배경 스크롤하기
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 3장 벡터와 기초 물리
    • 벡터
      • 두 점 사이에서 벡터 얻어내기: 뺄셈
      • 벡터 스케일링하기: 스칼라 곱
      • 두 벡터의 결합: 덧셈
      • 거리 결정하기: 길이
      • 방향 결정하기: 단위 벡터와 정규화
      • 각도로부터 전방 벡터 변환
      • 전방 벡터를 각도로 변환: 아크탄젠트
      • 두 벡터 사이의 각도 구하기: 내적
      • 법선 벡터 계산하기: 외적
    • 기본 이동
      • 기본 MoveComponent 클래스 제작
      • InputComponent 클래스 제작
    • 뉴턴 물리
      • 선형 역학 개요
      • 오일러 적분을 사용한 위치 계산
      • 가변 시간 단계 문제
    • 기본 충돌 감지
      • 원과 원의 교차
      • CircleComponent 서브클래스 제작
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 4장 인공지능
    • 상태 기계 행위
      • 상태 기계 설계하기
      • 기본 상태 기계 구현
      • 클래스로서의 상태
    • 길찾기
      • 그래프
      • 너비 우선 탐색
      • 휴리스틱
      • 탐욕 최우선 탐색
      • A* 탐색
      • 데이크스트라 알고리즘
      • 길 따라가기
      • 기타 그래프 표현
    • 게임 트리
      • 미니맥스
      • 불완전 게임 트리 다루기
      • 알파 베타 가지치기
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 5장 OpenGL
    • OpenGL 초기화
      • OpenGL 윈도우 설정
      • OpenGL 콘텍스트와 GLEW 초기화
      • 프레임 렌더링
    • 삼각형 기초
      • 왜 폴리곤인가?
      • 정규화된 장치 좌표
      • 버텍스 버퍼와 인덱스 버퍼
    • 셰이더
      • 버텍스 셰이더
      • 프래그먼트 셰이더
      • 기본 셰이더 작성하기
      • 셰이더 로딩
      • 삼각형 그리기
    • 변환 기초
      • 오브젝트 공간
      • 세계 공간
      • 세계 공간으로 변환
    • 행렬과 변환
      • 행렬 곱셈
      • 행렬을 사용한 점의 이동
      • 세계 공간으로 변환, 재검토
      • 세계 변환을 액터에 추가
      • 세계 공간에서 클립 공간으로 변환하기
      • 변환 행렬을 사용하는 셰이더로 갱신
    • 텍스처 매핑
      • 텍스처 로딩
      • 버텍스 포맷 갱신
      • 셰이더 갱신
      • 알파 블렌딩
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 6장 3D 그래픽스
    • 3D에서 액터 변환
      • 3D를 위한 변환 행렬
      • 오일러 각
      • 쿼터니언
      • 새로운 액터 변환
    • 3D 모델 로딩
      • 모델 포맷 선택
      • 버텍스 속성 갱신
      • gpmesh 파일 로딩
    • 3D 메시 그리기
      • 클립 공간으로의 변환, 재검토
      • 화가 알고리즘을 버리고 Z-버퍼링을 사용하자
      • BasicMesh 셰이더
      • MeshComponent 클래스
    • 조명
      • 버텍스 속성 재검토
      • 광원의 유형
      • 퐁 반사 모델
      • 조명 구현
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 7장 오디오
    • 오디오 구축하기
      • FMOD
      • FMOD 설치
      • 오디오 시스템 생성
      • 뱅크와 이벤트
      • SoundEvent 클래스
    • 3D 위치 기반 오디오
      • 기본 리스너 설정
      • SoundEvent에 위치 기반 기능 추가
      • 액터와 사운드 이벤트를 연관시키는 AudioComponent 작성
      • 3인칭 게임상의 리스너
      • 도플러 효과
    • 믹싱 및 이펙트
      • 버스
      • 스냅샷
      • 차폐
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 8장 입력 시스템
    • 입력 장치
      • 폴링
      • 상승 에지와 하강 에지
      • 이벤트
      • 기본 입력 시스템 아키텍처
    • 키보드 입력
    • 마우스 입력
      • 버튼과 위치
      • 상대 모션
      • 스크롤 휠
    • 컨트롤러 입력
      • 컨트롤러 한 개 활성화하기
      • 버튼
      • 아날로그 스틱과 트리거
      • 2차원에서 아날로그 스틱 필터링하기
      • 복수개의 컨트롤러 지원
    • 입력 매핑
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 9장 카메라
    • 1인칭 카메라
      • 기본 1인칭 이동
      • 피치 없는 카메라
      • 피치 추가(높낮이)
      • 1인칭 모델
    • 팔로우 카메라
      • 기본 팔로우 카메라
      • 스프링 추가
    • 궤도 카메라
    • 스플라인 카메라
    • 언프로젝션
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 10장 충돌 감지
    • 기하 타입
      • 선분
      • 평면
      • 바운딩 볼륨
    • 교차 테스트
      • 점을 포함하는지 판정하는 테스트
      • 바운딩 볼륨 테스트
      • 선분 테스트
      • 동적 오브젝트
    • 게임 코드에 충돌 추가하기
      • BoxComponent 클래스
      • PhysWorld 클래스
      • SegmentCast를 활용한 공의 충돌
      • PhysWorld에서 박스 충돌 테스트
      • 벽과 플레이어와의 충돌
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 11장 유저 인터페이스
    • 폰트 렌더링
    • UI 스크린
      • UI 스크린 스택
      • 정지 메뉴
      • 버튼
      • 다이얼로그 박스
    • HUD 요소
      • 조준망 추가
      • 레이더 추가
    • 현지화
      • 유니코드로 작업하기
      • 텍스트 맵 추가하기
      • 기타 현지화 이슈
    • 다양한 해상도 지원
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 12장 뼈대 애니메이션
    • 뼈대 애니메이션의 기초
      • 뼈대와 포즈
      • 인버스 바인드 포즈 행렬
      • 애니메이션 데이터
      • 스키닝
    • 뼈대 애니메이션 구현
      • 스키닝 버텍스 속성으로 그리기
      • 뼈대 로딩
      • 애니메이션 데이터 로딩
      • 스키닝 버텍스 셰이더
      • 애니메이션 갱신
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 13장 중급 그래픽스
    • 텍스처 품질 개선하기
      • 텍스처 샘플링 재검토
      • 밉매핑
      • 이방성 필터링
    • 텍스처로 렌더링
      • 텍스처 생성하기
      • 프레임버퍼 개체 생성
      • 프레임버퍼 개체로 렌더링
      • HUD에 거울 텍스처 그리기
    • 지연 셰이딩
      • G 버퍼 클래스 생성
      • G 버퍼에 쓰기
      • 전역 조명
      • 점광 추가
      • 개선 및 이슈
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 14장 레벨 파일과 바이너리 데이터
    • 레벨 파일 로딩
      • 전역 속성 로딩
      • 액터 로딩
      • 컴포넌트 로딩
    • 레벨 파일 저장하기
      • 전역 속성 저장
      • 액터와 컴포넌트 저장
    • 바이너리 데이터
      • 바이너리 메시 파일 저장하기
      • 바이너리 메시 파일 로딩
    • 게임 프로젝트
    • 요약
    • 추가 독서
    • 연습

  • 부록 A 중급 C++ 리뷰
    • 참조, 포인터, 그리고 배열
      • 참조
      • 포인터
      • 배열
      • 동적 메모리 할당
    • 유형별 클래스 주제들
      • 참조, 상수 그리고 클래스
      • 클래스의 동적 할당
      • 소멸자
      • 복사 생성자
      • 연산자 오버로딩
    • 컬렉션
      • 빅 오 표기법
      • 벡터
      • 연결 리스트
      • 스택
      • 해시 맵
      • 반복자, auto, 범위 기반 for 루프
    • 추가 독서

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

[p.62 : 위에서 3행]
Game::UpdateFrame의 첫 번째 버전을 만든다.
->
Game::UpdateGame의 첫 번째 버전을 만든다.

[p.92 : 아래서 3행]
훨씬 더 큰 게임 세계를 기지고 있다.
->
훨씬 더 큰 게임 세계를 가지고 있다.