我通过制作MeshGeometry3D并向其添加顶点和法线来渲染具有WPF 3D的场景。在渲染场景中一切看起来都很好(灯光在那里,材质看起来很好),但是在网格三角形重叠的地方,靠近相机的三角形不一定呈现在顶部。看起来它们是以随机顺序绘制的。有什么方法可以确保网格三角形以“正确”的顺序呈现?
万一它有帮助,这是我的XAML:
<Viewport3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup>
<AmbientLight Color="#FF5A5A5A" />
<GeometryModel3D x:Name="geometryModel">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="DarkRed"/>
</GeometryModel3D.Material>
</GeometryModel3D>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
在代码中,我正在生成这样的网格:
var mesh = new MeshGeometry3D();
foreach (var item in objectsToTriangulate) {
var triangles = item.Triangulate();
foreach (var triangle in triangles) {
mesh.Positions.Add(triangle.Vertices[0]);
mesh.Positions.Add(triangle.Vertices[1]);
mesh.Positions.Add(triangle.Vertices[2]);
mesh.Normals.Add(triangle.Normal);
mesh.Normals.Add(triangle.Normal);
mesh.Normals.Add(triangle.Normal);
}
}
geometryModel.Geometry = mesh;
编辑:没有三角形相交(边缘除外),有时顶部出现的三角形实际上是在另一个三角形之后,所以我不认为三角形的3D排序是不明确的,正如Ray Burns所建议的那样。
我注意到的另一个行为是,当我在场景中移动时,渲染三角形的顺序似乎没有改变。即如果我从另一侧查看问题区域,则三角形将以相同的,现在“正确”的顺序呈现。
答案 0 :(得分:6)
在WPF中,与大多数3D系统一样,简化的假设是假定任何给定的三角形完全位于任何其他给定三角形的前面或完全位于其后面。但事实上并非总是如此。具体来说,如果两个三角形沿着它们的内部相交(而不仅仅是它们的边缘)并且没有沿着它们的剖面线看到,那么精确的渲染会为视口的一部分绘制每个三角形前面。
由于这个假设,3D引擎通过将整个三角形视为距离相机一定距离来对三角形进行排序。它可以选择三角形的最近角,最远的角,平均角,或者使用其他算法,但最后它选择一个代表点来计算Z Order。
我的猜测是你的三角形结构的方式是代表点用于计算Z顺序导致它们以意想不到的顺序显示。
修改强>
根据您在编辑中提供的信息,我可以看到我的第一个猜测错误。我会留下它,以防它对其他人有用,并提出一些我已有的想法。希望其他人可以在这里聊天。我自己从来没有遇到过这种深度问题所以这些都只是受过教育的猜测。
以下是我的想法:
可能是您的BackMaterial未设置或透明,导致您只能看到从您的角度看其顺序为顺时针方向的三角形。根据您的实际网格,缺少的不可见三角形可能会使后面的三角形看起来与它们重叠,而实际上它们只是通过它们可见。如果您的材料未设置或透明,也可能发生这种情况。
有些东西显然决定了三角形显示的顺序。它可能是TriangleIndices数组中的顺序吗?如果您随机重新排序TriangleIndices数组(当然是三组)而不进行任何其他更改,它是否会更改显示?如果是这样,你已经了解了这个问题并且可能找到了解决方法(如果使用TriangleIndices命令,你可以自己进行排序)。
如果您使用的是ProjectionCamera或OrthoGraphicCamera,NearPlaneDistance和FarPlaneDistance是否设置得恰当?错误的NearPlaneDistance特别可能使靠近您的三角形看不见,使得看起来更远的三角形实际上被绘制在顶部。错误的距离也会影响深度缓冲区的粒度,这可以为您提供正在经历的效果。
您的型号是非常大还是非常小?如果缩放模型和相机位置,它会有所不同吗?深度缓冲区通常是32位整数,因此在非常小的模型中可以将两个三角形四舍五入到相同的深度缓冲区值。这也会导致你描述的效果。
可能是您遇到了错误。您可以尝试一些更改,看看它们是否会影响问题,例如,您可能会尝试仅使用软件的渲染,不同的光照类型(漫反射与镜面反射等),不同的相机类型,来自不同供应商的图形卡等。
我希望其中一些想法有所帮助。