책 소개
요약
이 책은 유니티 셰이더를 처음 접하는 개발자를 위한 유니티 셰이더와 이펙트 입문서다. 상세한 설명과 예제 파일을 통해, 셰이더의 품질을 향상시키고 작성 과정을 효율화할 수 있는 새로운 기술을 배운다. 이 책을 통해 독자가 원하는 새로운 이펙트를 생성하고 고성능을 위한 셰이더 최적화를 고민해 볼 수 있다.
이 책에서 다루는 내용
■ 복잡하고 성능이 무거운 조명 리그(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장, 게임 플레이와 화면 효과: 화면 효과에 대한 지식을 한 단계 발전시키고, 게임의 한 순간을 고조시키는 화면 효과를 생성하는 방법을 보여준다. 오래된 영화 효과뿐 아니라 야시경 화면 효과를 만드는 방법도 배운다
본문에 쓰인 컬러 이미지는 여기에서 내려 받으세요.
목차
목차
- 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장 게임 플레이와 화면 효과
- 개요
- 오래된 영화 화면 효과 만들기
- 야시경 화면 효과 만들기
도서 오류 신고
정오표
정오표
2014년 4월 30일 발행분 정오 내용
p33: 4행
_AmbientColor ("Ambient Color", Range(0, 10)) = 2
→ _AmbientColor ("Ambient Color", Color) = (1, 1, 1, 1)p40: 2번 항목 코드 첫 줄
fixe3 → fixed3p47
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