2017-10-24 21 views
1

これは奇妙な質問かもしれません。透明な白い線が表示されるOpenGL線

この短い紹介です。私はレイキャストを使ってカメラのビジョンを表現しようとしているので、オブジェクトを見ることができます。衝突はうまく働いています。今私はカメラを使って "ビジョン"を視覚化しようとしています。最初は、debug.drawLine/Rayに組み込まれたものを使い始めましたが、そこに描画された線や光線には柔軟性がありません。その後、私はOpenGLに移り、線を描きました。私は望んでいた機能を手に入れましたが、そうすることで私は解決できない問題にぶつかってきました。

enter image description here

あなたは私が描いていますラインは、透明性を持っており、彼らがすることになっていることがわかります上。私の考えは、線が透明であり、すべて一重点から来ているので、透明度は「スタッキング」であり、それらを白くして、私が望まないものにすることです。

私は線材の材質を使用しようとしましたが、線を透明にすることはできません。だから私は下にあるスクリプトを使ってあなたにシェイダーを組み込んだ統合トピックを見つけることに決めました。

void createLineMaterial() 
{ 
    if(!lineMaterial) 
    { 
     Shader shader = Shader.Find("Hidden/Internal-Colored"); 
     lineMaterial = new Material(shader); 
     lineMaterial.hideFlags = HideFlags.HideAndDontSave; 
     //Turn on Alpha blending 
     lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); 
     lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.DstAlpha); 
     //Turn backface culling off 
     lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off); 
     //Turn off depth writes 
     lineMaterial.SetInt("_ZWrite", 0); 
    } 
} 

さらに明確にするために、別の画像を以下に示します。 enter image description here

私は、幅のビジョンを取得し、次に環境の3D表現を得るために高さの掃引を試みます。

本当の質問はシェイダーについてです。積み重ねることなく透明度を使用するにはどうすればよいですか?私はシェイダーには新しく、実際には分かりません。

読んでいただきありがとうございます。

+0

私は....これを修正する方法を考えることはできません。私は透明度を違うカスタムシェーダを言うつもりでしたが、それはうまくいかないと私には起こりました。うーん...実際に、あなたが*ステンシルマスク*を使っていればうまくいくかもしれません。そのシェーダは、前に描画していない部分だけを描画し、スタックを1に制限します。 – Draco18s

+0

@ Draco18s各プレーンを描画したいのですが、最後の目標は透明な透明なオブジェクトを作成して衝突を表示することです。これは本当に私を困惑させてしまった。 – Puddinglord

+0

私はあなたがしようとしていることを知っています。私がこれを達成すると考えることができる唯一の方法は、[ステンシルマスク](https://docs.unity3d.com/Manual/SL-Stencil.html)を使用してカスタムシェーダを使用することです。 – Draco18s

答えて

0

私は、Z-Testが役立つと思います。

lineMaterial.SetInt("_ZWrite", 1); 
lineMaterial.SetInt("_ZTest", (int) UnityEngine.Rendering.CompareFunction.Less); 
+0

それで、私はあなたに感謝している白い問題を解決します!今問題は、透過性が最上層から取り除かれているように、わずかに現れる最初の光線の下の複数の線をZ-テストすることにあります。その上の任意のアイデア? – Puddinglord

+0

ドローコールをソートすると役立ちますが、そのマテリアルですべての線をソートする必要があります。私。複数のコンポーネントがあり、それぞれが独自の行セットを描画するために使用されている場合は、線の共有リストを作成して描画する前にソートする必要があります。 –

+0

float DistanceToLine(Vector3 p、Vector3 a、Vector3 b) { Vector3 pa = p-a; ベクトル3 ba = b-a; float h = Mathf.Clamp(Vector3.Dot(pa、ba)/Vector3.Dot(ba、ba)、0.0、1。0)。 return Vector3.Distance(pa-ba * h); } –

関連する問題