교내 활동/게임그래픽엔진심화

게임그래픽엔진심화 4강 - 키워드, 커스텀 라이팅

NEMORIZE 2022. 9. 30. 20:48

※ 이 게시글은 3월 29일 작성 되었습니다. (원본 링크)

 

1. 셰이더 그래프 심화

 

셰이더 그래프 UV심화

 

ScrollOut

ScrollOut 방식의 텍스처는 검은 색으로 마무리 되어야 한다.

(파티클의 Vertex Alpha와 연동되는 Scroll)

스크롤 아웃은 이펙트 작업을 좀 더 용이하게 해준다.

 

셰이더에서의 나눗셈은 되도록 곱셈으로 계산하는 것이 좀 더 가볍다.

x * 0.5 (x / 2 대신)

 

곱셈보다 나눗셈의 연산이 더 무겁기 때문이다.

그래서 할 수 있다면 최적화의 관점에서 하는 편이 좋다.

 

가능하면 가급적이면 곱셈을 쓰도록 하자.

 

 

 

키워드 (Keyword)

 

정적 분기를 만들 수 있다.

 

키워드에서의 정적 분기란?

 

키워드에 의해 발생되는 분기를 뜻한다.

변수 혹은 함수, Class에 정적 속성을 부여한다.

(Class로부터 객체를 생성하지 않고, 변수 혹은 함수를 불러올 수 있게 해주는 것)

 

 

블랙보드에 키워드 라는게 있는데 이녀석은 약간 다른 프로퍼티랑 다르게

분리되어 있는 느낌인 것이다.

 

키워드를 사용하면 일부 특정 플랫폼에서 서로 다르게 동작하도록 제작할 수 있다.

(특정상황에서 A와 B가 서로 다르게 작동)

 

머터리얼 창에서 인스턴스 옵션을 활성화/비황성화 할 수 있다.

 

 

키워드 - 불린(Boolean)

= 참이냐 아니냐를 결정

 

키워드에 xy는 각각 두 그룹으로 나뉘어 활성화 하면 x, 비활성화 하면y로

작동되게 한다.

(마치 스위치처럼 기본 파일인 Lit 파일에 가보면 베리언트가 현재 몇개인지 볼 수 있다)

 

 

셰이더 그래프 - Node Setting - Scope에 들어가면 세가지 옵션이 있는데,

 

그중에서 Shader Feature, Multi Compile 이 두가지 옵션이 중요하다.

- SF : 재질에 설정된 경우만 컴파일

- MC : 재질과 관계 없이 경우의 수를 모두 컴파일

 

유니티 에디터에서는 베리언트를 그떼그떼 필요에 따라 즉각적으로 셰이더의 베리언트를 컴파일 시킨다.

 

그때 잠깐 파란색으로 임시로 보여지는 모습이다.

 

 

 

2. 커스텀 라이팅

 

간단히 말해서 Lit에서는 자동으로 라이팅이 들어가지만, Unlit은 다르다.

Unlit에서 수동으로 라이팅을 어떻게 걸어줄 것인지를 알아보자.

 

 

커스텀 함수 Custom Function노드

HLSL 코드를 입력할 수 있는 노드이다.

노드를 직적 만들어서 사용 가능하다.

 

반드시 Node Settings Inputs, Outputs

HLSL 코드의 입, 출력과 일치해야한다.

 

Node Settings창을 보면 아래에 Type, Name, Source가 있는데, 각각 어떤기능이냐면

 

Type - 외부 파일을 선택할지, 직접 노드에 HLSL 코드를 입력할지 선택한다.

Name - HLSL 코드의 함수명, HLSL 코드는 비슷한 목적의 함수를 동시에 가지고있을 수 있다.

Source - 외부 파일 애셋을 선택한다. Type이 String일 경우 Body로 바뀐다.

 

 

아 그리고 커스텀 함수 중에 Simple Lambert 라는 것이 있는데,

 

