Top

[3D 게임 최적화와 시각적 효과를 위한]
유니티 Shader와 Effect 제작

  • 원서명Unity Shaders and Effects Cookbook (ISBN 9781849695084)
  • 지은이케니 람머스
  • 옮긴이옥찬호
  • ISBN : 9788960775480
  • 30,000원
  • 2014년 04월 30일 펴냄
  • 페이퍼백 | 336쪽 | 188*235mm
  • 시리즈 : acorn+PACKT, 게임 개발 프로그래밍

책 소개

요약

이 책은 유니티 셰이더를 처음 접하는 개발자를 위한 유니티 셰이더와 이펙트 입문서다. 상세한 설명과 예제 파일을 통해, 셰이더의 품질을 향상시키고 작성 과정을 효율화할 수 있는 새로운 기술을 배운다. 이 책을 통해 독자가 원하는 새로운 이펙트를 생성하고 고성능을 위한 셰이더 최적화를 고민해 볼 수 있다.

이 책에서 다루는 내용

■ 복잡하고 성능이 무거운 조명 리그(rig) 없이 복잡한 라이팅을 만들기 위한 텍스처 사용
■ 빛나는 오브젝트와 부드러운 오브젝트를 모두 생성하는 수학을 사용한 기술 마스터
■ 포스트 이펙트(post effect)를 생성하는 월드를 입력하고 게임을 시각적으로 멋져 보이게 만드는 방법
■ 셰이더의 구조 안에서 어떤 일이 일어나고 라이팅이 어떻게 동작하는지에 대한 이해
■ 디퓨즈(Diffuse)와 스페큘러(Specular)가 동작하는 방법과 이를 창의적으로 사용하는 방법

이 책의 대상 독자

이 책은 초보자부터 고급 사용자까지, 모든 유니티 3D 개발자를 대상으로 한다. C#이나 자바스크립트를 사용한 경험이 있고, 유니티 3D 에디터 내부에 간단한 애셋을 만드는 데 무리가 없다면 가장 좋다. 유니티 3D의 기본적인 사용 방법에 관한 지식을 얻고 싶다면, 유니티에 관한 기초 서적들을 참고하자.

이 책의 구성

1장, 디퓨즈 셰이딩: 유니티 3D 셰이더를 구성하는 방법과 셰이더 작성의 기초를 배운다. 그런 다음 기본적인 디퓨즈 라이팅을 만들기 위한 지식을 공부하고, 업계로부터 사용자 정의 디퓨즈 라이팅을 만드는 데 필요한 팁과 유용한 정보를 얻는다

2장, 이펙트를 위한 텍스처 활용: 다양한 이펙트를 만들기 위해 텍스처 활용 방법을 설명한다. 셰이더를 더 효율적으로 만들기 위해 텍스처 채널을 활용하는 방법을 비롯해, 셰이더를 통해 스프라이트 시트에 있는 텍스처에 애니메이션 이펙트를 적용하는 방법을 배운다.

3장, 스페큘러로 게임을 빛나게 만들기: 가장 널리 사용되는 스페큘러 타입인 블린(Blinn)과 퐁(Phong)을 만드는 데 필요한 지식을 모두 배울 수 있다. 마스킹(masking) 처리된 스페큘러, 금속 재질의 스페큘러를 생성하는 셰이더 이펙트를 어떻게 적용하는지 배우고, 비등방성(anisotropic) 스페큘러를 생성하는 기술도 배운다. 3장을 다 배우고 나면, 사용자 정의 셰이더를 위해 사용자 정의 스페큘러 이펙트를 만들 수 있다는 충분한 자신감을 느낄 것이다.

4장, 월드에 리플렉션 적용: 최신 게임에서 가장 인기 있는 이펙트 중 하나를 들여다보고 셰이더 안에 리플렉션 기술을 통합한다. C#을 사용해 간단한 사용자 정의 다이내믹 리플렉션 시스템을 설정하기 위해 유니티 3D 셰이더의 리플렉션 기초에 대해 배운다.

