超出远剪裁平面的对象在透视图中呈现

Objects beyond the far clipping plane are rendered in perspective view

我在透视投影中看到远处 clipping plane 之外的物体,我不认为这是它应该如何工作的,所以有人可以给我解释为什么我看到远处裁剪平面之外的物体例如本例中的网格。

正交投影工作正常

我清除了这个演示中的所有形状,并通过更改 Luna Frank Shapes Demo

中的以下代码添加了两个网格
void ShapesApp::BuildRenderItems()
{
auto gridRitem = std::make_unique<RenderItem>();
gridRitem->World = MathHelper::Identity4x4();
gridRitem->ObjCBIndex = 0;
gridRitem->Geo = mGeometries["shapeGeo"].get();
gridRitem->PrimitiveType = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
gridRitem->IndexCount = gridRitem->Geo->DrawArgs["grid"].IndexCount;
gridRitem->StartIndexLocation = gridRitem->Geo->DrawArgs["grid"].StartIndexLocation;
gridRitem->BaseVertexLocation = gridRitem->Geo->DrawArgs["grid"].BaseVertexLocation;
mAllRitems.push_back(std::move(gridRitem));

 gridRitem = std::make_unique<RenderItem>();
XMStoreFloat4x4(&gridRitem->World, XMMatrixTranslation(0,-1002,0)* XMMatrixRotationRollPitchYaw(1.5708, 0, 0));;
gridRitem->ObjCBIndex = 1;
gridRitem->Geo = mGeometries["shapeGeo"].get();
gridRitem->PrimitiveType = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
gridRitem->IndexCount = gridRitem->Geo->DrawArgs["grid"].IndexCount;
gridRitem->StartIndexLocation = gridRitem->Geo->DrawArgs["grid"].StartIndexLocation;
gridRitem->BaseVertexLocation = gridRitem->Geo->DrawArgs["grid"].BaseVertexLocation;
mAllRitems.push_back(std::move(gridRitem));

gridRitem = std::make_unique<RenderItem>();
XMStoreFloat4x4(&gridRitem->World, XMMatrixTranslation(0, -1002, 0) * XMMatrixRotationRollPitchYaw(1.5708, 1.5708, 0));
gridRitem->ObjCBIndex = 2;
gridRitem->Geo = mGeometries["shapeGeo"].get();
gridRitem->PrimitiveType = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
gridRitem->IndexCount = gridRitem->Geo->DrawArgs["grid"].IndexCount;
gridRitem->StartIndexLocation = gridRitem->Geo->DrawArgs["grid"].StartIndexLocation;
gridRitem->BaseVertexLocation = gridRitem->Geo->DrawArgs["grid"].BaseVertexLocation;
mAllRitems.push_back(std::move(gridRitem));

并更改网格大小

GeometryGenerator::MeshData grid = geoGen.CreateGrid(200.0f, 200.0f, 60, 40);

和调整大小的投影矩阵

 XMMATRIX P = XMMatrixPerspectiveFovLH(0.25f * MathHelper::Pi, AspectRatio(), .1f, 1000.f);
XMStoreFloat4x4(&mProj, P);

现在我仍然可以看到网格,即使它超出了远平面,即使远平面为 900,它仍然出现在屏幕边缘的旋转中。所以我需要减少远平面或进一步移动网格,并且当我不断更改远平面的值时,我可以看到一个形状像画笔一样工作,它隐藏了它之外的所有东西但是随着相机旋转并且网格不再在它后面重新出现网格

这就是我所说的画笔

我认为您认为最大视距始终与 camera/eye 位置相距 900 个单位。如果是这样的话,它根本就不是一个裁剪平面,而是一条曲线——一个球体的一个扇区。

实际上视锥体是由6个平面组成的截头金字塔。当远平面设置为 900 时,视图中心像素的视图距离为 900,但角落处的视图距离要高得多(高多少取决于 FOV - 您可以使用有点触发)。

因此,当您左右转动相机时,距离相机约 900 个单位的物体会在与远平面相交时进出视野。