'Unity3D/Tip'에 해당되는 글 14건

  1. 2017.04.27 [Unity3D] 비균등스케일 (non-uniform scale)
  2. 2017.04.25 [Unity3D] 셰이더 및 물리 기반 셰이딩
  3. 2017.04.21 [Unity3D] Sprite 동적할당.
  4. 2017.03.16 [Unity3D] 배칭 & 드로우콜

[Unity3D] 비균등스케일 (non-uniform scale)


실제 게임 개발 시 외부에서 불러들인 모든 3D모델의 스케일은 반드시 FBX importer의 Scale Factor 속성으로 맞춰야 한다.

만약 Transform Scale 속성을 직접 수정하게 되면 매 프레임 마다 수정된 스케일에 맞게 복사복을 생성하는 작업을

내부적으로 수행하기 때문에 CPU 연산이 많아져 속도 저하의 원인이 된다.



[Unity3D] 셰이더 및 물리 기반 셰이딩

셰이더는 머테리얼에 적용한 텍스처를 렌더링할 때 표면의 재질감을 표현하는 방식을 결정한다.

셰이더 프로그래밍은 DirectX, OpenGL에 따라 서로 다른 언어로 구현되고, 3D그래픽스의 이론적인 배경을 많이 알아야 할 정도로 깊의 있는 지식을 요구하는 분야이기도 하다.


유니티는 셰이더 프로그래밍 지식이나 경험이 없더라도 손쉽게 사용할 수 있게 내장 셰이더(Built in Shader)를 제공한다.


유니티 5에서 처음 선보인 물리 기반 셰이딩(PBS, Physically-Based-Shading)은 물체가 갖고 있는 고유의 특성에 맞게 재질을 표현하는 것으로 현실세계에 존재하는 돌, 나무, 유리, 플라스틱, 금속 등과 같은 재질감을 하나의 셰이더에서 표현할 수 있도록 설계돼 있다.


유니티 5의 기본 셰이더인 Standard 셰이더는 물리 기반 셰이딩을 위해 다양한 옵션을 제공한다.


1. 렌더링 모드 (Rendering Mode)

2. 알베도 (Albedo)

3. 메탈릭 속성 (Metallic)

4. 노멀 맵 (Normal Map)

5. 하이트 맵 (Height Map)

6. 오클루전 (Occlusion)

7. 이미션 (Emission)

8. 디테일 마스크 (Detail Mask)



1. 렌더링 모드


렌더링 모드는

- 불투명 (Opaque)

- 그물망 표현 (Cutout)

- 홀로그램 효과 (Fade)

- 투명 (Transparent)

의 네가지 설정을 통해 다양한 재질감을 표현할 수 있다.


불투명 (Opaque)

 기본값으로 불투명한 텍스처를 표현하는 옵션이다. 투명한 부분이 전혀없는 Solid객체에 적합.

 그물망 표현 (Cutout)

 불 투명한 부분과 투명한 부분을 동시에 표현하는 옵션. 주로 풀, 그물망 등을 표현.

 투명 (Transparent)

 투명한 플라스틱 또는 유리와 같은 재질을 표현하는 옵션.

 홀로그램 효과 (Fade)

 투명 속성값을 갖고 있는 객체를 페이드 아웃 시키는 옵션.
 페이드 인/아웃을 애니메이션 처리할 수 있다.

 불 투명한 객체를 부분적으로 페이드 아웃시킬 수 있어 홀로그램 효과를 구현할 수 있다. 



2. 알베도


알베도는 빛을 반사하는 정도를 말하며, 반사율이라고도 한다.

유니티 5에 도입된 물리 기반 셰이딩을 구현하기 위해 추가된 텍스처다.

즉, 현실세계에 있는 모든 물체는 각각 다른 빛 반사율을 갖고 있는 것에서 비롯됐다.




3. 메탈릭 속성


메탈릭은 객체 표면에 금속의 재질을 표현하기 위한 텍스처이다.

이 텍스처 슬롯 옆에 있는 슬라이드 값이 1에 가까워 질수록 금속 재질에 가까워 지는 특성이 있다.




4. 노멀 맵


노멀 맵은 표면의 굴곡을 표현하기 위한 텍스처의 일종으로 3D 모델링으로 많은 폴리곤을 소모하지 않고 같은 효과를 낼 수 있다. 노멀 맵 텍스처 슬롯 오른쪽에 있는 속성 값이 커질 수록 거친 음영효과를 낸다.




