C++ OpenGL近平面剪裁过多

C++ OpenGL近平面剪裁过多,c++,opengl,math,camera,clip,C++,Opengl,Math,Camera,Clip,我的相机有一些问题,近平面似乎太远了,即使我将其设置为0.1或更低。看起来已经有一些偏移值了。因此,您无法真正接近场景中的任意对象 下面是bug的视觉外观。 显示的黑色三角形是剪辑。 目前我正在使用透视矩阵,下面是代码 Matrix4x4 Matrix4x4::Perspective(Float fov, Float aspectRatio, Float near, Float far) { Matrix4x4 result(1.0f); Float q = 1.0f / t

我的相机有一些问题,近平面似乎太远了,即使我将其设置为0.1或更低。看起来已经有一些偏移值了。因此,您无法真正接近场景中的任意对象

下面是bug的视觉外观。

显示的黑色三角形是剪辑。 目前我正在使用透视矩阵,下面是代码

Matrix4x4 Matrix4x4::Perspective(Float fov, Float aspectRatio, Float near, Float far)
{
    Matrix4x4 result(1.0f);

    Float q = 1.0f / tan(toRadians(0.5f * fov));
    Float a = q / aspectRatio;

    Float b = (near + far) / (near - far);
    Float c = (2.0f * near * far) / (near - far);

    result.elements[0 + 0 * 4] = a;
    result.elements[1 + 1 * 4] = q;
    result.elements[2 + 2 * 4] = b;
    result.elements[2 + 3 * 4] = -1.0f;
    result.elements[3 + 2 * 4] = c;

    return result;
}
我不觉得这个虫子是数学课上的。这是因为数学代码主要来自我一直在做的另一个项目。从那以后,一切都很好。 我也不怀疑这是我向前渲染的方式。我相信我的指针很好,因为我可以通过鼠标和键盘移动和旋转相机

但是!我怀疑的是缓冲区。OpenGL缓冲区。但我不完全确定

我希望有人能给我一些建议,告诉我怎样才能找到并解决这个问题


提前谢谢。

一张图片胜过1000字,所以:

正如我在评论中提到的,如果你的立方体大小为r=1.0的一半,并且你将相机设置在距离立方体中心r的位置,你仍然会被z_附近的物体切割,因为立方体边缘距离中心的距离在一定范围内,所以所有朝向相机的边缘都会被切割

但也如前所述,这只是猜测,因为您没有提供与此矩阵和网格内容相关的任何测试数据


右边的PS是您的相机设置的立方体侧视图,我猜您已经设置好了。绿色+/-Z是您的查看方向。

一张图像的价值超过1000个单词,因此:

正如我在评论中提到的,如果你的立方体大小为r=1.0的一半,并且你将相机设置在距离立方体中心r的位置,你仍然会被z_附近的物体切割,因为立方体边缘距离中心的距离在一定范围内,所以所有朝向相机的边缘都会被切割

但也如前所述,这只是猜测,因为您没有提供与此矩阵和网格内容相关的任何测试数据


右边的PS是您的相机设置的立方体侧视图,我猜您已经设置好了。绿色+/-Z是您的查看方向。

glEnableGL\u DEPTH\u CLAMP解决了问题

glEnableGL\u DEPTH\u CLAMP解决了问题

首先,您必须提供除投影矩阵视图、世界和其他任何变换之外的所有其他变换。很明显,立方体的顶点缓冲区是必需的,你知道它可能是什么问题吗?@JekasG:你的立方体可能只是超出了青春痘——不仅仅是立方体的对角线,甚至是edges@JekasG摄像机的位置是?我的赌注和datenwolf提到的完全一样。立方体顶点坐标为+/-1.0,从1.0的距离看,该距离将与znear附近的所有碎片相交。在立方体对角线上,放大系数高达sqrt3,在剪裁开始的边缘上,放大系数至少为sqrt2平方对角线。要测试它,请尝试渲染球体,如果不进行剪裁,您知道它是这样的…首先,您必须提供除投影矩阵视图、世界和其他任何变换之外的所有其他变换。很明显,立方体的顶点缓冲区是必需的,你知道它可能是什么问题吗?@JekasG:你的立方体可能只是超出了青春痘——不仅仅是立方体的对角线,甚至是edges@JekasG摄像机的位置是?我的赌注和datenwolf提到的完全一样。立方体顶点坐标为+/-1.0,从1.0的距离看,该距离将与znear附近的所有碎片相交。在立方体对角线上,放大系数高达sqrt3,在剪裁开始的边缘上,放大系数至少为sqrt2平方对角线。要测试它,请尝试渲染球体,如果不剪裁,您知道这是。。。