5장, 라이팅 모델: 더욱 복잡한 셰이더를 만드는 과정을 시작한다. 사용자 정의 서피스 타입을 만들기 위해 사용자 정의 라이팅 모델을 생성하는 방법을 배운다. 각 예제는 다른 작업을 수행하기 위한 각기 다른 기법을 보여주며, 이를 통해 셰이더 작성 기술을 향상시킬 수 있다. 5장을 다 배우고 나면, 사용자 정의 스킨 셰이더(skin shader), 사용자 정의 릿 스피어 셰이더(Lit Sphere shader), 사용자 정의 차량 페인트 셰이더(vehicle paint shader)를 만들 수 있을 것이다.

6장, 투명도: 제작을 할 때 투명도가 필요함을 보여준다. 거의 모든 게임에서 GUI, 단풍, 도안 등에 어느 정도의 투명도를 사용한다. 6장에서는 유니티 3D의 투명도를 사용하는 방법과 투명도를 통합할 때 발생할 수 있는 문제를 처리하는 방법을 배운다.

7장, 정점 마법: 3D 메시(mesh)의 각 정점에 저장된 정보에 접근하는 방법을 다룬다. 저장된 정보를 가져오는 방법을 알아보고, 텍스처 블렌딩과 애니메이션 같은 이펙트를 생성하는 셰이더에 활용한다.

8장, 모바일 셰이더 조정: 셰이더의 오버헤드(overhead)를 줄이기 위해 유니티 3D의 내장 플래그와 값을 활용할 수 있는 방법을 알아본다. 이는 모바일 플랫폼에서 셰이더를 처리할 때 특히 중요하다.

9장, CgInclude로 셰이더 월드 모듈러 만들기: 셰이더를 효율적으로 작성하기 위해, 반복해서 작성한 코드를 재사용하는 방법을 배운다. 9장에서는 재사용을 위해 반복적인 코드를 모두 저장할 수 있는 사용자 정의 CgInclude 파일을 만드는 방법을 보여준다.

10장, 유니티 렌더 텍스처를 이용한 화면 효과: 게임의 최종 렌더링된 이미지를 변경하기 위해 때때로 포스트 이펙트라는 화면 효과를 최신 게임에서 어떻게 활용하는지 살펴본다. 사용자 정의 화면 효과를 만드는 방법을 배우고, 게임에서 다양한 시각적 효과를 생성하기 위한 색상 조절과 텍스처 오버레이를 추가하는 방법, 그리고 그 속에 숨겨진 비밀을 배울 수 있다.

11장, 게임 플레이와 화면 효과: 화면 효과에 대한 지식을 한 단계 발전시키고, 게임의 한 순간을 고조시키는 화면 효과를 생성하는 방법을 보여준다. 오래된 영화 효과뿐 아니라 야시경 화면 효과를 만드는 방법도 배운다

본문에 쓰인 컬러 이미지는 여기에서 내려 받으세요.

저자/역자 소개

지은이의 말

『유니티 Shader와 Effect 제작』을 펴든 독자 여러분을 환영한다! 이 책은 유니티 3D에 있는 셰이더와 포스트 이펙트(post effect) 제작에 친숙해지기 위한 안내자 역할을 한다. 가장 기본적인 셰이더를 생성하고 셰이더 코드가 어떻게 구성되어 있는지 배우는 여정을 시작한다. 이러한 기초 지식은 각 장을 통해 더 발전할 수 있는 수단이 되며, 인간의 피부를 시뮬레이션할 수 있는 셰이더와 동적 반사를 처리하는 셰이더를 생성하고, 야시경 같은 포스트 이펙트를 개발할 수 있다.

각 장을 마칠 때마다 셰이더의 품질을 향상시키고 작성 과정을 더 효율적으로 만들어주는 새로운 기술을 배울 수 있다. 각 장은 초보자부터 전문가까지 특정 기술을 배울 수 있도록 맞춰져 있다. 또 유니티 셰이더를 처음 작성해보는 사람들은, 각 장을 따라 하며 지식을 쌓을 수 있다. 어느 쪽이든 최신 게임의 비주얼을 만드는 방법에 대한 기술을 배운다.

일단 이 책을 다 보고 나면 새 이펙트를 생성할 수 있고, 셰이더를 추가할 때 성능에 대한 요구사항을 고민할 수 있을 뿐 아니라, 유니티 3D 게임에서 사용할 수 있는 일련의 셰이더를 갖게 될 것이다. 그럼, 시작해보자!