5. 하이트 맵

하이트 맵은 텍스처로 높 낮이를 표현하는 것으로 보통 지형(Terraun)을 표시할 때 사용된다.

텍스처가 연결되면 슬라이드가 표시되고 돌출되는 높이를 설정할 수 있다.




6. 오클루전

오클루전은 흑백의 텍스처로 간접조명에 의해 생기는 명암을 더욱 뚜렷히 표시해 사물의 입체감과 깊이감을 살리는데 사용한다.

오클루전 맵에 사용될 텍스처는 일반적으로 3D 모델링 툴 또는 서드 파티 툴에서 추출한다.



7. 이미션

이미션은 스스로 빛을 방출하는 속성을 말한다.

속성값을 변경하면 객체의 표면에서 방출되는 빛의 강도와 빛의 색상을 설정할 수 있는 항목이 나타난다.

또한 하단에 저녁조명에 반영하기 위한 옵션이 나타난다.




8. 디테일 마스크

디테일 마스크는 Secondary Maps에 적용할 마스크를 설정하는 텍스처 슬롯이다.

특정 부분만 좀 더 세부적인 텍스처를 표현할 때 사용된다.



[Unity3D] Sprite 동적할당.

※ Sprite를 public으로 인스펙터창에 노출시킨뒤 드래그로 넣는것이 아닌,

폴더안에 존재하는 이미지의 경로를 받아 할당하는 방법이다.



개발하다보면 Sprite를 변수에 동적으로 넘겨줘야 할때가 있다.



게임 시작 시 'Resources'폴더 안에 있는 1이라는 이미지가 public으로 선언된 Sprite변수인 spr에

동적으로 들어가게 된다.


코드는 이렇다.


1
2
3
4
5
6
public Sprite spr;
 
void Start()
{
    spr = Resources.Load<Sprite>("경로");
}
cs


※ 주의사항

- 이미지는 Resources폴더에 있어야 한다.

이때 폴더 이름은 정확히 Resources여야 한다.

- 이미지의 Texture Type은 Sprite여야 한다.



한 가지더.


만약 이러한 이미지가 있다고 하자.



이 이미지의 모드는 Multiple로써

많은 자식들의 이미지를 가지고 있다.

이 모든 이미지를 동적으로 받고자 한다.


위의 소스를 조금만 수정하면 된다.

밑에와 같이 수정해주자.


1
2
3
4
5
6
public Sprite[] spr;
 
void Start()
{
    spr = Resources.LoadAll<Sprite>("경로/이미지 ");
}
cs


※ 필자같은 경우 경로는 Img폴더에 이미지 이름이 Imgs이므로

spr = Resources.LoadAll<Sprite>("Img/Imgs"); 가 된다.



그리고 게임을 수행하면



위와같이 이미지들이 들어가게 된다.



저렇게 하나의 이미지 말고 폴더안에 존재하는 모든 이미지들을 할당 받고 싶다면

경로/이미지이름 에서 이미지이름을 지워주고 이미지가 존재하는 폴더까지만 경로를 써주면

그 폴더안에 존재하는 모든 이미지들을 모두 받아올수 있게 된다.


1
2
3
4
5
6
public Sprite[] spr;
 
void Start()
{
    spr = Resources.LoadALL<Sprite>("경로");
}
cs




※ Img폴더 안에 있는 모든 이미지를 받아오게 되었다.

[Unity3D] 배칭 & 드로우콜


1. 드로우 콜(Draw Call)

- CPU가 GPU에게 어떠한 물체를 그리라고 요청하는 것.

- 드로우 콜의 개수가 적을수록 가벼운 게임이라 할 수 있다. 기기의 성능에 따라 특정 개수를 넘어가면 프레임 저하가 나타난다.

- 모바일의 경우 100개정도를 상한선으로 잡고있다. (VR은 절반 이하다.)

- 일반적으로 오브젝트를 그릴 때, 오브젝트 단위로 한 개씩 증가한다. 그 외에도 쉐이더에 따라서 추가로 증가 할 수 있다.



2. 배치(Batches)

- Draw Call과 혼용하여 사용하지만, 사실 드로우 콜을 포함하는 상위 개념이다.

