float nowInstanceRatio = instanceID/maxInstanceCount;
if(nowInstanceRatio >= noiseValue){
isClip = 0;
}else{
isClip = 1;
}
내가 작성한 비교식은 위와 같다. Float형 isClip은 Fragment 노드의 Alpha에 그대로 내보내고, 모드에서 Alpha Clipping 을 활성화 하고, Alpha Clip Threshold는 0.5로 했다. 0이면 출력하지 않고, 1이면 출력하는 것이다.
참고로 표면은 원하는 개수만큼 여러개 출력할 수 있는데, 모두 같은 위치에 출력하는 것이 아니라 레이어 층의 높이 간격을 주어 쌓아야 한다.
이때 쌓는 방향은 단순 평면인 경우 y나 한 방향으로 쌓으면 되지만, 보통 메시에 적용하는 것이기 때문에 노말 방향으로 확장해나가며 쌓으면 된다.
resultPositionOS = positionOS + normalize(normalOS) * moveIntensity * InstanceID;
코드로 보면 위와 같다. InstanceID 에 따라 노말 방향으로 확장해주는 것이다. 10개를 출력하면 10개가 노말 방향으로 확장된다.
참고로 이 작업은 메시를 하나 하나 직접 생성하는 것이 아니라 메시 하나를 렌더링하는 객체에 MonoBehaviour 를 상속받는 클래스를 붙여서 그래픽스 명령을 통해 DrawMeshInstanced를 호출하여 인스턴스 출력을 해 줘야한다.
Graphics.DrawMeshInstanced(this.mesh, 0, this.material, matrices, matrices.Length);
이 명령을 수행하면 엔진에서 CommandBuffer의 렌더 시점에 대기열로 등록되어 다음 렌더시에 드로우 된다.