我正在尝试使用C ++和DirectX11实现海洋场景。目前,我有一个投影网格,Gerstner波浪和基本阴影。我的问题是,当我将相机水平对准目标时,即使远处的顶点数很高,也可以看到远处的水平面,投影网格变得不足。这些屏幕截图说明了问题所在:





我知道问题的原因在于投影网格的概念(网格在相机附近有详细说明,距离相机很远),但是必须有最佳实践来解决。

有什么想法吗?

#1 楼

我相信一个常见的解决方案是将用于投影网格的相机变换与用于渲染网格的相机变换分开。在接近自上而下的视角时,两个摄像机重合,但是当观察摄像机接近水平视角时,投影摄像机会偏离并尝试保持最小倾斜度,即,它徘徊在观察摄像机上方的某个位置,并略微向下看。

棘手的一点是要确保投影相机的视场始终覆盖从渲染相机看到的场景区域。我手头没有详细介绍如何计算合适的变换的资源,手工推导可能很繁琐。

另一种解决方案是获取信号处理工具箱:所看到的工件由于投影网格对波高场的采样不足,因此图像中的图像本质上是混叠。因此,一种解决方案是根据栅格单元的投影面积适当地过滤高度场。我相信这是用于离线渲染海洋的方法,它实质上可以确保地平线上的波浪平坦。但是,我不确定这在实时渲染中是否可行,因为您将需要高质量的各向异性过滤来使这种方法看起来合理。

评论


$ \ begingroup $
感谢您的建议,我现在选择了惰性解决方案。我在顶点着色器中使用了一个功能,该功能可根据距相机的距离确定波衰减。
$ \ endgroup $
–加博尔·萨洛基(GáborSzalóki)
15年11月5日在18:52

#2 楼

您可以是现实的,也可以是实时的。秘诀是每当信息在Shannon-Nyquist(即网格)尺度下获取时,都要改变表示形式:从几何图形到法线贴图再到阴影模型。本文是为您制作的:http://maverick.inria.fr/Publications/2010/BNH10/index.php(另请参见Yoube视频)

#3 楼

诸如Maya之类的某些软件通过使用极坐标(或实际上是在一定距离内变为极坐标的笛卡尔坐标)来解决此问题,方法与以栅格为中心位于相机位置一样。此设置在最重要的位置添加了更多细节,然后在更远的范围内依赖着色器的正常处理。有改进的空间。您可以对这种方法进行一些冷修改,使其具有任何其他形状来增加朝向相机的网格密度。这样做的好处是您可以将效果延伸到地平线,而不必担心接缝。

在这种情况下,不要使位移变得混乱的技巧是,随着距离的增加,逐渐减小位移。然后,只要进一步操作,就可以在像素着色器中使用常规修改。这比必须过滤准确的Shiluette边缘更容易过滤。另外,如果您可以看到很远的地方,那么您的迷宫反而可能足够平坦。

#4 楼

Benedikt提到的技术在本论文的2.4.1节中进行了解释。

http://fileadmin.cs.lth.se/graphics/theses/projects/projgrid/projgrid- lq.pdf

实施此方法可以解决您的问题。