지은이 소개

케니 람머스 (Kenny Lammers)

13년간 게임 업계에 종사 중인 람머스는 마이크로소프트(Microsoft), 액티비전(Activision), 최근에는 서리얼 소프트웨어(Surreal Software) 회사 등에서 근무했다. 현재 크리에이티브 TD(Creative TD)와 오존 인터랙티브(Ozone Interactive), 2개 회사를 운영하고 있다. 크리에이티브 TD는 IGT, 마이크로소프트, 야누스 연구소(Janus Research), 알레고리드믹(Allegorithmic) 등을 위해 유니티 3D 컨설팅과 애셋을 만드는 회사이며, 비즈니스 파트너인 노아 카보(Noah Kaarbo)와 공동 창업, 운영하는 오존 인터랙티브는 아마존(Amazon), 이라인 미디어(E-line Media), 마이크로소프트, 써커 펀치(Sucker Punch) 회사 등을 위해 유니티 3D에 초점을 맞춘 인터랙티브 애플리케이션과 고품질의 디자인 제작을 전문으로 하는 회사다. 람머스는 그간 게임 업계에서 지브러시(Zbrush)와 마야(Maya)를 사용해 캐릭터를 생성하고, 실시간 셰이더와 포스트 효과를 작성하고, C#을 사용해 유니티 3D로 전체 게임을 프로그래밍해오는 등의 다양한 경험을 쌓았다. 현재 몇 가지 게임을 작업하고 있으며, 유니티에서 신속하게 게임을 제작하기 위한 툴을 개발하고 있다.

옮긴이의 말

얼마 전 있었던 게임 개발자 컨퍼런스(GDC, Game Developers Conference) 2014에서 유니티5가 최초로 공개됐다. 유니티5에서 선보이는 새로운 기능 중에서 가장 눈에 띄는 건 물리 기반 셰이딩(shading)이라고 할 수 있다. 사실 게임을 플레이하는 사용자들이 재미를 느끼는 요인 중 하나는 AAA급의 실물 같은 그래픽이다. 이런 점에 비춰볼 때, 게임을 만들 때 그래픽 요소는 가장 중요한 항목 중 하나라고 할 수 있다. 시중에 나와 있는 유니티 게임 개발 서적들을 보면, 간단한 게임 예제가 많이 들어있다. 유니티를 처음 다루는 사람들은 책에 포함된 게임들을 만들어보면서 유니티의 사용법을 익히고 게임을 만드는 방법을 배울 수 있기 때문에 이런 책들은 초보자들에게 매우 좋은 책이라고 할 수 있다. 사실 유니티에서 셰이더를 만들지 않더라도 게임을 만들 수 있다. 그렇다면 셰이더를 배우는 이유는 무엇일까? 예를 들어, 게임에서 물이 흔들리는 장면을 만들어야 된다고 상상해보자. 실제로 물이 흔들리는 애니메이션을 직접 만들면, 만드는 데 시간도 오래 걸리고 애니메이션을 보여주는 데 들어가는 리소스가 많다. 이때 만약 셰이더에 관한 지식이 있으면 움직이지 않는 물 텍스처를 쓰면서 셰이더를 이용해 흔들리는 것 같은 이펙트를 줄 수 있다. 이처럼 적은 리소스로 동일한 결과를 보여줄 수도 있다.

이 책은 유니티를 처음 다루는 사용자를 위한 책은 아니다. 이 책의 내용을 살펴보기 위해서는 기본적인 유니티 사용법을 알고 있어야 한다. 그렇지만 아주 깊은 내용까지 알아야 할 필요는 없기에, 대략적으로 게임 오브젝트, 머티리얼, 셰이더 등이 무엇인지만 알고 있으며 간단한 스크립트를 작성할 수 있는 지식이 있다면 이 책을 보는 데 큰 무리가 없다.

