在OpenGL中增加相机远距离

3

我有一个在3ds Max生成的地形网格,大小为10k乘以10k。我的问题是远裁剪面太近了,我看不到我想要看到的远处内容。我正在尝试实现一个雾化着色器,但我现在看到的结果并不理想。

我的相机构造函数如下:

Camera::Camera():
    cameraPosition_(glm::vec3(-1.0f, 1000.0f, 20.0f)),
    cameraLook_(glm::vec3(0.0f, 800.0f, 200.0f)),
    lookAt_(glm::lookAt(cameraPosition_,
                        cameraLook_,
                        WORLD_YAXIS)),
    near_(0.1f),
    far_(10000.0f),

    projection_(glm::perspective(
        70.0f,
        4.0f / 3.0f,
        near_,
        far_)),
    name_("Default Camera") 
{
}

结果看起来像这样:在这里输入图片描述


  1. 尝试检查3ds Max导出的单位必须是单位,而不是毫米、厘米或米。
  2. 尝试为地形网格禁用多边形裁剪(导出后可能存在多边形方向的问题)。
- Mykola
你可以尝试对网格进行归一化处理,使其在0到1的范围内成为一个盒子。 - Unick
Z-buffer的限制来自于z_far/z_near比率。尝试使用near_(10f)。参见:http://www.gamedev.net/topic/173562-max-far-clip-plane-distance/ - Orace
是的,问题就在近平面附近。我将近平面设置为1.0f,现在它正常工作了。非常感谢大家。 - Lum Zhaveli
如果您需要更大深度范围,可以将更多的视景体叠加在一起,就像这个逼真的n体太阳系模拟,我会渲染从0.1米到1000 AU,此外,我会使用大气散射代替FOG。 - Spektre
1个回答

1
真实的相机没有近裁剪面和远裁剪面。虚拟相机需要它们来解决数字精度问题。把近裁剪面和远裁剪面设置为极端值以模拟真实相机是很诱人的,但这样做会失去意义。裁剪面之间的范围越小,你得到的伪像就越少,它们应该被设置为略微超出实际对象范围的范围。
(如果你确实需要在同一镜头中拍摄天空中的飞机和叶子上的虫子,请通过使用不同的相机设置两次绘制来模拟它)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接