이 페이지에는 메시에 포함된 사항과 Unity가 메시 클래스에 해당 데이터를 저장하는 방법에 대한 정보가 있습니다.
메시는 다음의 프로퍼티로 정의됩니다.
이 외에도 변형이 가능한 메시에는 다음 사항이 포함됩니다.
버텍스 데이터의 요소는 버텍스 속성이라고 합니다.
모든 버텍스는 다음과 같은 속성을 가질 수 있습니다.
내부적으로 모든 버텍스 데이터는 동일한 크기로 되어 있는 별도의 배열로 저장됩니다. 메시에 10개의 버텍스 포지션이 있는 배열이 포함되어 있는 경우 메시가 사용하는 서로 다른 버텍스 속성에 대한 10개의 요소를 가진 배열도 있습니다.
C#에서 Unity는 VertexAttribute 열거형으로 사용 가능한 버텍스 속성을 설명합니다. Mesh
클래스의 인스턴스에 Mesh.HasVertexAttribute 함수를 사용하여 특정 버텍스 속성이 있는지 확인할 수 있습니다.
버텍스 포지션은 오브젝트 공간의 버텍스 포지션을 나타냅니다.
Unity는 이 값을 사용하여 메시 표면을 결정합니다.
이 버텍스 속성은 모든 메시에 필수적입니다.
Mesh
클래스에서 이 데이터에 액세스하는 가장 간단한 방법은 Mesh.GetVertices와 Mesh.SetVertices를 사용하는 것입니다. Unity는 또한 이 데이터를 Mesh.vertices에 저장하지만 이 구형 프로퍼티는 덜 효율적이고 사용자 친화적입니다.
버텍스 노멀은 버텍스 포지션의 표면에서 바로 “밖으로” 가리키는 방향을 나타냅니다.
Unity는 이 값을 사용하여 광원이 메시 표면을 반사하는 방법을 계산합니다.
이 버텍스 속성은 선택 사항입니다.
Mesh
클래스에서 이 데이터에 액세스하는 가장 간단한 방법은 Mesh.GetNormals와 Mesh.SetNormals를 사용하는 것입니다. Unity는 또한 이 데이터를 Mesh.normals에 저장하지만 이 구형 프로퍼티는 덜 효율적이고 사용자 친화적입니다.
버텍스 탄젠트는 버텍스 포지션에서 표면의 “u”(수평 텍스처) 축을 따라 가리키는 방향을 나타냅니다.
Unity는 4 컴포넌트 벡터에 추가 데이터와 버텍스 탄젠트를 저장합니다. 벡터의 x, y, z 컴포넌트는 탄젠트를 설명하며 벡터의 w 컴포넌트는 해당 방향을 설명합니다. Unity는 w 값을 사용하여 바이노멀을 계산하며 이는 탄젠트와 노멀의 외적입니다.
Unity는 노멀 매핑에 탄젠트와 바이노멀 값을 사용합니다.
이 버텍스 속성은 선택 사항입니다.
Mesh
클래스에서 이 데이터에 액세스하는 가장 간단한 방법은 Mesh.GetTangents와 Mesh.SetTangents를 사용하는 것입니다. Unity는 또한 이 데이터를 Mesh.tangents에 저장하지만 이 구형 프로퍼티는 덜 효율적이고 사용자 친화적입니다.
메시는 텍스처 좌표 세트를 8개까지 포함할 수 있습니다. 텍스처 좌표를 보통 UV라고 하며 그 세트를 채널이라고 합니다.
Unity는 메시 주위의 텍스처를 “래핑”할 때 텍스처 좌표를 사용합니다. UV는 텍스처의 어느 부분이 버텍스 포지션에 있는 메시 표면에 맞게 정렬되는지 가리킵니다.
UV 채널은 보통 첫 번째 채널의 경우 “UV0”이라고 하고 두 번째 채널은 “UV1”이라고 하며 이런 식으로 “UV7”까지 있습니다. 채널은 TEXCOORD0
, TEXCOORD1
이렇게 최대 TEXCOORD7
까지 셰이더 시맨틱에 각각 매핑됩니다.
기본적으로 Unity는 첫 번째 채널(UV0)을 사용하여 디퓨즈 맵 및 스페큘러 맵과 같은 일반 텍스처의 UV를 저장합니다.Unity는 두 번째 채널(UV1)을 사용하여 베이크된 라이트맵 UV를 저장하고, 세 번째 채널(UV2)을 사용하여 실시간 라이트맵 UV의 입력 데이터를 저장할 수 있습니다.라이트맵 UV와 Unity가 이 채널을 사용하는 방법에 대한 자세한 내용은 라이트맵 UV를 참조하십시오.
8개 텍스처 좌표 속성 모두 선택 사항입니다.
Mesh
클래스에서 이 데이터에 액세스하는 가장 간단한 방법은 Mesh.GetUVs와 Mesh.SetUVs를 사용하는 것입니다. Unity는 또한 Mesh.uv, Mesh.uv2, Mesh.uv3에서 최대 Mesh.uv8에 이르는 프로퍼티에 이 데이터를 저장합니다. 이러한 구형 프로퍼티는 덜 효율적이고 사용자 친화적입니다.
버텍스 컬러는 버텍스 기본 컬러(있는 경우)를 나타냅니다.
이 컬러는 메시가 사용할 수도 있는 모든 텍스처에 대해 독립적으로 존재합니다.
이 버텍스 속성은 선택 사항입니다.
Mesh
클래스에서 이 데이터에 액세스하는 가장 간단한 방법은 Mesh.GetColor 및 Mesh.SetColor를 사용하는 것입니다.Unity는 이 데이터를 Mesh.colors에도 저장하지만, 이 오래된 프로퍼티는 효율성과 사용자 친화성이 떨어집니다.
스킨드 메시에서 블렌드 인덱스는 어느 뼈대가 버텍스에 영향을 미치는지 가리키고 뼈대 가중치는 그러한 뼈대가 버텍스에 영향을 미치는 정도를 설명합니다.
Unity에서 이러한 버텍스 속성은 함께 저장됩니다.
Unity는 블렌드 인덱스와 뼈대 가중치를 사용하여 해당 골격의 움직임을 토대로 스킨드 메시를 변형합니다. 자세한 내용은 Skinned Mesh Renderer를 참조하십시오.
이러한 버텍스 속성은 스킨드 메시에 필수입니다.
과거에는 Unity에서 버텍스에 영향을 미치는 뼈대를 최대 4개까지만 허용했습니다.이 데이터를 Mesh.boneWeights 배열에서 BoneWeight 구조체에 저장합니다.이제 Unity에서는 버텍스에 영향을 미치는 뼈대를 최대 256개 허용합니다.이 데이터를 BoneWeight1 구조체에 저장하며 Mesh.GetAllBoneWeights 및 Mesh.SetBoneWeights(으)로 액세스할 수 있습니다.자세한 내용은 링크된 API 문서를 참조하십시오.
토폴로지는 메시에 있는 면의 타입을 설명합니다.
메시의 토폴로지는 인덱스 버퍼의 구조체를 정의하며 이는 버텍스 포지션이 면으로 결합되는 방법을 설명합니다. 토폴로지의 각 타입은 인덱스 배열에서 서로 다른 수의 요소를 사용하여 단일 면을 정의합니다.
Unity가 지원하는 메시 토폴로지는 다음과 같습니다.
참고: 점 토폴로지는 면을 생성하지 않습니다. 대신 Unity는 각 포지션에서 단일 점을 렌더링합니다. 다른 모든 메시 토폴로지는 하나 이상의 인덱스를 사용하여 면이나 가장자리를 생성합니다.
Mesh
클래스에서 Mesh.GetTopology를 사용하여 토폴로지를 가져와 Mesh.SetIndices의 파라미터로 설정합니다.
지원하는 메시 토폴로지에 대한 자세한 내용은 MeshTopology 열거형에 대한 문서를 참조하십시오.
참고: Unity에서 사용하기 전에 다른 모델링 기술(예: NURBS 또는 NURMS/Subdivision Surfaces 모델링)을 사용하는 메시를 모델링 소프트웨어에서 지원하는 포맷으로 전환해야 합니다.
인덱스 배열은 버텍스 포지션 배열의 요소를 참조하는 정수를 포함합니다. 이러한 정수를 인덱스라고 부릅니다.
Unity는 인덱스를 사용하여 버텍스 포지션을 면으로 연결합니다. 각 면을 구성하는 인덱스의 수는 메시의 토폴로지에 따라 다릅니다.
Mesh
클래스에서 Mesh.GetIndices로 이 데이터를 얻을 수 있으며, Mesh.SetIndices로 설정할 수 있습니다.Unity는 이 데이터를 Mesh.triangles에도 저장하지만, 이 오래된 프로퍼티는 효율성과 사용자 친화성이 떨어집니다.
참고: 점 토폴로지는 면을 생성하지 않습니다. 대신 Unity는 각 포지션에서 단일 점을 렌더링합니다. 다른 모든 메시 토폴로지는 하나 이상의 인덱스를 사용하여 면이나 가장자리를 생성합니다.
예를 들자면 다음의 값을 포함하는 인덱스 배열을 가진 메시의 경우입니다.
0,1,2,3,4,5
메시에 삼각형 토폴로지가 있으면 첫 번째 3가지 요소인 (0, 1, 2)는 하나의 삼각형을 식별하고 다음 3가지 요소인 (3, 4, 5)는 다른 삼각형을 식별합니다. 버텍스가 기여할 수 있는 면의 개수에는 제한이 없습니다. 즉 동일한 버텍스가 인덱스 배열에 여러 번 나타날 수 있습니다. 예를 들어 인덱스 배열에는 다음과 같은 값이 포함될 수 있습니다.
0,1,2,1,2,3
메시에 삼각형 토폴로지가 있으면 첫 번째 3가지 요소인 (0, 1, 2)는 하나의 삼각형을 식별하고 다음 3가지 요소인 (1, 2, 3)은 첫 번째 삼각형과 버텍스를 공유하는 다른 삼각형을 식별합니다.
인덱스 배열에서 각 그룹의 버텍스 순서를 와인딩 순서라고 부릅니다. Unity는 와인딩 순서를 사용하여 면이 전면 방향인지 또는 후면 방향인지 결정하고 면을 렌더링해야 하는지 또는 컬링해야 하는지(렌더링에서 제외)를 결정합니다. 기본적으로 Unity는 전면 방향 폴리곤을 렌더링하고 후면 방향 폴리곤을 컬링합니다. Unity는 시계 방향으로 와인딩 순서를 사용합니다. 즉 Unity가 시계 방향으로 인덱스를 연결하는 모든 면이 전면 방향이라고 간주합니다.
위의 다이어그램은 Unity가 와인딩 순서를 사용하는 방법을 나타냅니다. 각 면의 버텍스 순서는 해당 면의 노멀 방향을 결정하며 Unity는 이를 현재 카메라 관점의 전방 방향과 비교합니다. 노멀이 현재 카메라의 전방 방향에서 먼 쪽을 가리키면 이는 후면 방향입니다. 더 가까운 삼각형은 현재 원근에 있어서 시계 방향으로 (1, 2, 3) 순서이므로 삼각형이 전면 방향입니다. 더 멀리있는 삼각형은 (4, 5, 6) 순서이며 이 원점에서 반시계 방향이므로 삼각형은 후면 방향입니다.
블렌드 셰이프는 다른 모양으로 변형된 메시 버전을 설명합니다. Unity는 이러한 모양을 보간합니다. Morph 타겟 애니메이션에 블렌드 셰이프를 사용하며 이는 얼굴 애니메이션에 대한 일반적인 기술입니다.
블렌드 셰이프 데이터는 블렌드 셰이프 버텍스로 저장됩니다.블렌드 셰이프 데이터는 “스파스”입니다.즉, 모든 메시 버텍스에 블렌드 셰이프 버텍스가 있는 것이 아니라 메시 버텍스가 변형되는 경우에만 해당 블렌드 셰이프 버텍스가 존재합니다.
블렌드 셰이프 버텍스에는 포지션, 노멀, 탄젠트에 대한 델타와 인덱스 값이 포함됩니다.인덱스 값의 의미는 데이터를 요청하는 방식에 따라 달라집니다.
Mesh
클래스에서는 Mesh.GetBlendShapeBuffer로 블렌드 셰이프 버텍스 데이터에 액세스할 수 있습니다.이것은 GPU에 있는 블렌드 셰이프 버텍스 데이터에 대한 액세스를 제공하는 GraphicsBuffer를 반환합니다.이 방법을 사용하면 블렌드 셰이프별로 데이터를 정렬하는 버퍼와 메시 버텍스별로 데이터를 정렬하는 버퍼 중 하나를 선택할 수 있습니다.버퍼 선택에 따라 인덱스 값의 의미와 버퍼 내 데이터의 레이아웃이 결정됩니다.버퍼 레이아웃에 대한 자세한 내용은 BlendShapeBufferLayout을 참조하십시오.
애니메이션이 포함된 블렌드 셰이프 사용에 대한 자세한 내용은 블렌드 셰이프로 작업하기를 참조하십시오.
이 데이터는 선택 사항입니다.
스킨드 메시에서 뼈대의 바인드 포즈는 골격이 기본 포지션에 있을 때 해당 포지션을 설명합니다(또한 바인드 포즈 또는 휴식 포즈라고도 함).
Mesh
클래스에서 Mesh.bindposes로 이 데이터를 입수하고 설정할 수 있습니다.각 요소에는 동일한 인덱스를 가진 뼈대에 대한 데이터가 포함되어 있습니다.
이 데이터는 스킨드 메시에 필수입니다.