纹理/模型在距离上闪烁(3D)

时间:2013-06-16 11:07:47

标签: c# 3d xna xna-4.0

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

问题是: 如果我将我的简单相机移动到距离此模型一定距离,其中一个组件就会开始闪烁。我尝试了另一个模型,并且存在相同的情况,一些组件开始闪烁,只有当我离模型有一段距离时。

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

更新:现在我知道了 - 问题在我的模型中(我检查了一些其他模型)。我不明白为什么但是Plane对象给出了那个闪烁。也许问题不在Plane对象中。

enter image description here

2 个答案:

答案 0 :(得分:4)

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

透视相机为您提供了一个可视区域:

View Frustum

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

您所看到的内容被称为“Z-fighting。这是Z缓冲区不够精确以区分两个给定像素的深度的地方。所以你最终会得到一些应该被拒绝的像素,因为这些像素已经被“渲染”,而不是已经被渲染了。

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

如果尚未启用,您可能还希望启用背面剔除(RasterizerState.CullCounterClockwise)。这会剔除背离相机的三角形,消除了一种可能的Z战斗来源。

答案 1 :(得分:0)

我之前已经看到过这种情况发生在两个或多个表面在同一平面上重叠的模型中,一个表面在另一个表面内但在同一个平面内 - 因此系统无法分辨哪个表面位于另一个表面之前并且通常最终会混合两个表面。

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