ModelVisual3D中使用DiffuseMaterial材质的透明度

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

enter image description here

这里是代码:

        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时,没有“切割”原子。 我搜索了this post,但给出的建议不适用于这种情况。
这是应用于3D的2D画笔的错误吗?
完整的源代码可以在此处找到http://alloysvisualisation.codeplex.com dll和测试文件http://alloysvisualisation.codeplex.com/releases beta链接。
重现步骤:
  1. 启动应用程序
  2. 点击打开文件按钮
  3. 打开测试文件(xyzT2000.chmc)
  4. 点击掩膜按钮
  5. 检查11(一系列原子几乎透明)
  6. 单击重新绘制

我记得WPF 3D对象有正面材料和背面材料,你是否都设置了? - WildCrustacean
在类Sphere3D : ModelVisual3D中,我添加了set { (this.Content as GeometryModel3D).Material = value; (this.Content as GeometryModel3D).BackMaterial = value; } 但效果是相同的。 - Lukasz Madon
当相交时,它们似乎没有被渲染,其中一个是透明的。 - Lukasz Madon
1个回答

10
对于透明原子,您必须禁用Z缓冲区写入。我对WPF不熟悉,但您可能可以在外观或材料对象中设置此项。问题出现的原因如下:
当渲染透明原子时,它会将其深度写入Z缓冲区。随后渲染并应该出现的非透明原子不会被写入帧缓冲区,因为它们的Z值未通过Z测试,因为透明原子的Z值已经在Z缓冲区中。
简而言之,图形卡将透明原子视为不透明,并隐藏其后面的任何东西。
编辑:在研究WPF时,它似乎是高级别的,没有直接控制Z缓冲区行为的能力。
根据this link,发射和高光材料不会写入Z缓冲区,因此在处理透明对象时使用这些材料是解决方案。

谢谢,我在你的帖子后也找到了这个链接 :) - Lukasz Madon
3
这里有一个链接,展示了一些漂亮的图片来说明这个问题:http://www.ab4d.com/TransparencySorting.aspx。正如该链接所指出的,不总是需要禁用Z缓冲写入(或使用自发光或镜面材料)。如果你可以按照远离相机的对象先绘制的顺序对视口子对象进行排序,就不会出现Z缓冲干扰。理论上,这意味着每当相机改变时需要调整物体的顺序,但实际上你可能会遇到更简单的情况,即物体总是以特定的顺序渲染。 - M Katz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接