집단 AI
- Dictionary
- 1번 그룹에 넣고
- 2번 그룹에 넣고
- 아군들은 감지 안되게 하고, 그 외는 감지가 되게 한다.
- 집단에서 하나가 공격 상태라면, 다른 아군들은 대기상태
- 공격들어가면 2명만 공격하게 한다든지
- 이게 힘들면 나를 따라다니는 아군 AI를 먼저 구현해봐라
- 이거 구현하고 자기 도와주는 아군 NPC를 구현해봐라
- 파이 : 180도
- 파이 r 제곱 : 면적
- 2 파이 r : 원을 둘러싼 점
- 조명 이론 : 스펙큘러, 엠비언트, 등
- 노멀맵 이미지 클릭 - Texture Type (Normal map) Apply
- 노멀맵 : 질감의 입체적인 굴곡 효과를 준다.
조명 - 그래픽 이론
- 평면정보를 출력하는 애 : Material
- 메테리얼 정보를 출력하는데 ‘PBR’을 사용한다.
- PBR
- Metalic
- Smoothless (Roughness 거칠기정도)
- 색을 보여주는 4가지 방법
- Ambient : 사방에서 고르게 들어오는 빛
- 주가 되는 광원 색 (밖에 나가면 태양이 나의 색이고, 실내에 있으면 형광등이 나의 색이다.)
- 낮이면 태양이 노란 빛을 화면에 비추니 오브젝트가 노란 빛을 내고, 석양이 지면 화면에 주황 빛을 준다.
- 어느 방향이든, 어느 거리든 고르게 들어오는 빛이다.
- 전체 씬을 비추는 조명에 사용한다.
- 하늘에서 들어오는 빛과 지면의 색, 풀숲의 빛을 보간하면서, 실제 게임에서는 허리 위를 하늘의 색으로 비추고 허리 밑은 땅의 색으로 비춘다.
- A.C (Ambient Color)
- Diffuse : 내가 가진 색 - 음영 관련 색상
- 이게 순수한 상태 : Albedo (옷이 검정색이라면, 옷의 Albedo는 검정이다.)
- Diffuse.Texture(텍스처(이미지) 색) * Diffuse.Color(보정색) * 음영(그림자는 아니고 빛에 의해 가려지는 부분)
- Nomal Vector(한 면에 수직인 방향) 과 조명의 벡터(노멀벡터에서 빛을 보는 방향의 벡터)의 ‘내적’이 ‘음영’이다.
- 내적은 1 ~ 0으로 각도가 커질수록 내적 값은 작아진다.
- 1이 가장 밝고 0에 가까울수록 빛을 못받은 음영이 진 부분이다.
- 결론 (L.N = Light NomalVector - 조명 수직벡터 / 즉, 음영이다.)
- D.T * D.C * (-L.N) * NomalMap
- Specular : 전반사광
- 스펙큘러용 텍스처를 빼면 재질이나 무늬모양이 안보이고 맨들맨들해진다.
- 시야에 반사된 빛이 보여야하기 떄문에 시야가 필요하다.
- 반사벡터가 필요하다.
- 면에 수직인 노멀벡터에 각을 뒤집는다.
- 이걸 반사벡터 (Reflection Vector)라고 한다.
- 이때 스펙큘러 벡터는 ‘반사벡터와 시야 벡터의 내적’ 각도를 사용한다. ⇒ R.E (Reflection Eye)
- 시야 안에 일정 부분만 빈치 반사되고 그 외의 부분은 반사되지 않는다.
- 파이 r 곱인 이유
- r제곱은 면적을 계산한다.
- 원 외의 부분을 구분하기 위해 ‘파이’를 곱한다.
- r의 승수는 ‘밀도’를 의미한다.
- 1은 ‘반지름’, 2는 ‘면’, 3은 ‘부피’ …등
- 승수가 올라갈수록 면적(면)은 줄어들고 밀도는 증가한다.
- S.T(Specular Texture) * S.C(Specular Color) * Pow((R.E), Shiness)
- 최종적인 식 : S.T(Specular Texture) * S.C(Specular Color) * (R.E)의 pow 처리 * GlobalLight.Specular(지금은 이거말고 PBR을 더한다.)
- Pow : 승수(면적에 가해지는 힘으로 볼 수 있다.) ⇒ 이 값에 따라서 반사된 빛으로 면이 보이는 정도를 정할 수 있다.
- Shiness : 빛의 강도
- GlobalLight.Specular : 빛을 반사하더라도 엠비언트처럼 빛을 주는 주체의 색이 있기 때문이다.
- 레이트레이싱에서 사용한다.
- 필요할때는 조명에 레이트레이싱을 사용하고, 사용 안한고 끈다면 조명만 계산된다.
- Emissive : 외곽선 - 외곽에 빛나는 선
- 배경과 물체의 색이 같을때 구분이 갈 수 있도록 외곽에 구분을 해준다.
- 주체가 물체를 바라보는 시점을 기준으로 보는 물체의 외곽선이다.
- 외과선도 1이 가장 밝고, 0에 가까울수록 어두워진다.
- 1 - (N.E)(Nomal Vector Emissive) ⇒ 외곽선은 각이 클수록 밝아야하기 때문이다.
- SmoothStep : 일정 구간에서 색이 반전되는 기능의 함수다.
- E.C(Emissive Color) * (N.E)
- 이제 각 색들이 나왔으니 이렇게 나온 색 4개는 ‘더한다.(+)’
- 그래야 내 자신색은 어둡지만 강한 빛이 들어오면 밝아져야 하기 때문이다.
- 얘네들을 최종적으로 합친 식
- 조명
float3 direction = -GlobalLight.Direction;
float NdotL = dot(direction, normalize(normal));
output.Ambient = GlobalLight.Ambient * Material.Ambient;
float3 E = normalize(ViewPosition() - wPosition);
[flatten]
if(NdotL > 0.0f)
{
output.Diffuse = Material.Diffuse * NdotL;
[flatten]
if (Material.Specular.a > 0.0f)
{
float3 R = normalize(reflect(-direction, normal));
float RdotE = saturate(dot(R, E));
float specular = pow(RdotE, Material.Specular.a);
output.Specular = Material.Specular * specular * GlobalLight.Specular;
}
}
[flatten]
if (Material.Emissive.a > 0.0f)
{
float NdotE = dot(E, normalize(normal));
float emissive = smoothstep(1.0f - Material.Emissive.a, 1.0f, 1.0f - saturate(NdotE));
output.Emissive = Material.Emissive * emissive;
}
텍스처 종류
- 기본 텍스처는 1D 텍스처다.
- 카툰 렌터링에서 외곽선이 진할때 사용하기도 한다.
- 2D 텍스처는 1D를 여러개를 붙여 한 면을 만든 것이다.
- 3D는 2D의 면을 여러개 만든다.
- Cube는 주사위 박스모양 텍스처다.
- 지역조명
- 전역조명
- SkyBox
- Material 생성 - Shader Skybox - 조절
- WIndow - Rendering - Lighting - Environment - Skybox Material에 만든 Skybox용 메테리얼 넣기
- 스카이박스 셰이더 타입 4개 정리
- 조명
- Window - Rendering - Lighting - Scene - Lighing Settings Asset - New Lighting Settings 클릭
- 빌드 앤 런 (게임 exe 파일 만들기)
- File - Build Setting - Scene 파일 끌어다 놓기 - Build and Run
- 조명 남은 설명