1

好的,在我的 XNA 项目中,我添加了简单的着色器 + 模型加载代码,一切正常。我在 3Ds Max 中创建了一个非常简单的低细节模型。以 FBX 格式导出和导入到 XNA。

问题是:如果我将我的简单相机移动到离这个模型一定距离的地方,它的一个组件就会开始闪烁。我尝试了另一个模型,但情况相同,某些组件开始闪烁,并且只有当我与模型保持一定距离时。

这种闪烁(或闪烁或..)仅出现在纹理对象(可能)中,并且看起来像:在每一帧中,模型的随机部分/像素(或不那么随机)替换为模型或其组件后面的对象.. . :(

更新:现在我知道 - 问题出在我的模型中(我检查了其他一些模型)。我不明白为什么,但平面对象会闪烁。也许问题不在于平面对象。

在此处输入图像描述

4

2 回答 2

5

这只是一个有根据的猜测,但是:您的远平面太远,或您的近平面太近,或两者兼而有之。

透视相机为您提供如下所示的可视区域:

查看平截头体

您的 Z 缓冲区(深度缓冲区)涵盖了近平面和远平面之间的范围。典型的 Z 缓冲区可能具有 24 位精度,为您提供 2 24 个可能的值。您的近平面和远平面相距越远,每个可能值必须覆盖的世界空间距离就越大。换句话说:您的 Z 缓冲区不太准确。

你所看到的就是所谓的“ Z-fighting。这就是 Z 缓冲区不够准确以区分两个给定像素的深度的地方。因此,您最终会得到应该被拒绝的像素,因为它们“落后于”已经渲染、绘制的内容。

(或者,您的模型有一些共面或几乎共面的三角形 - 即表面靠得太近的三角形。同样的问题:Z 缓冲区中没有足够的精度来区分两个表面。)

RasterizerState.CullCounterClockwise如果尚未启用,您可能还希望启用背面剔除 ( )。这会剔除背对相机的三角形,从而消除 Z-fighting 的一个可能来源。

于 2013-06-16T12:04:42.000 回答
0

我之前在有两个或多个表面重叠在同一平面上的模型上看到过这种情况,一个表面在另一个表面内但在同一平面内 - 因此系统无法分辨哪个表面在另一个表面之前并且通常结束两个表面的混搭。

看起来您有一个较小的矩形表面与一个较大的矩形表面相交,构成了模型的下部基本形状。可能来自盒子内的另一个物体?或者可能是由于对象减法错误在该表面上留下了两个矩形?无论哪种方式都修改模型,因此不再有两个相互关联的表面。

于 2013-06-16T13:07:23.380 回答