이 책은 본격적으로 유니티의 셰이더와 이펙트를 다루는 책이다. 유니티에서 처음 셰이더를 사용하는 개발자를 위해 기본적인 라이팅을 시작으로 고품질의 3D 모바일 게임에서 볼 수 있는 멋진 화면 효과, 노멀 매핑, 이미지 기반의 라이팅, 그리고 셰이더 내부에서 모델의 애니메이션을 동작하게 만드는 방법을 다루는 예제도 볼 수 있다. 시중에 유니티 셰이더를 다루는 책이 없기에, 이 책이 처음 셰이더를 사용하려는 독자에게 매우 유용할 것이라고 확신한다.

옥 찬 호

옮긴이 소개

옥찬호

경북대학교 IT대학 컴퓨터학부를 거쳐, KAIST 전산학과에서 석사 과정을 밟고 있다. C++와 게임 (엔진) 개발, 컴퓨터 그래픽스에 관심이 많다. 현재 페이스북 C++ Korea 그룹을 운영하며, 번역가로도 활동 중이다. 또한 중고등학생들을 대상으로 IT 관련 스터디와 멘토링을 진행하는 등 꿈나무을 육성하는 데 힘을 쏟고 있다. 옮긴 책으로 『게임샐러드로 코드 한 줄 없이 게임 만들기』 (에이콘출판, 2013)가 있다.

목차

목차
  • 1장 디퓨즈 셰이딩
    • 개요
    • 기본적인 서피스 셰이더 만들기
    • 서피스 셰이더에 프로퍼티 추가
    • 서피스 셰이더의 프로퍼티 사용
    • 사용자 정의 디퓨즈 라이팅 모델 만들기
    • 하프 램버트 라이팅 모델 만들기
    • 디퓨즈 셰이딩을 제어하는 램프 텍스처 만들기
    • 2D 램프 텍스처를 사용해 가짜 BRDF 만들기

  • 2장 이펙트를 위한 텍스처 활용
    • 개요
    • UV 값을 수정해 텍스처 스크롤링하기
    • 스프라이트 시트에 애니메이션 적용
    • 텍스처의 패킹과 블렌딩
    • 노멀 매핑
    • 유니티 에디터에서 프로시저 텍스처 만들기
    • 포토샵 레벨 이펙트 만들기

  • 3장 스페큘러로 게임을 빛나게 만들기
    • 개요
    • 유니티 3D의 내장 스페큘러 타입 활용
    • 퐁 스페큘러 타입 만들기
    • 블린 퐁 스페큘러 타입 만들기
    • 텍스처에 스페큘러 마스킹하기
    • 머텔릭과 소프트 스페큘러
    • 비등방성 스페큘러 타입 만들기

  • 4장 월드에 리플렉션 적용
    • 유니티 3D의 큐브 맵 만들기
    • 유니티 3D의 간단한 큐브 맵 리플렉션
    • 유니티 3D의 리플렉션 마스킹
    • 유니티 3D의 노멀 맵과 리플렉션
    • 유니티 3D의 프레넬 리플렉션
    • 유니티 3D의 간단한 동적 큐브 맵 시스템 만들기

  • 5장 라이팅 모델
    • 개요
    • 릿 스피어 라이팅 모델
    • 디퓨즈 컨벌루션 라이팅 모델
    • 차량 페인트 라이팅 모델
    • 스킨 셰이더
    • 천 셰이더

  • 6장 투명도
    • 개요
    • 알파 값을 갖는 투명도 만들기
    • 트랜스페어런트 컷오프 셰이더
    • 렌더 큐를 이용한 깊이 정렬
    • GUI와 투명도

  • 7장 정점 마법
    • 개요
    • 서피스 셰이더에서의 정점 색상 접근
    • 서피스 셰이더에서의 정점 애니메이션 적용
    • 터레인에 정점 색상 사용

  • 8장 모바일 셰이더 조정
    • 개요
    • 저렴한 셰이더란 무엇인가?
    • 셰이더 프로파일링
    • 모바일을 위한 셰이더 수정

  • 9장 CgInclude로 셰이더 월드 모듈러 만들기
    • 개요
    • 유니티에 빌드되어 있는 CgInclude 파일
    • 라이팅 모델을 저장하기 위한 CgInclude 파일 생성
    • #define 지시자를 통한 셰이더 빌드

  • 10장 유니티 렌더 텍스처를 이용한 화면 효과
    • 개요
    • 화면 효과 스크립트 시스템 설정
    • 화면 효과를 이용한 밝기, 채도, 대비
    • 화면 효과를 이용한 포토샵 느낌의 블렌드 모드
    • 화면 효과를 이용한 오버레이 블렌드 모드

  • 11장 게임 플레이와 화면 효과
    • 개요
    • 오래된 영화 화면 효과 만들기
    • 야시경 화면 효과 만들기

