Part 1. 기초 1장 윈도우즈 프로그래밍 개요 이벤트 구동 프로그래밍 ... 4 여러분의 첫번째 윈도우 프로그래밍 ... 5 main()이 아닌 Winmain() ... 7 윈도우 생성의 2단계 ... 9 이벤트 핸들링(펌핀 메시지) ... 25 WindowProc 작성 ... 32 이 장의 요약 ... 41 샘플 프로그램에 대해서 ... 41 연습문제 ... 42 2장 고급 Win32 API 프로그래밍 원도우즈 GDI ... 44 디바이스 문맥(Device Contexts) ... 47 GDI 좌표계에 대한 간략한 설명 ... 49 펜, 칼라, 브러쉬와 도형 ... 50 비트맵(Bitmaps) ... 56 텍스트(Text)와 폰트 (Fonts) ... 65 리젼(Region)과 클리핑(Clipping) ... 77 에러 검사 ... 78 GetLastError ... 78 MessageBox ... 80 리소스(Resources) 사용하기 ... 82 아이콘(Icons) ... 85 사용자 설정 마우스 커서 ... 86 대화 상자 만들기 ... 87 리소스 에디터에서 대화상자 템플릿 만들기 ... 89 모달 대화상자 ... 90 모달리스 대화상자 ... 92 대화상자 컨트롤 ... 94 이 장의 요약 ... 96 샘플 프로그램들에 대해 ... 96 연습문제 ... 98 3장 DirectX DirectX는 무엇인가? ... 100 DirectX를 내가 사용해야만 하는가? ... 101 DirectX 사용의 기본규칙 ... 102 인터페이스란 무엇인가? ... 102 항상 인터페이스를 해제한다. ... 103 IUnKnown은 무엇인가? ... 104 COM에 관한 다른 중요한 것들 ... 104 DirectX Enumeration을 처리하는 방법 ... 107 DIRECTINPUT ... 108 DirectInput 아키텍쳐 ... 109 디아비스 설정하기 ... 110 대바이스 취득과 디바이스 취득 해제 ... 110 버퍼링 데이터 & 즉시 데이터 ... 112 즉시 데이터 읽기 ... 114 버퍼링 데이터 읽기 ... 116 액션 매핑 ... 118 포스 피드백(Force Feedback) ... 126 DirectInput 요약 ... 131 DirectAudio ... 132 도대체, 디지털 오디오는 어떻게 작동하는가? ... 132 DirectAudio 구조 ... 136 DirectAudio의 설정 ... 137 사운드와 뮤직을 연주하기 ... 140 DirectAudio 이펙트 필터를 이용해서 사운드를 변경하기 ... 146 오디오 스크립트 ... 149 DirectAudio 요약 ... 151 DirectPlay ... 152 왜 DirectPlay를 이용하는가? ... 152 Peer-to-Peer 또는 Client/Server? ... 153 DirectPlay를 이용하는 간단한 7가지 단계 ... 154 콜백 함수의 설정 ... 155 다중 쓰레드와 DirectPlay 콜백함수들 ... 156 서비스 제공자(Service Provider) 선택하기 ... 158 게임을 호스팅(hosting)하기 ... 159 게임에 접속하기 ... 163 데이터의 전송 ... 166 데이터 받기 ... 168 중용한 DirectPlay 메시지들 ... 168 연결끊기 ... 168 대기실의 즐거움 ... 169 DirectPlay의 음성특성 이용하기 ... 172 DirectPlay 요약 ... 176 DirectShow ... 176 DirectShow 구조 ... 176 비디오 플레이하기 ... 177 특정 윈도우에서 비디오 플레이하기 ... 178 MP3 플레이하기 ... 179 DirectShow 요약 ... 180 이 장의 요약 ... 180 샘플 프로그램에 대해 ... 180 연습문제 ... 181 4장 3D 수학 3D 세계에 오신 여러분을 환영한다. ... 185 DirectGraphics는 왼손 좌표계 일까? 오른손 좌표계 일까? ... 186 점에서 기본도형(Primitive)까지 ... 187 3D 변환 ... 188 로컬 좌표계와 월드 좌표계 ... 191 벡터 ... 195 벡터란 무엇인가? ... 195 벡터 가산과 감산 ... 198 벡터의 스칼라 곱 ... 199 정규화 벡터(Normalizing Vector) ... 199 두 벡터의 내적 ... 201 두 벡터의 외적 ... 204 D3DX 벡터 헬퍼 함수 ... 205 벡터 요약 ... 207 행렬 ... 208 행렬이란 무엇인가? ... 208 왜 행렬을 사용하는가? ... 208 행렬 곱 ... 209 빠르고 쉬운 3D 변환 방법 ... 213 단위 행렬(Identity Matrix) ... 218 행렬 결합 ... 219 3D 프로그램에서 행렬 사용하기 ... 220 D3DX 행렬 헬퍼 함수 ... 220 행렬 요약 ... 222 쿼터니언 ... 223 왜 쿼터니언을 사용하는가? ... 223 쿼터니언은 무엇인가? ... 224 쿼터니언 기초 ... 224 쿼터니언 사용하기 ... 227 쿼터니언 요약 ... 227 이 장의 요약 ... 227 샘플 프로그램들에 대해 ... 228 연습문제 ... 228 5장 3D 개념 3D 모델들 ... 230 모델이란 무엇인가? ... 230 정점들로 삼각형을 만드는 세가지 방법 ... 231 정점 버퍼 ... 233 인텍스 버퍼 ... 234 3D 모델 요약 ... 235 고급 3D 모델 기술들 ... 236 X파일로부터 모델 로딩하기 ... 236 3D Studio Model를 X파일로 변환하기 ... 237 계층 모델과 행렬 스택 ... 240 고급 모델 기법 요약 ... 245 카메라와 뷰 포트 ... 246 뷰포트 ... 246 카메라 ... 248 카메라와 뷰포트 요약 ... 253 3D 기하 파이프라인 ... 254 월드 변환 ... 254 뷰 변환 ... 255 투영 변환 ... 257 클리핑과 뷰포트 스케일링 ... 257 기하 파이프라인 요약 ... 257 깊이 버퍼 ... 258 왜 깊이 버퍼를 사용하는가? ... 258 깊이 버퍼는 무엇인가? ... 259 Z버퍼와 W버퍼 ... 260 깊이 버퍼를 사용해서 동일 평면상에 있는 객체 그리기 ... 261 깊이 버퍼를 사용하지 못하게 하고 깊이 버퍼의 타입 선택하기 ... 262 깊이 버퍼에 쓰는 것 방지하기 ... 263 깊이 버퍼에 클리어 하기 ... 263 비교 함수 변경하기 ... 263 깊이 버퍼 요약 ... 264 이 장의 요약 ... 265 샘플 프로그램들에 대해 ... 265 연습문제 ... 265 6장 DirectGraphics 소개 DirectGraphics 기초 ... 268 DirectGraphics 아키텍쳐 ... 268 디바이스 타입들 ... 269 디바이스 생성하기(비디오 모드 설정하기) ... 270 모니터에 대한 간단한 설명 ... 277 비디오 모드 알아내기 ... 280 디바이스 소실(Lost Device) ... 282 DEVICE 전환하기(풀스크린에서 윈도우 모드로) ... 284 첫번째 3D프로그램 ... 284 정점 ... 285 정점 버퍼(Vertex Buffer) ... 290 행렬 설정하기 ... 295 삼각형을 랜더링 하기 위한 7단계 ... 296 화면에 보내기 ... 301 여러분의 첫 번째 3D 프로그램 요약 ... 302 페이딩 인, 페인딩 아웃, 색상 번쩍이기 - 감마 컨트롤 ... 302 여러분의 3D 카드가 감마 컨트롤을 지원하는지 알아내기 ... 302 감마 램프(Gamma Ramps) ... 303 페인딩 인 ... 305 페인딩 아웃 ... 306 다른색으로 페인딩 하기 ... 306 감마 램프 얻기 ... 307 감마 램프 설정하기 ... 308 이 장의 요약 ... 309 샘플 프로그램들에 대해 ... 309 연습문제 ... 309 7장 조명 자연광 ... 312 Direct3D 조명 개념 ... 313 주변(Ambient) 광과 집적(Direct) 광 ... 313 쉐이딩 모드 ... 313 재질(Materials) ... 315 Direct3D 조명 속성 ... 316 분산, 반사, 주변색상 ... 316 위치, 범위, 감쇠 ... 316 조명 방향 ... 317 조명 타입 ... 318 Direct3D 재질 속성 ... 320 분산 색상(Diffuse Color) ... 320 주변 색상(Ambient Color) ... 321 방사 색상(Emissive Color) ... 321 반사 색상과 Power ... 321 Direct3D 조명 프로그래밍하기 ... 322 조명 속성 설정하기 ... 322 조명 속성 얻기 ... 323 조명 활성화/비활성 하기 ... 325 Direct3D 재질 프로그래밍하기 ... 325 현재 재질 설정하기 ... 325 현재 재질 얻기 ... 325 이 장의 요약 ... 327 샘플 프로그램들에 대해 ... 328 연습문제 ... 328 8장 텍스쳐링 기초 기본적인 텍스쳐 개념들 ... 330 텍스쳐는 단지 서피스(surface)이다. ... 330 텍스쳐 관리(Texture Management) ... 331 텍스쳐링시에 알아야 기법 ... 331 정점과 텍스쳐 연결하기 ... 332 랩(Wrap) 또는 랩을 하지 않는 것? ... 334 텍스쳐 필터링 모드 ... 335 텍스쳐 주소 모드 ... 340 투명 텍스쳐 ... 344 알파 블렌딩을 통한 투명 텍스쳐 ... 345 알파 테스팅을 통한 투명 텍스쳐 ... 345 Direct3D에서 텍스쳐와 재질을 혼합하는 방법 ... 346 텍스쳐 프로그래밍 기초 ... 346 기본적인 디바이스 텍스쳐 능력 결정하기 ... 347 필터링과 주소지정모드 랩모드 설정하기 ... 351 텍스쳐 생성 명령어 ... 352 텍스쳐 선택하기 ... 361 정점과 텍스쳐가 만났을 때 ... 362 이 장의 요약 ... 362 샘플 프로그램에 대해 ... 363 연습문제 ... 363 9장 고급 텍스쳐링 멀티 텍스쳐 블렌딩(Multiple Texture Blending) ... 366 텍스쳐링 용어표 안내 ... 367 텍스쳐 스테이지(Texture Stage) ... 368 텍스쳐 스테이지 프로그래밍 ... 373 라이트 맵(Light Mapping) ... 376 라이트 맵은 무엇이며 왜 그것에 관심을 가져야 하는가? ... 376 라이트 맵 프로그래밍하기 ... 377 환경 맵(Environment Mapping) ... 379 환경맵은 무엇이며 왜 그것에 관심을 가져야 하는가? ... 379 구형 환경 맵 ... 380 입방체 환경 맵 ... 381 멀티 텍스쳐의 다른 사용 ... 382 글로우 매핑(Glow Mapping) ... 382 디테일 매핑(Detail Mapping) ... 382 색 포화(Color Saturation) ... 382 효과 사용하기 ... 383 효과 스크립트는 무엇이며 왜 관심을 가져야 하는가? ... 383 효과를 사용하는 과정 ... 384 효과 파일 생성하기 ... 386 효과 요약 ... 387 이 장의 요약 ... 388 샘플 프로그램들에 대해 ... 388 연습문제 ... 388 10장 정점쉐이더와 픽셀 쉐이더 왜 쉐이더인가? ... 390 정점 쉐이더 ... 391 정점 쉐이더를 사용해서 만들 수 있는 효과 ... 393 디바이스가 정점 쉐이더를 지원하는지 알아보기 ... 393 정점쉐이더에서 입력 지정하기 ... 394 정점 쉐이더 어셈블리 언어 ... 399 프로그램에서 정점 쉐이더 생산하기 ... 406 쉐이더를 사용해서 렌더링하기 ... 407 상수 레지스터를 사용해서 쉐이더에 데이터 건네주기 ... 408 간단한 정점 쉐이더 예제 ... 409 복잡한 정점 쉐이더 예제 ... 411 정점 쉐이더 요약 ... 414 픽셀 쉐이더 ... 414 픽셀 쉐이더를 사용해서 만들 수 있는 효과들 ... 414 픽셀 쉐이더 어셈블리 언어 ... 414 픽셀 쉐이더 수식자 ... 419 프로그램에서 픽셀 쉐이더 생성해서 사용하기 ... 420 단순한 픽셀 쉐이더 예제 ... 421 픽셀 쉐이더 요약 ... 422 이 장의 요약 ... 422 샘플 프로그램들에 대해 ... 423 연습문제 ... 423 Part 2. 2D 효과들 11장 불 이것은 어떻게 작동하는가? ... 429 코드의 작성 ... 430 불 텍스쳐의 생성 ... 431 불 처리하기 ... 435 텍스쳐에 불 저장하기 ... 436 불 텍스쳐가 뷰포트를 채우도록 한다 ... 441 코드 요약 ... 448 불 효과의 변경 ... 448 냉각 배열들(cooling arrays) ... 448 연료값(fuel) ... 449 색상 ... 450 불 효과의 이용 ... 450 불 환경맵핑 ... 451 불 멀티텍스쳐링 ... 451 불 효과를 최적화하기 ... 451 가능한 가장 작은 크기의 텍스쳐를 사용하라. ... 452 팔레트 텍스쳐의 사용 ... 452 이 장의 요약 ... 453 샘플 프로그램들에 대해 ... 453 연습문제 ... 454 12장 2D 물 어떻게 작동하는가? ... 456 물 배열들 ... 457 레이 트레이싱을 사용한 현실적인 물 ... 460 파동의 생성 ... 468 더 큰 물결 만들기 ... 469 물 효과 요약 ... 469 코드의 작성 ... 470 속도를 증가시키자. - 변위자 검색 테이블을 만들자. ... 470 이미지와 물 텍스쳐 생성하기 ... 471 물 배열의 처리 ... 472 물을 애니메이트하기 ... 473 목적 텍스쳐에 소스 텍스쳐를 랜더링하기 ... 474 코드 요약 ... 477 물 효과 변경하기 ... 477 물결 속도 ... 477 물결 수명 ... 478 물의 흐름 ... 479 물의 깊이 ... 480 더 나은 블렌딩 함수 ... 480 물을 렌더링 하는 다른 방법들 ... 481 물 효과의 용도들 ... 482 비 ... 482 물방울을 떨어뜨리는 마우스 커서 ... 482 평행 물결 ... 483 보트가 지나간 자국 ... 483 물 효과를 최적화하기 ... 484 화면에 보여주지 않은 것을 계산하지 말라. ... 484 물배열의 크기를 줄인다 ... 484 멀티 쓰레드 ... 485 이 장의 요약 ... 485 샘플 프로그램에 대해서 ... 486 연습문제 ... 486 13장 이미지 피드백 이것은 어떻게 작동하는가? ... 489 코드의 작성 ... 492 텍스쳐의 생성 ... 493 텍스쳐에 렌더링하기 ... 494 주요 텍스쳐를 변환해서 스크래치 텍스쳐로 복사해 넣는다 ... 498 새로운 이미지 데이터를 스크래치 텍스쳐에 렌더링하기 ... 502 스크래치 텍스쳐를 주요 텍스쳐에 블렌딩 하기 ... 502 이미지 피드백의 효과 조정하기 ... 503 피드백 변환 ... 503 스크래치 텍스쳐의 투명도 ... 503 이미지 피드백의 용도 ... 503 이 장의 요약 ... 504 샘플 프로그램에 대해서 ... 504 연습문제 ... 504 14장 이미지 왜곡 이것은 어떻게 작동하는가? ... 507 코드의 작성 ... 508 하나의 효과를 위한 2개의 텍스쳐들 ... 509 정점 격자의 설정 ... 511 이미지 왜곡효과 조정하기 ... 516 격자의 빈도 ... 517 요동치는 효과의 정도 ... 517 누적되는 왜곡과 그렇지 않은 왜곡 ... 517 알파 블렌딩 ... 518 이미지 왜곡의 용도 ... 518 이미지 왜곡의 최적화 ... 519 이 장의 요약 ... 519 샘플 프로그램에 대해 ... 520 연습문제 ... 520 15장 구름 어떻게 작동하는가? ... 522 Perlin 노이즈 ... 523 Perlin 노이즈를 레이어링(Layering) 해서 구름을 생성한다 ... 525 더 멋진 구름 텍스쳐 만들기 ... 528 구름 텍스쳐 애니메이트하기 ... 529 코드의 작성 ... 529 텍스쳐들의 생성 ... 529 모든 것은 랜덤 숫자 생성기로부터 시작된다 ... 530 노이즈 만들기 ... 531 구름의 제곱 ... 535 감산 ... 535 구름 효과의 조정 ... 535 블렌딩 인자들 ... 536 색상 구름 ... 536 구름효과의 용도 ... 537 점액질, 용암, 플라즈마 ... 537 동적으로 생성된 지형 ... 537 구름 효과의 최적화 ... 538 더 작은 수의 옥타브(층)를 사용한다. ... 538 더 작은 텍스쳐의 사용 ... 538 텍스쳐에 너무 자주 lock을 걸지 말라 ... 539 Begin/Scene 호출 횟수를 최소화하라. ... 539 이 장의 요약 ... 540 샘플 프로그램에 대해서 ... 540 연습문제 ... 540 16장 블러 그리고 다른 형태의 이미지 조작 이것은 어떻게 작동하는가? ... 542 용어에 대한 설명 ... 542 커널이란 무엇인가? ... 543 사용할 커널들 ... 544 블러링 ... 545 더욱 강한 블러링 ... 545 샤프닝(sharpening) ... 545 모서리 감지 ... 546 코드의 작성 ... 546 이미지 조작의 용도 ... 555 이미지 조작을 최적화 하기 ... 556 이 장의 요약 ... 557 샘플 프로그램에 대해서 ... 557 연습문제 ... 558 17장 페이드(fades), 와이프(wipes), 다른 변화들 간단한 장면전환 ... 560 알파 블렌딩을 이용한 색상 페이딩 ... 561 디졸브(크로스 페이드) ... 564 와이프 효과(Wipes) ... 566 타일 장면전화(Tile Transitions) ... 575 장면전환을 위한 클래스 상속도 ... 580 이 장의 요약 ... 581 샘플 프로그램에 대해서 ... 582 연습문제 ... 582 Part 3. 3D 효과들 18장 비, 연기, 마법, 기타 등등 : 즐거운 파티클 시스템 파티클 시스템이란 무엇인가? ... 586 얼마나 복잡한 파티클 시스템을 만들어야 하는가? ... 589 핵심 파티클 시스템 속성들 ... 591 핵심적인 파티클 시스템 특성 ... 591 기본적인 파티클 시스템을 위한 코드의 작성 ... 593 CParticle ... 593 CParticleEmitter ... 594 CRecyclingArray ... 596 파티클 시스템의 설정하기 ... 602 점 스프라이트와 새로운 정점 포맷 ... 603 파티클 랜더링하기 ... 604 파티클을 갱신 ... 611 기본적인 파티클 시스템 코드 요약 ... 614 파티클 시스템 에디터 만들기 ... 615 친도구(chindogu)와 '왜 에디터를 만드는가?'하는 질문 ... 615 형식은 기능을 따른다 ... 616 맵 생성하기 ... 617 GUI 나타내기 ... 619 에디터 요약 ... 628 이 장의 요약 ... 629 샘플 프로그램에 대해 ... 629 연습문제 ... 632 19장 진보적인 파티클 시스템 개선된 파티클 시스템 만들기 ... 634 현재의 시스템에 '유연성'을 첨가한다. ... 635 이벤트(Events) ... 636 이벤트 시퀀스(Sequences) ... 637 GUI야, 잘가∼ ... 638 간단한 스크립트 언어의 탄생 ... 638 속성분류하기 ... 640 무작위적인 요소 ... 640 설계 : BNF 문법 ... 641 이벤트들 ... 646 페이드(Fades) 처리, Final 키워드 ... 647 초보적인 반복문 : EventTimer 속성 ... 648 속성 파일 로더(Loader)를 작성하는 첫 번째 단계 ... 649 실제 로딩 코드의 시작 ... 654 파티클 시스템 블록 처리 ... 656 로딩한 것 사용하기 ... 666 새로운 이벤트기반의 갱신함수 ... 666 스크립트 작성이 가능한 파티클 시스템의 요약 ... 670 스크립트 가능한 파티클 시스템의 용도 ... 671 눈 ... 671 마법주문 ... 673 제트기류와 로켓들 ... 675 요정들 ... 676 반딧불, 다른 스크립트들 ... 677 스크립트 가능한 파티클 시스템을 최적화 하기 ... 677 다른 멋진 개선점들 ... 678 이 장의 요약 ... 679 샘플 프로그램에 대해서 ... 679 연습문제 ... 680 20장 폭발 간단한 예제로 시작 : 폭발 스프라이트들 ... 682 폭발 텍스쳐들의 생성 ... 683 스프라이트와 애니메이션 클래스들의 생성 ... 685 빌보딩(Billboarding) ... 693 폭발효과의 렌더링 ... 694 폭발효과 뭉치 ... 696 파티클 시스템 코드 안에 첨가하기 ... 698 쇼크웨이브(shockwave, 충격파) 추가하기 ... 706 쇼크웨이브 텍스쳐 생성 ... 707 정점과 텍스쳐 좌표의 설정 ... 707 쇼크웨이브 랜더링 ... 711 쇼크웨이브를 점점 사라지게 하기 ... 712 이 장의 요약 ... 713 샘플 프로그램에 대해서 ... 714 연습문제 ... 719 21장 총과 발사체(projectile)들 발사 범위 프레임워크 ... 722 총의 기저 클래스 ... 722 무기의 교체 ... 723 총 모델을 위치시키고 렌더링 하기 ... 727 총의 발사 ... 729 머신건 ... 730 총구 섬광 스프라이트의 로딩 ... 731 머신건의 발사 ... 732 총구섬광 그리기 ... 733 총포의 반동(Recoil) ... 734 플라즈마 캐논 ... 735 총알과 총알 배열 ... 736 총알을 갱신하고 렌더링하기 ... 738 총알의 발사 ... 739 플라즈마 캐논에 대한 여담과 요약 ... 740 볼트 무기 ... 741 CLaserGun 클래스 ... 742 레이저의 발사 ... 743 레이저 그리기 ... 744 파티클 시스템을 통합시킴 ... 746 이 장의 요약 ... 747 샘플 프로그램에 대해서 ... 747 연습문제 ... 748 22장 렌즈 플레어(lens flares) 렌즈플레어란 무엇인가? ... 750 개념들 ... 751 플레어 무늬들 ... 751 태양과 플레어 강도가 없는 플레어 ... 753 렌즈 플레어 객체 ... 755 2D에서 렌즈 플레어 렌더링하기 ... 759 강도 계산하기 ... 759 삼각형의 위치를 계산 ... 761 삼각형의 렌더링 ... 763 렌즈 플레어를 3D에서 렌더링하기 ... 765 렌즈플레어를 그려야 할지 말아야 할지를 결정하기 ... 768 빛의 시작점과 방향 계산 ... 770 빛/삼각형 교차 테스트의 수행 ... 771 코드 요약 ... 773 효과 : 그저 렌즈 플레어만 그리는 것 보다 더 멋진 것 ... 774 이 장의 요약 ... 774 샘플 프로그램에 대해서 ... 775 연습문제 ... 775 23장 3D 물 개