XR 플밍 - 9. UnityEngine3D 응용 프로그래밍 - 그래픽 요소 이론과 모델링, 레이어 마스크, 랜더링 텍스쳐 (5/9)

이형원·2025년 5월 9일
0

XR플밍

목록 보기
68/214

1. 다면체의 구성 요소

다면체는 점, 선, 면으로 구성된다.

  • Vertex
    물체의 가장 기본이 되는 점이다.

  • Polygon
    물체를 이루는 최소의 면 단위이다. 복잡한 모양을 나타낼 수 있으면서 가장 안정적이고 간단한 연산을 위해 삼각형으로 지정된다.
    그래픽 모델에서 가장 작은 면 단위는 폴리곤이며, 모든 모델은 삼각형이 모여 만든다.
    폴리곤(면)의 방향을 표현하기 위해 버텍스를 반시계 방향으로 돌며 벡터의 외적을 사용한다.

  • Mesh
    폴리곤 무리가 모여서 만들어지는 하나의 물체 덩어리이다. '형체를 가지고 있는' 모든 게임 오브젝트가 이와 같은 형태를 가진다.

정리하자면, Mesh는 Polygon으로 이뤄져 있고, Polygon은 Vertex를 기반으로 생성된다.

이 내용은 후에 다뤄질 렌더링 파이프라인뿐 아니라 게임 그래픽을 이해하기 위해 반드시 알고 있어야 할 개념이다.

2. 게임 그래픽 구성 요소

게임 그래픽을 구성하기 위한 요소들은 다음과 같으며, 게임 개발자라면 반드시 알고 있어야 하는 용어이므로 각 개념을 확실하게 인지하도록 한다.

  • Texture
    모델의 표면에 대한 이미지 정보를 가지고 있다. 메시는 데이터로만 존재할 뿐, 외형이 존재하지 않기 때문에 각 폴리곤에 대한 좌표를 미리 맵핑(UV Mapping)하고, 각 좌표에 맞춰 메쉬에 마치 옷을 입히듯 이미지를 덧씌워 주는 것이 폴리곤이다.

  • Material
    물체의 표면정보를 종합적으로 가지는 속성이다.
    표면의 색상, 질감, 빛 반사율, 투명도 등을 결정하며, 실감나는 3D 모델의 연출을 위해 사용된다. 같은 색이더라도 다양한 설정을 통해 모델의 표면을 더 실감나게 표현할 수 있다.

  • Shader
    3D 컴퓨터 그래픽에서 최종적으로 화면에 출력하는 픽셀의 색 정보를 지정해 주는 함수(프로그램)이다.
    그래픽의 빠른 연산을 위해 도입됐으며, 렌더링 파이프라인의 종류에 따라 이 셰이더가 다르게 동작하므로, 렌더링 파이프라인 적용 시 반드시 고려하고 확인해야 할 대상이다.

3. 레이어마스크

레이어 마스크는 태그와 비슷하게 오브젝트들을 분류해 관리할 수 있다.
이를 이용하여 특정 오브젝트 분류에 대한 충돌처리, 그리고 선택적으로 미니맵에 표시되는 오브젝트들을 조정할 수 있다.

3.1 레이어마스크와 카메라

각 아이템마다 Layer를 설정해 준다고 해 보자.
(Player는 Player Layer, Monster는 Moster Layer, Item은 Item Layer로 설정해 주었다.)

이때, Layer의 선택적 출력을 통해 아래와 같이, Player만 출력되지 않도록 카메라에서 세팅할 수 있다.

3.2 레이어마스크 사용 예시 - 미니맵 만들기

  1. 미니맵용 카메라를 설정한 후 미니맵 레이어를 추가한다.

  2. 플레이어 및 오브젝트 등의 아이콘을 플레이어와 연결 시켜서 생성한다.

  3. Main 카메라에서는 Minimap 심볼이 보이지 않게 설정한다.

  4. Minimap 카메라에서는 Minimap 심볼만 보이도록 설정한다.

3.3 비트 연산자와 레이어 마스크

레이어마스크에 대해 알아보는 과정 중에 잠시 비트 연산자에 대해 알아보자.

  • | (or) : 이진법의 동일한 자리가 하나만 1이어도 1로 치환
    ex) 1000 0000 | 0000 1000 = 1000 1000

  • & (and) : 이진법의 동일한 자리가 둘 다 1이라면 1로 치환
    ex) 1010 0010 & 0010 0100 = 0010 0000

  • ~ (not) : 0과 1을 반전시킨다
    ~0101 0010 = 1010 1101

