🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1422閲覧

Unity Graphics.DrawMeshInstanced 正常に描画されない

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/10/30 19:27

前提・実現したいこと

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インスタンシングに対応したシェーダにしてみたのですが、上記にある木の画像を綺麗に描画出来ません。どのように書き換えたらいいでしょうか? シェーダの知識が浅く、どうやればいいか分かりません。教えてもらえるとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

メッシュの頂点位置が-1~1ですので幅・高さが2なのに対し、インスタンスは間隔1で並べていますので、インスタンスが重なり合って左下しか見えていないんじゃないでしょうか?
メッシュの縦横を半分にしてみてはいかがでしょう。

C#

1 mesh.vertices = new Vector3[] { 2 new Vector3 (-0.5f, -0.5f, -1), 3 new Vector3 (-0.5f, 0.5f, -1), 4 new Vector3 (0.5f , -0.5f, -1), 5 new Vector3 (0.5f , 0.5f, -1), 6 };

またシェーダーが不透明オブジェクト向けの設定になっており、木の形を表現できていないようです。
キュー・Zテスト・ブレンディングの設定を変更して透明対応にすれば、透明部分を正しく抜くことができるかと思います。

ShaderLab

1Shader "Unlit/Terrain" 2{ 3 Properties 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 } 7 SubShader 8 { 9 Tags { "Queue"="Transparent" "RenderType"="Transparent" } 10 LOD 100 11 12 Pass 13 { 14 ZWrite Off 15 ZTest Always 16 Blend SrcAlpha OneMinusSrcAlpha 17 18 CGPROGRAM 19 // 省略 20 ENDCG 21 } 22 } 23}

投稿2019/10/31 15:54

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/31 17:11

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問