前提・実現したいこと
Graphics.DrawMeshInstancedを使って、画像を正常に描画したい
発生している問題・エラーメッセージ
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Linq; 5 6public class GenStructure : MonoBehaviour 7{ 8 Mesh mesh; 9 Matrix4x4[][] matrices; 10 int count; 11 public Material material; 12 public int rows = 100; 13 public int columns = 100; 14 15 private void Start() 16 { 17 mesh = new Mesh(); 18 mesh.vertices = new Vector3[] { 19 new Vector3 (-1f, -1f, -1), 20 new Vector3 (-1f, 1f, -1), 21 new Vector3 (1f , -1f, -1), 22 new Vector3 (1f , 1f, -1), 23 }; 24 25 mesh.uv = new Vector2[] { 26 new Vector2 (0, 0), 27 new Vector2 (0, 1), 28 new Vector2 (1, 0), 29 new Vector2 (1, 1), 30 }; 31 32 mesh.triangles = new int[] { 33 0, 1, 2, 34 1, 3, 2, 35 }; 36 37 mesh.RecalculateNormals(); 38 mesh.RecalculateBounds(); 39 40 // 各インスタンスの姿勢はMatrix4x4として与える 41 count = rows * columns; 42 var flatMatrices = new Matrix4x4[count]; 43 for (var i = 0; i < rows; i++) 44 { 45 for (var j = 0; j < columns; j++) 46 { 47 var index = (i * columns) + j; 48 49 var position = new Vector3(j, i, 0.0f); 50 51 var rotation = Quaternion.identity; 52 53 var scale = Vector3.one; 54 55 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 56 } 57 } 58 59 // 一度に描画できるインスタンスは1023個までなので、あらかじめそれを超えないよう切り分けておく 60 matrices = flatMatrices.Select((m, i) => (m, i / 1023)) 61 .GroupBy(t => t.Item2) 62 .Select(g => g.Select(t => t.Item1).ToArray()).ToArray(); 63 } 64 65 void Update() 66 { 67 foreach (var m in matrices) 68 { 69 Graphics.DrawMeshInstanced(mesh, 0, material, m); 70 } 71 } 72}
ShaderLab
1Shader "Unlit/Terrain" 2{ 3 Properties 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 } 7 SubShader 8 { 9 Tags { "RenderType"="Opaque" } 10 LOD 100 11 12 Pass 13 { 14 CGPROGRAM 15 #pragma vertex vert 16 #pragma fragment frag 17 #pragma multi_compile_instancing 18 // make fog work 19 #pragma multi_compile_fog 20 21 #include "UnityCG.cginc" 22 23 struct appdata 24 { 25 float4 vertex : POSITION; 26 float2 uv : TEXCOORD0; 27 UNITY_VERTEX_INPUT_INSTANCE_ID 28 }; 29 30 struct v2f 31 { 32 float2 uv : TEXCOORD0; 33 UNITY_FOG_COORDS(1) 34 float4 vertex : SV_POSITION; 35 }; 36 37 sampler2D _MainTex; 38 float4 _MainTex_ST; 39 40 v2f vert (appdata v) 41 { 42 v2f o; 43 UNITY_SETUP_INSTANCE_ID(v) 44 o.vertex = UnityObjectToClipPos(v.vertex); 45 o.uv = TRANSFORM_TEX(v.uv, _MainTex); 46 UNITY_TRANSFER_FOG(o,o.vertex); 47 return o; 48 } 49 50 fixed4 frag (v2f i) : SV_Target 51 { 52 // sample the texture 53 fixed4 col = tex2D(_MainTex, i.uv); 54 // apply fog 55 UNITY_APPLY_FOG(i.fogCoord, col); 56 return col; 57 } 58 ENDCG 59 } 60 } 61} 62
試したこと
サイトなどを参考にして、GPUインスタンシングに対応したシェーダにしてみたのですが、上記にある木の画像を綺麗に描画出来ません。どのように書き換えたらいいでしょうか? シェーダの知識が浅く、どうやればいいか分かりません。教えてもらえるとありがたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/10/31 17:11