프로그래밍 농장

쉐이더 [Unity] 본문

Unity

쉐이더 [Unity]

Tennessee201 2022. 8. 18.
728x90

빛이라는 개념은 물체가 빛을 받았을떄 3가지로 이루어진다.

1. 정반사 ( Speculer )

2. 난반사

3. 환경광 (constant한 상수값) 

 

빛의 총량이 1 이라고 했을떄 

-> 100% (1) = 정반사(입사각=반사각) + 환경광 + 난반사(그 외의 것)

 

정반사 <-> 난반사  (반비례)

 

정반사 100% -> 내가 쏜빛이 그대로 비추게 됨 : 거울을 구현가능 

난반사 100% -> 'Ambient' : 본 물체의 색깔을 뱉음 

환경광(Ambient) / 정반사(Specular) / 난반사(Diffuse)

 

위의 내용들을 활용하여 구현한 것이 '쉐이더'이다. 

Legacy Shader는 위의 광,반사값들을 하나하나 설정해주어서 구현해놓은 것이다. 

하지만 이제는 Standard에서 물리기반으로 값들을 전부 합쳐놓은 것을 사용한다. (사실적인 그래픽 구현가능) 


- Albedo : 원래 물체의 색상

-> 기존의 Legacy Shader의 경우에는 Albedo가 없고 MainColor라는 남반사 자체의 색상을 설정했었다. 

Standard


- UV Set


- Metalic

왠만하면 1 또는 0 을 쓴다 -> 금속 or not금속  -> + Specular를 통해 재질 등의 설정을 가능 

metalic : 1 / smoothness :1

도자기(seramic) : 비금속(metalic:0)이면서 smoothness가 1

거울 : 금속(metalic:1)이면서 smoothness가 0 

위와 같은 개념은 아래의 도표에서 공식문서화 되어있어서 참고할수있다. 

유니티에서 제공하는 쉐이더 값 차트


일반 큐브(평면 6면) 에 Alebo(색상)만을 적용했을때 

 

일반 큐브에 Alebo를 적용하고 Normal Map에 Texture를 적용하였을떄

( Texture의 RGB값에 따른 입체적인 효과를 얻을수 있다 ) 

위와 같이 RGB 값을 통해 입체감을 넣어놓은 Normal Map Texture

위와 같이 Normal Map에 들어갈 RGB값을 조절한 Texture들만을 Normal Map에 넣어서 사용할수있으며, 아래와 같이 해당 Texture Type은Normal Map으로 바꾸어 주는것이 좋다. ( 경고가 뜰수있다. )

 

 

직접 포토샵으로 Normal Map을 만드는 사이트 

 


- Depth Map ( 깊이 맵 )


- Emission ( 발광 ) 


- Tilling ( 한 타일당 Texture를 그려줄 횟수 )

Tilling 1,1
Tilling 3,3


- Camera 에서의 랜더링 / 쉐이더 설정 

 

 

Deferred : 빛 후처리 방식 ( 쉐이더의 설정을 이에 맞게 바꾸어야함)

 

URP를 쓰지않는다는 전제하에는 Standard를 사용하는것이  유니티 내부에서 먼저 전처리를 한 후에 뽑아주기때문에 사용하기 용이하다. 

그렇다면 Standard를 사양적으로 접근해보자.

 

아래와 같이 스크립트상에서 설정해줄수있다.

ex) 게임과 같은 멀티플랫폼환경에서의 프로젝트를 구현할때 아래와 같이 그래픽 티어를 지정해줄수있다.

( 어떤 기기나 환경일시에 어떤 그래픽 티어를 수행시킬지 ,, 혹은 설정에서 그래픽 사양을 조절할때 ,, ) 

 

- Shadow Cascade 

: 케스케이드의 값이 더 많아 질수록 그림자에 따른 더 섬세한 표현을 할수있다. 

 

-> URP에서는 Standard Shadr를 만들수없고, 전부 별도로 만들어야한다.

ex)  URP에서 일반 Standard shader를 사용하려하면 전부 마젠타색으로 깨지는것을 확인할수있는데 이 문제이다. 


- Directional Light 

 


- Audio Listener 와 Camera의 거리에 비례하여 소리의 크기가 달라진다. 

Force To Mono : 기존 Audio Listener의 경우 L,R(좌,우) 값이 다르게 주어질수있지만, Mono를 체크해주면 해당 사운드값이 통일된다. 


ShaderLab : 유니티가 정의해놓은 Wrapper ( 일반화 -> 사용성 제약 )

cg : ( c for graphic ) : 그래픽을 위한 c언어 

Glls ( OpenGL Shader Language) : 

Hlsl ( High level Shader Language ) : 

 

URP (Universal Render Pipeline)


- 유니티 쉐이더 

Vert / Frag shader - vertex / fragnent

Surface shader - PBR(물리기반)

 

 

Shader를 쓰는 Material 이 있고,  이 Material을 쓰는 Object가 있을것이다.

 

아래와 같이 CGPROGRAM 을 적어주면 그아래로 해당 함수들을 선언 및 사용하겠다는 뜻이다. 

 

Vertex에 대한 정의를 낾 -> vertex를 태움 -> vertex에 대한 후처리 수행 -> Rasterization

Render Pipeline

 

vertexShader를 쓸때 : 텍스쳐에 대한 

fragmentShader를 쓸때 : 색상에 대한 작업 ( 투명도 . . ) 

 

--> 위 두개가 섞여서 나오는것이 최종적인 Shader 파일이다 .


cutoff : 일정값이 넘으면 해당 현상이 일어나지 않도록 하는것 

 

// additive : 빛 끼리의 합 -> r,g,b + r,g,b      :  but, 색들이 섞이지는 않음
            // Multiply : 빛 끼리의 곱 -> r,g,b (src) * r,g,b(src)  :  감소연산 : 어둡게 할때 스임
            //Substractive : r,g,b - r,g,b  : 어둡게 할때 쓰임 

 

 

 

 

 

728x90