SimpleMainLight 라는 스크립트를 열어보자.

(ShaderGraph > CustomLightingBase > Includes > SimpleMainLight)

 

 

음...... 그렇다고 한다.

 

위에 빨갛게 강조해 놓은 부분이 쉐이더 그래프 창에서 보면, 오른쪽 사진과 같다.

 

커스텀 라이팅 소스를 넣어주면 메인라이트 커스텀펑션에 옵션이 활성화된다.

DistanceAtten

(라이트의 Culling Mask와 관련된 값)

ShadowAtten

 

 

Simple Lambert의 셰이더 그래프는 다음과 같다.

 

이런 식으로 직접 라이팅을 수동으로 계산해 준 모습이다.

 

 

 

다음은 벡터(Vector)를 살펴보자.

Vector - 입체공간에 떠 있는 화살표이다. (길이, 방향을 가짐)

 

보통 원점을 기준으로 본다. (간혹 공중에 떠있기도 함)

(원점은 일단 월드 기준으로 보는데 어떤 특정 오브젝트에 따라 달라지기도 함)

 

디렉셔널라이트를 봐도 라이트의 방향을 나타내는 표시가 빛의 벡터이기도함.

(빛의 방향 벡터)

 

라이트의 방향에 따라 라이트 벡터도 같이 결정된다.

 

라이트의 빛의 길이에 따라 원점으로부터의 좌표 길이가 결정됨.

(방향과 크기)

 

 

Lambert Cosine 법칙

 

 

빛의 각도가 달라지는거에 따라서 빛의 양이 달라진다.

 

또한 동일 면적일 때 빛이 들어오면 입사각에 의해 빛의 양도 달라진다.

 

이 사진을 보면 알 수 있듯이, 45도 각도는 완전한 0.5가 아니다. 0.707인 것을 알 수 있다.

 

 

그리고 강의를 들으면서 교수님께서 꼭 강조하신 부분이 있는데,

바로 코사인(Cosine)이다.

 

어디서 많이 들어본 것 같은데, 고등학교 때 배웠던 것 같다.

기억이 가물가물하다.

 

그래서 간단명료하게 이것 하나만 외우면 된다.

 

Cosine - 직각 삼각형의 빗변 길이가 1일 때 가로 Cos, 세로 Sin

Cosine - 직각 삼각형의 빗변 길이가 1일 때 가로 Cos, 세로 Sin

Cosine - 직각 삼각형의 빗변 길이가 1일 때 가로 Cos, 세로 Sin

Cosine - 직각 삼각형의 빗변 길이가 1일 때 가로 Cos, 세로 Sin

 

귀에 맴돌 때 까지 반복한다.

 

 

Dot Product

Dot Product는 벡터 연산 중 내적에 해당된다.

 

Dot노드 - 면의 방향

 

월드포지션 값을 알아야 빛 방향을 계산할 수 있다.

 

현재 어떤 픽셀에 위치하고 있는지에 대한 정보를 불러온다.

Dot노드 생성, 연결 - Lambert됨.

 

 

Lambert 라이팅 가공해보기

이런 붉은색 느낌을 낼 수 있다.

위로갈 수록 좀 더 밝은 색으로 느낌을 줘 봤다.

 

 

Fog

Fog가 적용된 모습

Fog는 Lerp로 계산한다.

Lerp는 A와 B의 색을 T의 비율로 선형 보간하는 노드(Linear Interpolation)

기존 머터리얼 컬러와는 상관없이 무조건 포그 색으로 보이게 된다.

 

 

마치며...

이번 강의는 3강에 비해서 확실히 난이도가 좀 있었던 것 같습니다.

그런만큼 아직 많이 부족하지만 이렇게 직접 게시글을 올리면서 덩달아 공부도 되고

복습도 어느정도 되새길 수 있었던 시간이었습니다.

 

감사합니다.