- Draw Call + Set VB/IB + Set Transform + Set Pass Call 


※ Set Pass Call = Set Shader + Set Texture 0 ~ 7 + Set Blending + Set Z enable . . .



※ 배치 개수는 어떻게 결정되는가?


1. 매쉬의 개수 * 라이트의 개수 + 재질의 개수 - 동적 배칭으로 절약된 개수.

2. 파티클은 Material이나 Mesh에 관계없이 개당 1개로 계산된다. (만약, 자식으로 달려있는게 있다면 자식 하나당 1개씩.)



3. Set Pass Call


마테리얼과 쉐이더와 관련된 것에 대한 배치를 말한다.


ex) 마테리얼을 공유하여 사용하는 오브젝트가 1개 있다고 하자.

이때, Batch : 10개, Set Pass Call : 1개

총 Batch : 11개.


ex) 마테리얼이나 쉐이더를 공유하지 않고 따로 사용하는 오브젝트 10개.

이때, Batch : 10개, Set Pass Call : 10개

총 Batch : 20개


이러한 이유 때문에 아틀라스를 활용하여 여러 오브젝트들을 한 개의 Material로 묶어서 Set Pass Call을 줄이는 것이 중요하다.



4. 배칭(Batching)


복수의 드로우 콜을 하나의 드로우 콜로 묶어서 처리하는 작업이다.



※ 동적 배칭 (Dynamic Batching)

 - 동일한 마테리얼을 공유하고, 특정 조건들을 만족했을 때, 유니티에서 자동적으로 일어나는 배칭을 말한다.

 - 정적 배칭에 비해서 조건도 까다롭고 눈에띄는 효율이 아니므로 사실 크게 신경쓰지 않아도 되는 부분이다.

 - 동일한 모델의 모양일 필요가 없다.

 - 큰 효율을 보이는 곳은 파티클과 메쉬쪽이다.


*특정 조건


1. -버텍스 개수가 총 900개 이하의 메쉬만 적용가능.

   - 쉐이더가 정점 위치와 법선이나 다른 UV정보를 사용하면 300이하.

   - 정점위치, 법선, UV0, UV1, 탄젠ㅌ트까지 사용하면 180이하.

   - 해당 제한 값을 넘으면 배칭을 안하는 편이 이득이다.


2. 오브젝트가 Mirror의 Transform 값을 가지고 있으면 함께 배칭 되지 않는다. ex) 스케일 +1, -1

3. 마테리얼의 인스턴스가 다를경우(동일한 마테리얼일 경우도.) 배칭이 이루어 지지 않는다.

4. 동적으로 라이트 매핑된 오브젝트가 동일한 라이트 맵의 위치가 아닌 한 배칭이 이루어 지지 않는다.

5. 멀티 패스 쉐이더는 배칭이 이루어 지지 않는다. ex) 카룬 쉐이더의 아웃라인.

6. Skinned Mesh 사용불가.

7. 리얼타임 쉐도우의 영향을 받는 오브젝트는 배칭이 이루어지지 않는다. (Receive Shadow를 체크 했을 때)



※ 정적 배칭(Static Batching)

 

동일한 마테리얼을 공유하고, 움직이지 않는 오브젝트가 인스펙터창에서 Static을 체크해줄 경우 일어나는 배칭.


- 메쉬를 강제적으로 합쳐서 넘져누는 방식이기 때문에 메모리에 부담을 준다.

너무 규모가 크다면 렌더링 쪽을 희생시키는게 나을 수도 있다.

- 눈에 띄는 효과가 나오기 때문에 CPU파워를 줄일 필요가 있을 경우 꼭 정적 배칭을 사용해야 한다.



※ 드로우 콜이 중요하다면, 모든 배경을 하나로 합쳐 내보내는게 이득일까?


아니다. 배경 중 극히 일부분만이 보일 경우에도 전체를 무조건 그리게 된다.

하지만 모듈화 했을 경우에는 오클루전 컬링과 프러스텀 컬링을 통해 일부 메쉬를 그리지 않게 할 수 있다.

그렇다고 매우 세분화해서 나누면 합치는 과정에서 코스트가 많이 발생하기 때문에 적정한 선에서 시야각에 들어오는

구역별로 나누는 것이 중요하다. 

prev 1 2 next