我正在尝试使用C ++和DirectX11实现海洋场景。目前,我有一个投影网格,Gerstner波浪和基本的阴影。我的问题是,当我将相机水平对准目标时,即使在高顶点数的情况下,我也可以看到远处的水平面,投影网格变得不足。这些屏幕快照说明了问题:
我知道问题的原因在于投影网格的概念(网格在相机附近是详细的,距离相机很远),但是必须有一个最佳实践来解决这个问题。
有任何想法吗?
我正在尝试使用C ++和DirectX11实现海洋场景。目前,我有一个投影网格,Gerstner波浪和基本的阴影。我的问题是,当我将相机水平对准目标时,即使在高顶点数的情况下,我也可以看到远处的水平面,投影网格变得不足。这些屏幕快照说明了问题:
我知道问题的原因在于投影网格的概念(网格在相机附近是详细的,距离相机很远),但是必须有一个最佳实践来解决这个问题。
有任何想法吗?
Answers:
我相信一种常见的解决方案是将用于投影网格的相机变换与用于渲染网格的相机变换分开。在接近自上而下的视角时,两个摄像机重合,但是当观察摄像机接近水平视角时,投影摄像机会偏离并试图保持最小倾斜度,即,它徘徊在观察摄像机上方的某个位置,并略微向下看。
棘手的一点是要确保投影相机的视场始终覆盖从渲染相机看到的场景区域。我手头没有详细介绍如何计算适当转换的资源,而手工导出可能很繁琐。
另一种解决方案是使用信号处理工具箱:图像中看到的伪像本质上是混叠,这是由于投影网格对波高场的采样不足所致。因此,一种解决方案是根据栅格单元的投影面积适当地过滤高度场。我相信这是用于离线渲染海洋的方法,它实质上可以确保地平线上的波浪平坦。但是,我不确定这在实时渲染中是否可行,因为您将需要高质量的各向异性过滤来使这种方法看起来合理。
诸如Maya之类的某些软件通过使用极坐标(或实际上是在一定距离内变成极坐标的笛卡尔坐标)来解决此问题,方法与以栅格为中心位于相机位置一样。此设置会在最重要的位置添加更多细节,然后在更远的范围内依赖着色器的正常处理。有改进空间的地方。您可以对这种方法进行冷修改,使其具有任何其他形状来增加朝向相机的网格密度。这样做的好处是您可以将效果延伸到地平线,而不必担心接缝。
在这种情况下,不要使位移混乱的技巧是,随着距离的增加,逐渐减小位移。然后,只要进一步操作,就可以在像素着色器中使用常规修改。这比必须过滤准确的Shiluette边缘更容易过滤。另外,如果您可以看到很远的地方,那么您的迷宫反而可能足够平坦。
Benedikt提到的技术在本文的2.4.1节中进行了解释。
http://fileadmin.cs.lth.se/graphics/theses/projects/projgrid/projgrid-lq.pdf
实施此操作应该可以解决您的问题。