水波法线计算略有偏差

xkrw2x1b  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(125)

我在本文中实现了“正弦和近似”:https://developer.nvidia.com/gpugems/gpugems/part-i-natural-effects/chapter-1-effective-water-simulation-physical-models

我的几何体工作正常,但法线有些错误。它们的x值和z值是颠倒的,我想知道我在实现中做错了什么。

使用以下公式:

在着色器中,法线的生成如下所示:

vec3 generateWaveSineSumNormal(sineParams _params[sineCount])
{
        vec2 pos = vec2(aPos.x, aPos.z);
        vec3 normal = vec3(0.0f, 1.0f, 0.0f);

        for(int i=0; i<sineCount; i++)
        {
            sinParams curParams = _params[i];
            normal.x += sineExponent * curParams.direction.x * curParams.frequency * curParams.amplitude * 
                        pow((sin(dot(curParams.direction, pos) * curParams.frequency + curTime * curParams.speed)+1)/2, sineExponent-1)
                        * cos(dot(curParams.direction, pos) * curParams.frequency + curTime * curParams.speed);

            normal.z += sineExponent * curParams.direction.y * curParams.frequency * curParams.amplitude * 
                        pow((sin(dot(curParams.direction, pos) * curParams.frequency + curTime * curParams.speed)+1)/2, sineExponent-1)
                        * cos(dot(curParams.direction, pos) * curParams.frequency + curTime * curParams.speed);
        }

        return vec3(-normal.x, normal.y, -normal.z);

}

当x和z值像这样翻转时,法线是好的。我只是想知道我在执行它时做错了什么,因为我就是找不到它。

pw9qyyiw

pw9qyyiw1#

您的normal.xz可以正确计算高度图的渐变。坡度指向上坡,即高度值增加的地方。当法线投影到水平面上时,它将向后指向。

这可以通过使用两条切线的叉积从数学上推导出来,这就是那篇文章在“法线和切线”一节中所做的。特别地,相关结果是“方程式6b”中的法线的公式,它包括负号:

相关问题