여기서 NOT 하고 AND를 엮어서 쓰면 한 가지 레이어만 제외하는 방식으로 레이어를 조작할 수 있다.

아래 코드는 마우스로 누른 오브젝트를 카메라상 시야로 사라지게 하는 기능이다.

using UnityEngine;

public class CameraRaycaster : MonoBehaviour
{
	private Camera _cam;
    
    [Header("Set Raycast Config")]
    [SerializeField][Range(0, 100)] private float _rayDistance = 100;
    [SerializeField] private KeyCode _actionKey = Key
    [SerializeField] private LayerMask _targerLayer;
    
    private void Awake() => Init();
    
    private void Update();
    {
    	RayShoot();
    }
    
    private void Init()
    {
    	_cam = Camera.main;
    }
    
    private void RayShoot()
    {
    	if(!Input.GetKeyDown(_actionKey)) return;
        
        Ray ray = _cam.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        
        if(Physics.Raycast(ray, out hit, _rayDistance, _targetLayer))
        {
        	// Ex) Monster (9 Layer) 를 클릭해서 제외한다고 가정.

			// hitLayerNumber = 9;
			int hitLayerNumber = hit.transform.gameObject.layer;

			// ...0000 0010 0000 0000
			int hitLayer = (1 << hitLayerNumber);

			// ...1111 1101 1111 1111
			int notLayer = ~hitLayer;

			// _cam.cullingMask = ...1111 1111 1111 1111
			// not Layer        = ...1111 1101 1111 1111
			// And             => ...1111 1101 1111 1111
			_cam.cullingMask &= notLayer;
        }
    }
}

여기서 응용으로, LayerUtil을 만들어 보자.

  • 레이어를 추가하거나, 제거할 수 있는 Util
using UnityEngine;

public static class LayerUtil
{
	public static void AddLayer(ref LayerMask target, params string[] names)
    {
    	foreach(string n in names)
        {
        	target |= 1 << LayerMask.NameToLayer(n);
        }
    }
    
    public static void RemoveLayer(ref LayerMask target, params string[] names)
    {
    	foreach(string n in names)
        {
        	target &= ~(1 << LayerMask.NameToLayer(n));
        }
    }
}

4. 랜더링 텍스쳐

랜더링 텍스쳐는 렌더링 되고 있는 화면을 텍스쳐 형태로 저장한 것을 말한다. 이는 게임 최적화의 요소로도 쓰이며, 대표적인 예시로 아래와 같은 사용 예시가 있다.

  • 물이 흐르는 자연 효과를 물이 흐르는 영상으로 미리 녹화해 두고 출력하는 방식
  • 거울, 그림자, 광원, 화면 캡쳐 등

랜더링 텍스쳐의 활용 예시로, 미니맵을 만들어 보자.

우선 아래와 같이 플레이어와 1인칭 시점의 카메라를 세팅해보자.

여기서 미니맵카메라를 만든 후, Projection을 Orthographic으로 설정한다. 이후 Size로 적절한 크기로 설정한다.

Render Texture을 만들고 Minimap이라고 이름을 설정한다.

미니맵카메라의 Target Texture을 Minimap Render Texture로 설정한다.

UI의 Raw Image를 만들고 적절한 위치에 배치한다. 이후 Texture에 아까 만들었던 Render Image를 붙이면 간단하게 미니맵을 만들 수 있다.

이후 레이어마스크를 통해 플레이어의 Minimap 상 표기를 변경할 수 있다.


Player Layer를 해제하고 대신 Player 머리 위의 Layer를 UI로 세팅하여 초록색 점으로 표시한 모습이다. 이는 플레이어가 움직일 때 실시간으로 반영된다.

  • Tip - Render Texture에 연결된 카메라에서 Clear Flags를 Solid Color로 설정하면, 배경은 안 보이게 캐릭터만 나오게 설정할 수 있다. 이걸로 캐릭터 선택 창의 캐릭터 움직임 이미지 출력 등으로 활용할 수 있다.
profile
게임 만들러 코딩 공부중

0개의 댓글