具有透明度的OpenGL行导致白色显示

时间:2017-10-24 14:37:35

标签: unity3d shader unity5

这可能是一个奇怪的问题而且是一个很长的问题所以请耐心等待,谢谢。

这是一个简短的介绍。我试图通过使用光线投影来表示相机的视觉,以便它可以“看到”物体。碰撞工作正常。现在我试图通过线条可视化相机的“视觉”。起初我开始使用内置的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表示。

真正的问题是关于着色器。如果没有堆叠,我如何使用透明度?我是着色器的新手,对它们真的不太了解。

感谢阅读并度过了美好的一天!

1 个答案:

答案 0 :(得分:0)

我认为,Z-Test可能会有所帮助。

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