使用DiffuseMaterial的ModelVisual3D的透明度

Luk*_*don 4 c# 3d wpf

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

在此输入图像描述

这是代码:

        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);
        }
Run Code Online (Sandbox Code Playgroud)

当我将材料更改为例如EmissiveMaterial时,没有"切割"原子.我用Google搜索了这篇文章,但给出的建议并不适用于这种情况.

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

完整的源代码可以在这里找到http://alloysvisualisation.codeplex.com dll和测试文件http://alloysvisualisation.codeplex.com/releases beta链接.

重现步骤:

  1. 午餐应用
  2. 单击打开文件按钮
  3. 打开测试文件(xyzT2000.chmc)
  4. 单击"蒙版"按钮
  5. 检查11(原子系列几乎是透明的)
  6. Ckick Redraw

Tor*_*ous 8

对于透明原子,必须禁用z缓冲区写入.我不熟悉WPF,但你可以在Appearance或Material对象中设置它.

出现此问题的原因如下:

渲染透明原子时,它会将其深度写入z缓冲区.渲染并且应该出现的后续非透明原子不会被写入帧缓冲区,因为它们的z值未通过z测试,因为z值已经存在于透明原子的z缓冲区中.

简而言之,显卡将透明原子视为不透明并隐藏在其后面的任何东西.

编辑:在查看WPF时,它似乎非常高级,没有直接控制z缓冲区行为.

根据这个链接,发射和镜面材料不写入Z缓冲,因此使用这些是您的解决方案与透明对象时.

  • 这是一个链接,其中包含一些显示此问题的精美图片:http://www.ab4d.com/TransparencySorting.aspx.正如该链接指出的那样,并不总是需要禁用z缓冲区写入(或使用发射或镜面反射材料).如果您可以对视口子项进行排序,使得首先从相机中绘制对象,则不会受到此z缓冲区干扰.从理论上讲,这意味着每当摄像机发生变化时都会处理对象顺序,但实际上,您可能会遇到一种更简单的情况,即对象始终按给定顺序渲染. (2认同)