Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 沿非相交三角形边的Z战斗_Opengl_Opentk_Depth Buffer - Fatal编程技术网

Opengl 沿非相交三角形边的Z战斗

Opengl 沿非相交三角形边的Z战斗,opengl,opentk,depth-buffer,Opengl,Opentk,Depth Buffer,我有一个OpenGL程序,它演示了不寻常的z形格斗,我对这一原因一无所知。看起来大部分的战斗都是沿着三角形的边缘展开的 简化测试用例中的两个对象不相交,如下所示。我已确保z-near和z-far值是合理的(分别为1和100)。这两个对象都在距离原点约2个单位的范围内,在所示图像中,相机距离原点约10个单位 除了启用了深度测试外,未对OpenGL的默认深度设置进行任何更改 顶点和片段着色器已尽可能简单 这是在使用OpenTK。我曾尝试使用32位深度缓冲区显式创建窗口,但也没有效果 作为深度缓冲的要

我有一个OpenGL程序,它演示了不寻常的z形格斗,我对这一原因一无所知。看起来大部分的战斗都是沿着三角形的边缘展开的

简化测试用例中的两个对象不相交,如下所示。我已确保z-near和z-far值是合理的(分别为1和100)。这两个对象都在距离原点约2个单位的范围内,在所示图像中,相机距离原点约10个单位

除了启用了深度测试外,未对OpenGL的默认深度设置进行任何更改

顶点和片段着色器已尽可能简单

这是在使用OpenTK。我曾尝试使用32位深度缓冲区显式创建窗口,但也没有效果

作为深度缓冲的要求,我已经完成了列表中所有四件事情

关闭深度测试可以消除冲突,使对象按图形顺序重叠。程序中没有使用剔除或模版

有没有其他可能的原因导致这种z-战斗

顶点矩阵的生成如下所示:

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-fighting。这是一个猜测,但你的程序实际上使用硬件加速吗?众所周知,微软的软件渲染器会产生这样的损坏

建议:

  • 检查
    GL.GetString(StringName.Renderer)
    是否不是“Microsoft GDI Renderer”,因为这表示软件加速
  • 尝试请求24位深度缓冲区,而不是32位深度缓冲区,因为GPU不支持后者
  • 通过
    Context.GraphicsMode.depth
    仔细检查深度缓冲位。默认值为16位

  • 请求32位时会发生什么情况取决于您使用的OpenTK版本。对于不受支持的模式(如32位深度缓冲区),OpenTK 1.0将退回到软件加速。OpenTK 1.1将更加努力地为您提供匹配的
    GraphicsMode
    ,并且将仅作为最后手段使用软件加速。

    在我看来不像是z-fighting。尝试调试投影矩阵。GPU支持32位深度缓冲区。但是,Windows上的许多ICD不为具有32位深度缓冲区的默认帧缓冲区公开像素格式。换句话说,你经常需要使用FBO来访问32位的深度格式。这肯定不是第一次,因为我正在Linux上测试这个。渲染器是
    GeForce GTX 560/PCIe/SSE2
    。深度默认为24位。这看起来很奇怪。你能上传一个测试项目吗?