5

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

在此处输入图像描述

这是代码:

        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);
        }

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

这是将 2D 画笔应用于 3D 的错误吗?

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

重现步骤:

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

1 回答 1

9

对于透明原子,您必须禁用 z-buffer-writing。我不熟悉 WPF,但您可能可以在 Appearance 或 Material 对象中设置它。

出现此问题的原因如下:

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

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

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

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

于 2012-04-14T00:16:17.647 回答