質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

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

Q&A

解決済

1回答

2347閲覧

UnityGLにて描画した線の上にゲームオブジェクトを表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

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

0グッド

0クリップ

投稿2019/12/10 01:34

編集2019/12/10 08:07

Unity GLを使って3D空間上に四角形や線を表示させています。
その線に合わせてゲームオブジェクト(Splite)を配置しようとしています。

しかし、UnityGLにて描画した線・四角形が常に前面に表示されてしまうため、ゲームオブジェクトを線の手前に表示させることができません。

ちなみにこのサイトでは、3D空間上のGLに被せてゲームオブジェクトが表示されているような感じなので、不可能ではないのではないかと思っています。

UnityのGLを使って、HoloLensで線を描画してみる

GLをOnRenderObject関数で描画させているからなのでしょうか?

質問の書き方が下手ですが、助けてくださるとうれしいです。


##追記事項

Unity GL公式ページにあるCreateLineMaterial関数と同じ機能を持った関数を下記に追記しました。

下記の設定を行っても改善しませんでした。
また、ZWriteを1にするとGL平面が薄すぎるせいかうまく描画されませんでした。

C#

1void CreateLineMaterial() 2 { 3 if (!lineMaterial) 4 { 5 // Unity has a built-in shader that is useful for drawing 6 // simple colored things. 7 Shader shader = Shader.Find("Hidden/Internal-Colored"); 8 lineMaterial = new Material(shader); 9 lineMaterial.hideFlags = HideFlags.HideAndDontSave; 10 // Turn on alpha blending 11 lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); 12 lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); 13 // Turn backface culling off 14 lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off); 15 // Turn off depth writes 16 lineMaterial.SetInt("_ZWrite", 0); 17 lineMaterial.SetInt("_ZTest", (int)UnityEngine.Rendering.CompareFunction.Less); 18 } 19 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

ローカル空間からワールド空間に変換するMatrixを指定することで前後関係を表現した線やスプライトの描画が出来るようになります。

ローカル空間からワールド空間に変換するためには GL.PushMatrix(); のあとで

// Set transformation matrix for drawing to // match our transform GL.MultMatrix (transform.localToWorldMatrix);

https://docs.unity3d.com/ja/540/ScriptReference/GL.html より引用

といった形で、表示したいゲームオブジェクトをワールド空間へ変形するためのMatrixを指定します。

~~ただし、マテリアルのシェーダ設定としてZWriteZTestを有効に設定している必要があります。
~~

  • UnityのShader勉強10 ZTestとCullとか

http://haru-android.hatenablog.com/entry/2017/12/22/214518

3D描画において前後関係は 深度バッファ(Depth Buffer)によって管理されています。

ZWriteは描画ピクセルの奥行き値を深度バッファへ書き込む設定です。

ZTestは深度バッファと比較して現在のピクセルを描画するか/しないかを比較決定する設定です。

投稿2019/12/10 03:06

編集2019/12/10 08:26
tor4kichi

総合スコア763

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

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

退会済みユーザー

退会済みユーザー

2019/12/10 06:25

丁寧な回答、ありがとうございます。 描画の仕組みはなんとなくわかったのですが、実際にどのように設定すればよいのかが分かりません。 Unity GLの公式ページにもあるCreateLineMaterial()の中身を質問に追記しますので、具体的な変更点を教えていただけると嬉しいです。 ちなみに、Zwriteの設定はOnとOffだと思うのですが、なぜ数字で指定するのでしょうか?
tor4kichi

2019/12/10 08:23

materialの方はたぶんデフォルトのままで問題ないはずです。 https://docs.unity3d.com/jp/460/Manual/SL-CullAndDepth.html 「もし変更しているようなら」という意味合いでしたが、わざわざ付け加える必要ありませんでしたね。一旦 ZTestやmaterialの話は忘れてください。コードに加えたようならデフォルトの設定として ZWriteはOn(1) 、ZTest は LEqual に設定してください。 改めてですが、問題の本丸は GL.MultMatrix (transform.localToWorldMatrix); を記述しているかどうかです。こちらはどう設定されてますか?transformが何をするものかわからないようでしたら検索してみてください。あとtransform.localToWorldMatrixが何故あるのかも検索してみてください。 transform.position を書き換えると transform.localToWorldMatrix も変わるので、「GL.MultMatrix (transform.localToWorldMatrix);」を加えて描画することで、描画する位置座標を変化させることができます。 例えば手前に置きたいオブジェクトの場合は transform.position = new Vector3(0, 0, 0.0f); 奥に置きたいオブジェクトの場合は transform.position = new Vector3(0, 0, 1.0f); と設定するのかなと思います。ここは確証がなくて、実際は逆かもしれません。試してみてください。
退会済みユーザー

退会済みユーザー

2019/12/11 03:58

ありがとうございました。 GLの描画スクリプトをカメラとは別のゲームオブジェクトにアタッチしていたためtransformが正しく設定されていなかったようです。 Camera.main.transformに直したところうまく動きました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問