前回の記事では3Dモデルの頂点を点(ドット)で表示する方法を紹介しました。今回は頂点の表示ではなく辺の表示、つまりポリゴンをワイヤーフレームで表示してみます。また、綺麗にワイヤーフレームを表示するためのシェーダも作成します!
メッシュのトポロジを変更する
3Dモデルをワイヤーフレームで表示するには、頂点を表示したときと同様にメッシュの再構築を行います。
まずはメッシュの再構築をするスクリプトを作成してみましょう。プロジェクトウィンドウで右クリックし、Create→Script→C# Script
を選択して、wireframe.csを作成してください。
ファイルが出来たら次のスクリプトを入力してください。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class wireframe : MonoBehaviour { void Start() { MeshFilter meshFilter = GetComponent<MeshFilter>(); meshFilter.mesh.SetIndices(meshFilter.mesh.GetIndices(0), MeshTopology.Lines, 0); } }
Startメソッドの中でMeshFilterコンポーネントからメッシュ情報を取り出し、MeshTopologyにLineを指定しています。
スクリプトが入力できたら、wireframe.csを3Dモデルにアタッチしてください。
ちなみに今回のモデルはこちらのAssetを使わさせていただきました。
実行結果はこちらです。残念ながらあまり綺麗・・・ではないですね。
ワイヤーフレームを綺麗に表示する
上の方法でワイヤーフレームが綺麗に表示されていないのは主に次のような原因が考えられます。
- ワイヤーフレームが不透明でアンチエイリアスが効いていない
- Standard Shaderのテクスチャが反映されていてゴチャってる
そこで単色できれいに発色するようなシェーダを作りましょう。まずはプロジェクトウィンドウで右クリックし、Create→Shader→Unlit Shader
を選択して、wireframe.shaderという名前で保存してください。また、作成したwireframe.shaderを右クリックしてCreate→Material
でwireframe.matというマテリアルを作成しておきます。
wireframe.shaderのシェーダファイルに次のシェーダプログラムを入力して下さい。
Shader "Custom/wireframe" { Properties { _Color ("Color", Color) = (1,1,1,1) _Emission ("Emission", Range(0,3)) = 1.0 } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent" } LOD 200 Cull off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma surface surf Standard fullforwardshadows alpha:fade #pragma target 3.0 struct Input { float2 uv_MainTex; }; half _Emission; fixed4 _Color; void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 c = _Color; o.Albedo = c.rgb; o.Alpha = c.a; o.Metallic = o.Smoothness = 0; o.Emission = _Emission; } ENDCG } FallBack "Diffuse" }
このシェーダではワイヤーフレームの色とEmissionをインスペクタから設定できるようになっています。ワイヤーフレームの色には透明度も反映されます。透明度を高めに設定することで線が重なったときに加算合成されて綺麗に表示されます。
シェーダが入力できたら、wireframeマテリアルを3Dモデルにアタッチしましょう。
マテリアルがアタッチできたら、最後にインスペクタからワイヤーフレームの色とEmissionを指定します。今回は次のように設定しました。カラーピッカーで透明度は高く設定していることに注意して下さい。
Unityで実行してみて、先程よりも綺麗に表示されていることを確認してみましょう!
まとめ
3Dモデルをワイヤーフレームを表示するための方法を紹介しました。標準のStandard Shaderでは綺麗に表示できないため、オリジナルのシェーダも作成しました。
前回紹介した、頂点をドットで表示する方法はこちらの記事を参考にして下さい。