유니티로 3D모델을 평범하게 그리면 폴리곤이 표시됩니다. 여기서는 폴리곤의 정점만을 점으로 표현하는 방법을 소개합니다.


정점의 표현 방법을 바꾸는 것만이라면, 무려 2행의 스크립트만으로 끝납니다. 각각의 정점에 여러 색을 입히는 경우에는 쉐이더를 쓰고 있습니다.







토폴리지를 폴리곤에서 포인트로 변경하기


3D모델의 정점 정보는 Mesh에서 관리되고 있어서, 그 정점을 어떤식으로 그릴지는 MeshTopology로 정의되고 있습니다. 통상은 면을 그리기 위해 트라이앵글 토폴로지가 선택되고 있습니다.



MeshTopology에는 다음과 같은 종류가 있습니다.



 토폴로지 명

형태 

 Triangles

삼각형 

 Quads

 사각형

 Lines

 선

 LineStrip

 선분

 Points

 점




여기서는, 정점을 점으로 표시하기 위해서 MeshTopology.Points를 지정합니다. 와이어프레임으로 표시하고 싶은 경우는 MeshTopology.Lines를 선택합니다.









토폴로지를 변경하고 포인트로 표시하기


토폴로지의 변경은, 스크립트에서 간단하게 실행할 수 있습니다. PointController라는 이름의 스크립트를 작성하고, 다음의 내용을 입력해주세요.


using System.Collections; using System.Collections.Generic; using UnityEngine; public class PointController : MonoBehaviour { void Start () { MeshFilter meshFilter = GetComponent<MeshFilter>(); meshFilter.mesh.SetIndices(meshFilter.mesh.GetIndices(0),MeshTopology.Points,0); }

}


여기서는 GetComponent를 사용해서 MeshFilter컴포넌트를 얻고, 메쉬가 가진 정점 정보의 토포로지를 Points로 바꿔서 다시 저장하고 있습니다.


스크립트를 다 입력하셨다면, 작성한 스크립트를 3D모델에 어태치해서 실행시켜봐주세요. 다음과 같이, 정점이 포인트로 나타난 모델이 표시될 겁니다.






정점의 색을 그라데이션으로 표시하기


점마다(정점마다) 색을 바꾸고 싶은 경우에는, 쉐이더를 쓸 필요가 있습니다. 여기서는 위에서부터 아래로 향하는 그라데이션이 되도록 점마다 색을 입히는 쉐이더를 써보도록 하죠.


쉐이더 파일과 대응하는 머테리얼을 생성합니다. 프로젝트 뷰에서 오른쪽 클릭을 하고, [Create] -> [Shader] -> [Unlit Shader]를 선택해주세요. 이름은 Gradation으로 합니다. 그리고, 그 Gradation 쉐이더를 선택한 상태로 [Create->Material]을 선택해서, 대응하는 Custom_Gradation 머테리얼도 작성합니다.




쉐이더에는 다음의 내용을 입력해주세요.



Shader "Custom/Gradation" { Properties { _Color ("Color", Color) = (1, 1, 1, 1) } SubShader { Tags { "RenderType"="Transparent" } Cull Off ZWrite On Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float3 worldPos : TEXCOORD0; }; float4 _Color; v2f vert(appdata_base v) { v2f o; float3 n = UnityObjectToWorldNormal(v.normal); o.pos = UnityObjectToClipPos (v.vertex); o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; return o; } half4 frag (v2f i) : COLOR { float4 red = float4(255.0/255,70.0/255,150.0/255,1); float4 blue = float4(90.0/255,90.0/255,250.0/255,1); return lerp(red, blue, i.worldPos.y*0.2); } ENDCG } } FallBack Off

}



여기서는 버텍스 쉐이더로, 처리하고 있는 정점의 월드 좌표를 계산하고 있습니다. 프래그먼트 쉐이더에서는 이 월드 좌표의 y성분에 따라 정점의 색을 결정합니다. 이쁘게 청색에서 홍색으로 그라데이션이 되도록, Lerp메소드로 보간해서 계산합니다.


실행 결과는 다음과 같습니다.








정점을 움직여서 모래가 흩날리는 이펙트


정점을 법선(노말) 방향으로 움직여서 모래가 흩날리는 듯한 이펙트를 만들 수도 있습니다. 버텍스 쉐이더를 다음과 같이 변경해주세요.


v2f vert(appdata_base v) { v2f o; float3 n = UnityObjectToWorldNormal(v.normal); o.pos = UnityObjectToClipPos (v.vertex) + float4(n * _Displacement, 0); o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; return o;

}



여기서는, 월드좌표계로 법선 정보를 얻고, 그 방향으로 _Displacement 만큼 정점을 바깥쪽으로 움직이고 있습니다. _Displacement는 프로버티 블록에 선언해서, 인스펙터에서 조절할 수 있도록 해놨습니다.









원 출저: http://nn-hokuson.hatenablog.com/entry/2017/06/06/202953