投影网格水位线细节
Projected grid water horizon detail
我正在尝试使用 C++ 和 DirectX11 实现海洋场景。目前我有一个投影网格、Gerstner 波浪和一个基本的阴影。我的问题是,当我水平瞄准我的相机时,我可以看到远处的水面,即使在高顶点数时,投影网格也会变得不足。这些屏幕截图说明了问题:
我知道问题的原因在于投影网格的概念(网格在相机附近是详细的,远离它是粗糙的),但必须有一个最佳实践来解决这个问题。
有什么想法吗?
您应该尝试在片段着色器而不是顶点着色器中实现您的 "basic shading" 算法。
Benedikt Bitterli 和 joojaa 在这里回答了我的问题:
https://computergraphics.stackexchange.com/questions/1681/projected-grid-water-horizon-detail
我暂时选择了最懒惰的解决方案。我在顶点着色器中根据与摄像机的距离计算衰减因子,然后逐渐拉平远处的波浪。
函数:
float CalculateWaveAttenuation(float d, float dmin, float dmax)
{
// Quadratic curve that is 1 at dmin and 0 at dmax
// Constant 1 for less than dmin, constant 0 for more than dmax
if (d > dmax) return 0.f;
else
{
return saturate((1.f / ((dmin-dmax)*(dmin-dmax))) * ((d-dmax) * (d-dmax)));
}
}
结果如下:
我正在尝试使用 C++ 和 DirectX11 实现海洋场景。目前我有一个投影网格、Gerstner 波浪和一个基本的阴影。我的问题是,当我水平瞄准我的相机时,我可以看到远处的水面,即使在高顶点数时,投影网格也会变得不足。这些屏幕截图说明了问题:
我知道问题的原因在于投影网格的概念(网格在相机附近是详细的,远离它是粗糙的),但必须有一个最佳实践来解决这个问题。
有什么想法吗?
您应该尝试在片段着色器而不是顶点着色器中实现您的 "basic shading" 算法。
Benedikt Bitterli 和 joojaa 在这里回答了我的问题: https://computergraphics.stackexchange.com/questions/1681/projected-grid-water-horizon-detail
我暂时选择了最懒惰的解决方案。我在顶点着色器中根据与摄像机的距离计算衰减因子,然后逐渐拉平远处的波浪。
函数:
float CalculateWaveAttenuation(float d, float dmin, float dmax)
{
// Quadratic curve that is 1 at dmin and 0 at dmax
// Constant 1 for less than dmin, constant 0 for more than dmax
if (d > dmax) return 0.f;
else
{
return saturate((1.f / ((dmin-dmax)*(dmin-dmax))) * ((d-dmax) * (d-dmax)));
}
}
结果如下: