Unity Graphics.DrawMeshInstanced 正常に描画されない
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 379

退会済みユーザー
前提・実現したいこと
Graphics.DrawMeshInstancedを使って、画像を正常に描画したい
発生している問題・エラーメッセージ
該当のソースコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class GenStructure : MonoBehaviour
{
Mesh mesh;
Matrix4x4[][] matrices;
int count;
public Material material;
public int rows = 100;
public int columns = 100;
private void Start()
{
mesh = new Mesh();
mesh.vertices = new Vector3[] {
new Vector3 (-1f, -1f, -1),
new Vector3 (-1f, 1f, -1),
new Vector3 (1f , -1f, -1),
new Vector3 (1f , 1f, -1),
};
mesh.uv = new Vector2[] {
new Vector2 (0, 0),
new Vector2 (0, 1),
new Vector2 (1, 0),
new Vector2 (1, 1),
};
mesh.triangles = new int[] {
0, 1, 2,
1, 3, 2,
};
mesh.RecalculateNormals();
mesh.RecalculateBounds();
// 各インスタンスの姿勢はMatrix4x4として与える
count = rows * columns;
var flatMatrices = new Matrix4x4[count];
for (var i = 0; i < rows; i++)
{
for (var j = 0; j < columns; j++)
{
var index = (i * columns) + j;
var position = new Vector3(j, i, 0.0f);
var rotation = Quaternion.identity;
var scale = Vector3.one;
flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale);
}
}
// 一度に描画できるインスタンスは1023個までなので、あらかじめそれを超えないよう切り分けておく
matrices = flatMatrices.Select((m, i) => (m, i / 1023))
.GroupBy(t => t.Item2)
.Select(g => g.Select(t => t.Item1).ToArray()).ToArray();
}
void Update()
{
foreach (var m in matrices)
{
Graphics.DrawMeshInstanced(mesh, 0, material, m);
}
}
}
Shader "Unlit/Terrain"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v)
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
試したこと
サイトなどを参考にして、GPUインスタンシングに対応したシェーダにしてみたのですが、上記にある木の画像を綺麗に描画出来ません。どのように書き換えたらいいでしょうか? シェーダの知識が浅く、どうやればいいか分かりません。教えてもらえるとありがたいです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
メッシュの頂点位置が-1~1ですので幅・高さが2なのに対し、インスタンスは間隔1で並べていますので、インスタンスが重なり合って左下しか見えていないんじゃないでしょうか?
メッシュの縦横を半分にしてみてはいかがでしょう。
mesh.vertices = new Vector3[] {
new Vector3 (-0.5f, -0.5f, -1),
new Vector3 (-0.5f, 0.5f, -1),
new Vector3 (0.5f , -0.5f, -1),
new Vector3 (0.5f , 0.5f, -1),
};
またシェーダーが不透明オブジェクト向けの設定になっており、木の形を表現できていないようです。
キュー・Zテスト・ブレンディングの設定を変更して透明対応にすれば、透明部分を正しく抜くことができるかと思います。
Shader "Unlit/Terrain"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
LOD 100
Pass
{
ZWrite Off
ZTest Always
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
// 省略
ENDCG
}
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/11/01 02:11