OpenGL 近平面剪裁太多
OpenGL near plane is clipping too much
我的相机出现一些问题,近平面似乎太远,即使我将它设置为 0.1 或更低。似乎已经有一些偏移值。所以你不能真正靠近场景中的任意对象。
下面是错误的视觉外观。
显示的黑色三角形是剪裁。
目前我正在使用透视矩阵,这是相关代码。
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;
}
我不觉得这个错误来自数学class。这是因为数学代码主要来自我一直从事的另一个项目。从那里工作得很好。
我也不怀疑这是我渲染它的方式(前向渲染器)。我相信我的指示是好的,因为我可以通过鼠标和键盘移动和旋转相机。
但是!我怀疑是缓冲区。 OpenGL 缓冲区。但我不是很确定。
我希望有人能给我一些建议,告诉我如何找到并解决这个错误。
提前谢谢你。
好吧,一张图片的价值超过 1000 个字,所以:
正如我在评论中提到的,如果你的立方体是一半大小 r=1.0
并且你将相机设置在距立方体中心 r
的距离内,你仍然会被 z_near
切割为立方体边缘在 <sqrt(2),sqrt(3)>
范围内远离中心,因此所有朝向相机的边缘都将被切断 ...
但也如前所述,这只是猜测,因为您没有提供任何与此相关的测试数据(矩阵和网格内容)...
PS右边是你的相机设置的立方体侧视图我猜你已经设置好了。绿色(+/-)Z
是你的视线方向
"glEnable(GL_DEPTH_CLAMP)" 解决了问题
我的相机出现一些问题,近平面似乎太远,即使我将它设置为 0.1 或更低。似乎已经有一些偏移值。所以你不能真正靠近场景中的任意对象。
下面是错误的视觉外观。
显示的黑色三角形是剪裁。 目前我正在使用透视矩阵,这是相关代码。
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;
}
我不觉得这个错误来自数学class。这是因为数学代码主要来自我一直从事的另一个项目。从那里工作得很好。 我也不怀疑这是我渲染它的方式(前向渲染器)。我相信我的指示是好的,因为我可以通过鼠标和键盘移动和旋转相机。
但是!我怀疑是缓冲区。 OpenGL 缓冲区。但我不是很确定。
我希望有人能给我一些建议,告诉我如何找到并解决这个错误。
提前谢谢你。
好吧,一张图片的价值超过 1000 个字,所以:
正如我在评论中提到的,如果你的立方体是一半大小 r=1.0
并且你将相机设置在距立方体中心 r
的距离内,你仍然会被 z_near
切割为立方体边缘在 <sqrt(2),sqrt(3)>
范围内远离中心,因此所有朝向相机的边缘都将被切断 ...
但也如前所述,这只是猜测,因为您没有提供任何与此相关的测试数据(矩阵和网格内容)...
PS右边是你的相机设置的立方体侧视图我猜你已经设置好了。绿色(+/-)Z
是你的视线方向
"glEnable(GL_DEPTH_CLAMP)" 解决了问题