WinCNT

스크립트로 정점(버텍스) 컬러 변경하기 본문

Unity/Unity 관련

스크립트로 정점(버텍스) 컬러 변경하기

WinCNT_SSS 2023. 3. 17. 18:17

버텍스 컬러에 별도의 정보를 스크립트를 미리 Bake하려는 작업을 하게 되었다

 

우선 스크립트에서 버텍스 컬러를 변경하는 방법을 찾아봤는데

실제로 사용했던 방법을 간단히 정리해보고자 한자


Mesh.SetColors()

결론부터 말하자면 변경하려는 Mesh의 SetColors()이란 함수를 사용하면 된다

SetColors()의 파라미터는 각 버텍스에 대해 지정할 색의 배열이다

(즉, 색의 배열의 크기는 Mesh의 버텍스 개수와 같아야 한다)

 

참고로 유니티에서 버텍스 컬러의 정보는 MeshFilter의 sharedMesh에 있다

예를 들면 다음과 같다

// GameObject의 Mesh에서 sharedMesh를 취득
Mesh mesh = GetComponent<MeshFilter>().sharedMesh;

// 색 배열
Color[] vertCol = new Color[mesh.vertices.Length];
for (int i = 0; i < vertCol.Length; i++)
{
		// 버텍스마다 색 지정하는 처리를 적당히 추가...
	  switch (i % 3)
	  {
	      case 0:
	          vertCol[i] = Color.red;
	          break;
	      case 1:
	          vertCol[i] = Color.green;
	          break;
	      case 2:
	          vertCol[i] = Color.blue;
	          break;
	  }
}

// Vertex Color를 변경
mesh.SetColors(vertCol);

위의 소스 코드가 작동한 Mesh는 아래와 같은 결과가 된다

(정확히는 버텍스 컬러를 출력하는 셰이더의 머테리얼을 적용해야 하지만 여기선 생략)


알게 된 주의점

MeshFilter의 mesh

참고로 MeshFilter의 mesh에도 버텍스의 정보가 있으며 색 변경도 가능하다

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

단, 에디터 모드인 상태에서 색 변경을 하면 다음과 같은 경고가 나타난다

Instantiating mesh due to calling MeshFilter.mesh during edit mode. This will leak meshes. Please use MeshFilter.sharedMesh instead.

실제로 에디터 모드에서 변경하면 Mesh Filter의 Mesh가 새로 생성된 Instance로 바뀌는 것을 볼 수 있었다

아무튼 MeshFilter.sharedMesh를 사용하도록 하자

유니티 종료 시하면 변경된 값이 초기화되는 현상

MeshFilter.sharedMesh를 사용하더라도 유니티를 종료하면 변경한 내용들이 초기화 된다

이는 SetColors()가 기동 중인 유니티의 Mesh를 변경하는 것일 뿐, 실제의 모델링 데이터 자체를 변경하는 것은 아니기 때문이(라고 생각된)다

 

변경된 내용을 저장하려면 별도의 처리가 필요한 것 같다

딱히 지금 필요한 것은 아니기 때문에 참고 사이트만 찾아서 아래에 정리해둬야겠다


마무리

역시 간단히 변경할 수 있어서 쉽게 끝났다

현재의 태스크에 최종적으로 필요한 내용이니 잘 정리해두자


참고 사이트

【Unity】プログラミングで作ったメッシュを頂点カラーで色を塗る方法 - 渋谷ほととぎす通信

 

【Unity】プログラミングで作ったメッシュを頂点カラーで色を塗る方法 - 渋谷ほととぎす通信

頂点には色情報(頂点カラー)を保持できます。この記事ではプログラミングで作ったメッシュを頂点カラーで描画する方法を初心者向けに分かりやすく紹介します。

shibuya24.info

이건 변경한 Mesh를 저장하는 방법(인 것 같다)

【Unity】Mesh Filter の Mesh を保存する - うにてぃブログ

 

【Unity】Mesh Filter の Mesh を保存する - うにてぃブログ

Mesh Fileter の コンテキストメニューで「Save Mesh」を押すと保存先を指定し、Mesh を保存できる 例えば Cube の Mesh を保存するとちゃんと保存できている コード public static class MeshUtil { [MenuItem("CON

hacchi-man.hatenablog.com

自前作成した mesh は AssetDatabase に保存しないと Prefab 化した時に mesh データが失われる - 強火で進め