C# 使用漫反射材质的ModelVisual3D的透明度

C# 使用漫反射材质的ModelVisual3D的透明度,c#,wpf,3d,C#,Wpf,3d,我遇到了一个对我来说似乎是个问题的问题。我正在制作一个可以可视化晶体中原子的应用程序。问题是它绘制了一个透明对象并将对象隐藏在后面 代码如下: foreach (var atom in filteredAtoms) { var color = new Color(); color.ScR = (float)atom.AluminiumProbability; //color.G = 50;

我遇到了一个对我来说似乎是个问题的问题。我正在制作一个可以可视化晶体中原子的应用程序。问题是它绘制了一个透明对象并将对象隐藏在后面

代码如下:

        foreach (var atom in filteredAtoms)
        {
            var color = new Color();

            color.ScR = (float)atom.AluminiumProbability;
            //color.G = 50;
            color.ScB = (float)atom.MagnesiumProbability;
            //setting alpha channel but Opacity doens't work as well
            color.ScA = (float)(1.0 - atom.VacancyProbability); //(float)1.0;//
            DiffuseMaterial material = new DiffuseMaterial(new SolidColorBrush(color));
            //material.Brush.Opacity = 1.0 - atom.VacancyProbability;

            // make visuals and add them to
            atomBuldier.Add(new Point3D(atom.X * Atom.ToAngstrom, atom.Y * Atom.ToAngstrom, atom.Z * Atom.ToAngstrom), material);
        }
当我将材料更改为例如发射材料时,没有“切割”原子。我在谷歌上搜索过,但给出的建议不适用于本案

这是2D笔刷应用于3D的错误吗

完整的源代码可以在这里找到dll和测试文件beta链接

复制步骤:

  • 午餐应用程序
  • 单击“打开文件”按钮
  • 打开测试文件(xyzT2000.chmc)
  • 单击遮罩按钮
  • 检查11(一系列原子几乎是透明的)
  • 重画

  • 对于透明原子,必须禁用z缓冲区写入。我不熟悉WPF,但您可能可以在外观或材质对象中设置它

    出现此问题的原因如下:

    渲染透明原子时,它会将其深度写入z缓冲区。随后渲染并应显示的非透明原子不会写入帧缓冲区,因为它们的z值未通过z测试,因为透明原子的z缓冲区中已经存在z值

    简而言之,图形卡将透明原子视为不透明,并隐藏其背后的任何东西

    编辑:在查看WPF时,它看起来相当高级,没有直接控制z缓冲区行为


    根据,发射和镜面反射材质不会写入z缓冲区,因此在处理透明对象时使用这些材质是您的解决方案。

    我似乎记得WPF 3D对象有一个前材质和一个后材质,您要同时设置这两个吗?在类Sphere3D:ModelVisual3D中,我添加了集合{(this.Content作为GeometryModel3D).Material=value;(this.Content作为GeometryModel3D.BackMaterial=value;}但效果是相同的,它们在相交时似乎没有呈现,其中一个是透明的。谢谢,我在你的帖子后也找到了这个链接:)这里有一个链接,有一些漂亮的图片显示了这个问题:。正如该链接所指出的,并不总是需要禁用z缓冲区写入(或使用发射或镜面反射材质)。如果可以对视口子对象进行排序,以便首先绘制距离摄影机更远的对象,则不会出现z缓冲区干涉。从理论上讲,这意味着每当摄影机发生变化时,都要改变对象顺序,但实际上,您可能会遇到一种更简单的情况,即对象始终以给定顺序渲染。