책 소개
요약
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++ 주제를 살펴본다.
각 장은 게임 프로젝트와 추천 추가 독서 목록, 그리고 몇 가지 예제를 담고 있다. 연습에서는 각 장에서 구현한 코드에 추가 기능을 구현할 수 있도록 제시한다.
상세 이미지
목차
목차
- 1장 게임 프로그래밍 개관
- 개발 환경 설정하기
- 마이크로소프트 윈도우
- 애플 맥OS
- 이 책의 소스 코드 얻기
- C++ 표준 라이브러리를 넘어
- 게임 루프와 게임 클래스
- 프레임의 구조
- 게임 클래스 골격 구현하기
- 메인 함수
- 기본 입력 처리
- 기초 2D 그래픽스
- 색상 버퍼
- 더블 버퍼링
- 기초 2D 그래픽스 구현하기
- 벽, 공, 패들 그리기
- 게임 갱신하기
- 실시간 그리고 게임 시간
- 델타 시간 함수 로직
- 패들의 위치 갱신하기
- 공의 위치 갱신하기
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 개발 환경 설정하기
- 2장 게임 객체와 2D 그래픽스
- 게임 객체
- 게임 객체의 타입
- 게임 객체 모델
- 게임 객체를 게임 루프에 통합하기
- 스프라이트
- 이미지 파일 로딩
- 스프라이트 그리기
- 스프라이트 애니메이션
- 배경 스크롤하기
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 게임 객체
- 3장 벡터와 기초 물리
- 벡터
- 두 점 사이에서 벡터 얻어내기: 뺄셈
- 벡터 스케일링하기: 스칼라 곱
- 두 벡터의 결합: 덧셈
- 거리 결정하기: 길이
- 방향 결정하기: 단위 벡터와 정규화
- 각도로부터 전방 벡터 변환
- 전방 벡터를 각도로 변환: 아크탄젠트
- 두 벡터 사이의 각도 구하기: 내적
- 법선 벡터 계산하기: 외적
- 기본 이동
- 기본 MoveComponent 클래스 제작
- InputComponent 클래스 제작
- 뉴턴 물리
- 선형 역학 개요
- 오일러 적분을 사용한 위치 계산
- 가변 시간 단계 문제
- 기본 충돌 감지
- 원과 원의 교차
- CircleComponent 서브클래스 제작
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 벡터
- 4장 인공지능
- 상태 기계 행위
- 상태 기계 설계하기
- 기본 상태 기계 구현
- 클래스로서의 상태
- 길찾기
- 그래프
- 너비 우선 탐색
- 휴리스틱
- 탐욕 최우선 탐색
- A* 탐색
- 데이크스트라 알고리즘
- 길 따라가기
- 기타 그래프 표현
- 게임 트리
- 미니맥스
- 불완전 게임 트리 다루기
- 알파 베타 가지치기
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 상태 기계 행위
- 5장 OpenGL
- OpenGL 초기화
- OpenGL 윈도우 설정
- OpenGL 콘텍스트와 GLEW 초기화
- 프레임 렌더링
- 삼각형 기초
- 왜 폴리곤인가?
- 정규화된 장치 좌표
- 버텍스 버퍼와 인덱스 버퍼
- 셰이더
- 버텍스 셰이더
- 프래그먼트 셰이더
- 기본 셰이더 작성하기
- 셰이더 로딩
- 삼각형 그리기
- 변환 기초
- 오브젝트 공간
- 세계 공간
- 세계 공간으로 변환
- 행렬과 변환
- 행렬 곱셈
- 행렬을 사용한 점의 이동
- 세계 공간으로 변환, 재검토
- 세계 변환을 액터에 추가
- 세계 공간에서 클립 공간으로 변환하기
- 변환 행렬을 사용하는 셰이더로 갱신
- 텍스처 매핑
- 텍스처 로딩
- 버텍스 포맷 갱신
- 셰이더 갱신
- 알파 블렌딩
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- OpenGL 초기화
- 6장 3D 그래픽스
- 3D에서 액터 변환
- 3D를 위한 변환 행렬
- 오일러 각
- 쿼터니언
- 새로운 액터 변환
- 3D 모델 로딩
- 모델 포맷 선택
- 버텍스 속성 갱신
- gpmesh 파일 로딩
- 3D 메시 그리기
- 클립 공간으로의 변환, 재검토
- 화가 알고리즘을 버리고 Z-버퍼링을 사용하자
- BasicMesh 셰이더
- MeshComponent 클래스
- 조명
- 버텍스 속성 재검토
- 광원의 유형
- 퐁 반사 모델
- 조명 구현
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 3D에서 액터 변환
- 7장 오디오
- 오디오 구축하기
- FMOD
- FMOD 설치
- 오디오 시스템 생성
- 뱅크와 이벤트
- SoundEvent 클래스
- 3D 위치 기반 오디오
- 기본 리스너 설정
- SoundEvent에 위치 기반 기능 추가
- 액터와 사운드 이벤트를 연관시키는 AudioComponent 작성
- 3인칭 게임상의 리스너
- 도플러 효과
- 믹싱 및 이펙트
- 버스
- 스냅샷
- 차폐
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 오디오 구축하기
- 8장 입력 시스템
- 입력 장치
- 폴링
- 상승 에지와 하강 에지
- 이벤트
- 기본 입력 시스템 아키텍처
- 키보드 입력
- 마우스 입력
- 버튼과 위치
- 상대 모션
- 스크롤 휠
- 컨트롤러 입력
- 컨트롤러 한 개 활성화하기
- 버튼
- 아날로그 스틱과 트리거
- 2차원에서 아날로그 스틱 필터링하기
- 복수개의 컨트롤러 지원
- 입력 매핑
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 입력 장치
- 9장 카메라
- 1인칭 카메라
- 기본 1인칭 이동
- 피치 없는 카메라
- 피치 추가(높낮이)
- 1인칭 모델
- 팔로우 카메라
- 기본 팔로우 카메라
- 스프링 추가
- 궤도 카메라
- 스플라인 카메라
- 언프로젝션
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 1인칭 카메라
- 10장 충돌 감지
- 기하 타입
- 선분
- 평면
- 바운딩 볼륨
- 교차 테스트
- 점을 포함하는지 판정하는 테스트
- 바운딩 볼륨 테스트
- 선분 테스트
- 동적 오브젝트
- 게임 코드에 충돌 추가하기
- BoxComponent 클래스
- PhysWorld 클래스
- SegmentCast를 활용한 공의 충돌
- PhysWorld에서 박스 충돌 테스트
- 벽과 플레이어와의 충돌
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 기하 타입
- 11장 유저 인터페이스
- 폰트 렌더링
- UI 스크린
- UI 스크린 스택
- 정지 메뉴
- 버튼
- 다이얼로그 박스
- HUD 요소
- 조준망 추가
- 레이더 추가
- 현지화
- 유니코드로 작업하기
- 텍스트 맵 추가하기
- 기타 현지화 이슈
- 다양한 해상도 지원
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 12장 뼈대 애니메이션
- 뼈대 애니메이션의 기초
- 뼈대와 포즈
- 인버스 바인드 포즈 행렬
- 애니메이션 데이터
- 스키닝
- 뼈대 애니메이션 구현
- 스키닝 버텍스 속성으로 그리기
- 뼈대 로딩
- 애니메이션 데이터 로딩
- 스키닝 버텍스 셰이더
- 애니메이션 갱신
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 뼈대 애니메이션의 기초
- 13장 중급 그래픽스
- 텍스처 품질 개선하기
- 텍스처 샘플링 재검토
- 밉매핑
- 이방성 필터링
- 텍스처로 렌더링
- 텍스처 생성하기
- 프레임버퍼 개체 생성
- 프레임버퍼 개체로 렌더링
- HUD에 거울 텍스처 그리기
- 지연 셰이딩
- G 버퍼 클래스 생성
- G 버퍼에 쓰기
- 전역 조명
- 점광 추가
- 개선 및 이슈
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 텍스처 품질 개선하기
- 14장 레벨 파일과 바이너리 데이터
- 레벨 파일 로딩
- 전역 속성 로딩
- 액터 로딩
- 컴포넌트 로딩
- 레벨 파일 저장하기
- 전역 속성 저장
- 액터와 컴포넌트 저장
- 바이너리 데이터
- 바이너리 메시 파일 저장하기
- 바이너리 메시 파일 로딩
- 게임 프로젝트
- 요약
- 추가 독서
- 연습
- 레벨 파일 로딩
- 부록 A 중급 C++ 리뷰
- 참조, 포인터, 그리고 배열
- 참조
- 포인터
- 배열
- 동적 메모리 할당
- 유형별 클래스 주제들
- 참조, 상수 그리고 클래스
- 클래스의 동적 할당
- 소멸자
- 복사 생성자
- 연산자 오버로딩
- 컬렉션
- 빅 오 표기법
- 벡터
- 연결 리스트
- 큐
- 스택
- 맵
- 해시 맵
- 반복자, auto, 범위 기반 for 루프
- 추가 독서
- 참조, 포인터, 그리고 배열
도서 오류 신고
정오표
정오표
[p.62 : 아래서 10행]
Game::Initialze
->
Game::Initialize
[p.62 : 위에서 3행]
Game::UpdateFrame의 첫 번째 버전을 만든다.
->
Game::UpdateGame의 첫 번째 버전을 만든다.
[p.92 : 아래서 3행]
훨씬 더 큰 게임 세계를 기지고 있다.
->
훨씬 더 큰 게임 세계를 가지고 있다.
[p. 109 코드]
Vector a, b;
Vector2 = result = a- b;
->
Vector2 a, b;
Vector2 result = a - b;
[p. 114 두 번째 코드]
Vector3 Actor::GetForward() const
->
Vector2 Actor::GetForward() const
[p. 115 아래에서 4행]
4분면
->
4사분면
[p. 214 2행]
셰이더 오브젝트가 컴파일됐지를
->
셰이더 오브젝트가 컴파일됐는지를
[p. 219 리스트 5.9 아래에서 2행]
return true;
->
삭제
[p. 234 두 번째 문단 1행]
이제 크기, 회전, 변환 행렬을
->
이제 스케일, 회전, 이동 행렬을
[p. 235 12행]
CreateWorldTransform 함수를 구현한다.
->
ComputeWorldTransform 함수를 구현한다.
[p. 235 코드]
맨 아래 } 추가
[p. 250 두 번째 문장]
이중 선형 필터링을 화성화시킨다.
->
이중 선형 필터링을 활성화시킨다.