水波法线计算略有偏差

问题描述 投票:0回答:1

我在本文中实现了“正弦近似之和”: 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值像这样翻转时,法线就很好了。我只是想知道我在实现它时做错了什么,因为我找不到它。

math opengl glsl
1个回答
2
投票

您的

normal.xz
正确计算了高度图的梯度。梯度指向上坡,即高度值增加。当投影在水平面上时,法线将指向后方。

这可以通过使用两条切线的叉积以数学方式导出,这就是该文章在“法线和切线”部分中所做的事情。特别是相关结果是“方程 6b”中的法线公式,其中包括负号:

© www.soinside.com 2019 - 2024. All rights reserved.