도서 오류 신고

도서 오류 신고

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

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

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

정오표

정오표

2014년 4월 30일 발행분 정오 내용

  • p33: 4행
    _AmbientColor ("Ambient Color", Range(0, 10)) = 2
    → _AmbientColor ("Ambient Color", Color) = (1, 1, 1, 1)

  • p40: 2번 항목 코드 첫 줄
    fixe3 → fixed3

  • p47
    float difLight = dot(a.Normal, lightDir);
    → float difLight = dot(s.Normal, lightDir);

  • p51
    float difLight = dot(s.Normal, lightDir);
    float hLambert = difLight * 0.5 + 0.5;

    float difLight = dot(s.Normal, lightDir);
    float rimLight = dot(s.Normal, viewDir);
    float hLambert = difLight * 0.5 + 0.5;

  • p63: 5번 일부 삭제
    마지막으로, 스프라이트 시트의 x 방향에 넣을 수 있는 오프셋 UV를 만든다. 이제 책을 넘기는 듯한 이펙트를 만드는 셰이더를 갖게 됐다.

  • p84: 1행
    이제 모든 값을 1.0 위 또는 0.0 아래로 만들지 않아야 한다. 따라서~

    이제 모든 값은 0.0~1.0 사이의 값으로 만들어야 한다. 따라서~

  • p85: 15, 17, 18행
    float rightDirection = Vector2.Dot (pixelDirection, Vector3.right) / 360;
    float leftDirection = Vector2.Dot (pixelDirection, Vector3.left) / 360;
    float upDirection = Vector2.Dot (pixelDirection, Vector3.up) / 360;

    float rightDirection = Vector2.Angle (pixelDirection, Vector3.right) / 360;
    float leftDirection = Vector2.Angle (pixelDirection, Vector3.left) / 360;
    float upDirection = Vector2.Angle (pixelDirection, Vector3.up) / 360;

  • p86: 6행
    포토샵에서 찾을 수 있는 다른 모든 이미지 편집 도구와 블렌딩 모드는 ~

    포토샵 등의 모든 이미지 편집 도구에서 찾을 수 있는 블렌딩 모드는 ~

  • p124: 2행
    비등방성 노멀 맵으로부터 픽셀 단위 정보를 얻기 위해, 그리고 서피스 셰이더에서 할 수 있는 유일한 방법은~

    비등방성 노멀 맵으로부터 픽셀 단위 정보를 얻기 위해 서피스 셰이더에서 할 수 있는 유일한 방법은~

  • p137: 4번
    textCUBE()
    → texCUBE()

  • p290: 3번
    ~스크립트에 복사해야 한다. 이를 통해 밝기, 채도, 대비 효과를 위한 수학에 초점을 맞출 수 있다.

    ~스크립트에 복사해야 한다. 곱하기 연산을 위한 수학에 초점을 맞출 수 있다.

  • p301: 2행
    분명히 오버레이 블렌드 모드는 더 많이 복잡하지만, 함수를 해부해보면 곱하기 블렌드 모드와 스크린 블렌드 모드 모두 간단하다는 사실을 알 수 있을 것이다. 이 경우 단지 하나 또는 다른 블렌드 모드를 적용하기 위해 조건 검사를 하고 있을 뿐이다.

    분명히 오버레이 블렌드 모드는 더 많이 복잡하지만, 함수를 해부해 보면 조건 검사를 한 후 적용할 블렌드 모드를 선택할 뿐이다.

2015. 8. 17 수정사항

[p.83 : 2행]
만약 머티리얼이 있다면, -> 만약 머티리얼이 할당되어 있지 않다면,

2015. 11. 27 수정사항

2015. 12. 7 수정사항

[p. 186: 아래에서 8행]

[p.200: 그림]
녹색 채널 알파 값=c.r -> 녹색 채널 알파 값=c.g

청색 채널 알파 값=c.r -> 청색 채널 알파 값=c.b