我遇到了一个对我来说似乎是个错误的问题。我正在制作一个可视化水晶原子的应用程序。那个问题是它绘制了一个透明对象并隐藏了对象。
以下是代码:
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没有“切割”原子。我用Google搜索this post,但给出的建议不适用于这种情况。
这是2D刷子应用于3D的错误吗?
完整的源代码可以在http://alloysvisualisation.codeplex.com dll和测试文件http://alloysvisualisation.codeplex.com/releases beta链接中找到。
重现的步骤:
答案 0 :(得分:8)
对于透明原子,必须禁用z-buffer-writing。 我不熟悉WPF,但你可以在外观或材质对象中设置它。
出现此问题的原因如下:
渲染透明原子时,会将其深度写入z缓冲区。渲染并且应该出现的后续非透明原子不会被写入帧缓冲区,因为它们的z值未通过z测试,因为z值已经存在于透明原子的z缓冲区中。 / p>
简而言之,显卡将透明原子视为不透明,并将其隐藏在其背后。
编辑:在查看WPF时,它似乎非常高级,没有直接控制z缓冲区行为。
根据this link,自发光和镜面反射材质不会写入z缓冲区,因此在使用透明对象时使用它们是您的解决方案。