【发布时间】:2014-03-02 04:59:57
【问题描述】:
我有一个 OpenGL 程序正在演示不寻常的 z-fighting 并且我迷失了这个原因。看起来大部分的战斗startx沿着三角形的边缘。
简化测试用例中的两个对象不相交,如下图。我确保 z-near 和 z-far 值是合理的(分别为 1 和 100)。这两个物体都在距离原点大约 2 个单位的范围内,在所示图像中,相机距离大约 10 个单位。
除了启用了深度测试之外,没有对 OpenGL 的默认深度设置进行任何更改。
顶点和片段着色器已尽可能简单。
这是使用 OpenTK。我已经尝试使用 32 位深度缓冲区显式创建窗口,但这也没有效果。
我已经了解了OpenGL FAQ 列出的深度缓冲要求的所有四件事。
关闭深度测试消除了战斗,使对象按绘图顺序重叠。程序中没有使用剔除或模板。
这种z-fighting还有其他可能的原因吗?
顶点矩阵的产生方式如下:
Matrix4 transform_matrix;
Matrix4.CreatePerspectiveFieldOfView((float) (45 * Math.PI / 180), aspect_ratio, 1, 100, out transform_matrix);
transform_matrix = Matrix4.Mult(transform_matrix, CameraMatrix);
CameraMatrix 就是这个方法的结果:
public void TransformMatrix(out Matrix4 m)
{
var t = Matrix4.Identity;
t.Column3 = new Vector4(Offset);
var rx = Matrix4.Identity;
var sine_x = (float) Math.Sin(-RotationX * Math.PI / 180);
var cos_x = (float) Math.Cos(-RotationX * Math.PI / 180);
rx.Row1 = new Vector4(0, cos_x, -sine_x, 0);
rx.Row2 = new Vector4(0, sine_x, cos_x, 0);
var ry = Matrix4.Identity;
var sine_y = (float) Math.Sin(-RotationY * Math.PI / 180);
var cos_y = (float) Math.Cos(-RotationY * Math.PI / 180);
ry.Row0 = new Vector4(cos_y, 0, sine_y, 0);
ry.Row2 = new Vector4(-sine_y, 0, cos_y, 0);
var n = Matrix4.Mult(rx, t);
n = Matrix4.Mult(ry, n);
m = n;
}
更新
这只发生在 NVIDIA 卡上。经 Intel 测试,未出现问题。
【问题讨论】:
-
在我看来不像是 Z 战。尝试调试您的投影矩阵。
标签: opengl opentk depth-buffer