[Unity] 메쉬필터를 통한 반전된 오브젝트의 노말맵 수정

Filed under tutorials, unity | Comments Off

(Flipping Normal Map Through MeshFilter)

유니티 에디터에서 미러(Mirror) 복사를 위해 Transform의 Scale X에 -1을 사용하는 경우가 있다.

Normal_00

이 방식으로 오브젝트의 좌우가 반전된 복사본을 만들 수 있다. 그런데 한 가지 문제가 있다. 오브젝트 Transform의 Scale 값이 반전되면서 Normal 맵이 뒤집혀 보이게 된다.

Normal_01

미러 복사된 오브젝트에 사용할, G 채널이 반전된 노말맵을 따로 만들거나, 노말맵의 반전시키는 셰이더를 작성해서 문제를 해결할 수 있다. 참고로 셰이더 포지(Shader Forge)를 이용해서 간단하게 노말맵을 반전시켰다. 

Normal_02

Normal_03

이러한 방법과는 달리 반전된 메쉬의 MeshFilter 컴포넌트를 이용해서 각 버텍스의 tangent.w를 반전시켜서 문제를 해결할 수도 있다. 다음 스크립트를 반전된 오브젝트에 적용하고, 유니티를 실행한다.

 

using UnityEngine;
using System.Collections;

public class MeshNormalFlipper : MonoBehaviour {

	private Mesh mesh;
	private Vector4[] tangents;

	void Awake () {

		mesh = GetComponent<MeshFilter>().mesh;
		tangents = mesh.tangents;

		int i = 0;

		while(i < tangents.Length){

			tangents[i].w = tangents[i].w * -1;

			i++;
		}

		mesh.tangents = tangents;

	}

}

반전된 오브젝트의 노말맵이 제대로 그려진다.

Normal_04

ContextMenu를 이용하면 에디터에서 메쉬 tangents를 반전하고, 그 상태로 씬을 저장할 수 있다.

[ContextMenu("Flip")]
	void Flip () {

		mesh = GetComponent<MeshFilter>().mesh;
		tangents = mesh.tangents;

		int i = 0;

		while(i < tangents.Length){

			tangents[i].w = tangents[i].w * -1;

			i++;
		}

		mesh.tangents = tangents;

	}
Normal_05

Comments are closed.