我在本文中实现了“正弦和近似”: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值像这样翻转时,法线是好的。我只是想知道我在执行它时做错了什么,因为我就是找不到它。
1条答案
按热度按时间pw9qyyiw1#
您的
normal.xz
可以正确计算高度图的渐变。坡度指向上坡,即高度值增加的地方。当法线投影到水平面上时,它将向后指向。这可以通过使用两条切线的叉积从数学上推导出来,这就是那篇文章在“法线和切线”一节中所做的。特别地,相关结果是“方程式6b”中的法线的公式,它包括负号: