gpt4 book ai didi

opengl - GLSL 通过采样使用噪声函数在顶点着色器中计算球体网格上的法线会产生奇怪的图形错误

转载 作者:行者123 更新时间:2023-12-02 06:26:37 24 4
gpt4 key购买 nike

我正在尝试在顶点着色器中计算球体表面的法线,因为我将噪声计算推迟到顶点着色器。当我的 theta(采样角度)接近 1 时,法线结果很好,但对于更详细的地形和较小的 theta,我的法线变得非常不正确。这就是我的意思:

准确的法线

Accurate normals

θ 值越高,噪声越详细

More detailed noise with a higher theta

放大到最后一个图像的表面。红色表示山脊,蓝色表示不正确的阴影

More detailed noise with a higher theta zoomed in

我用来计算法线的代码是:

vec3 calcNormal(vec3 pos)
{
float theta = .1; //The closer this is to zero the less accurate it gets
vec3 vecTangent = normalize(cross(pos, vec3(1.0, 0.0, 0.0))
+ cross(pos, vec3(0.0, 1.0, 0.0)));
vec3 vecBitangent = normalize(cross(vecTangent, pos));
vec3 ptTangentSample = getPos(pos + theta * normalize(vecTangent));
vec3 ptBitangentSample = getPos(pos + theta * normalize(vecBitangent));

return normalize(cross(ptTangentSample - pos, ptBitangentSample - pos));
}

我用

调用 calcNormal
calcNormal(getPos(position))

其中 getPos 是 3D 噪声函数,它接受并返回 vec3,position 是球体上的原始位置。

最佳答案

感谢@NicoSchertler,正确的 calcNormal 版本是

vec3 calcNormal(vec3 pos)
{
float theta = .00001;
vec3 vecTangent = normalize(cross(pos, vec3(1.0, 0.0, 0.0))
+ cross(pos, vec3(0.0, 1.0, 0.0)));
vec3 vecBitangent = normalize(cross(vecTangent, pos));
vec3 ptTangentSample = getPos(normalize(pos + theta * normalize(vecTangent)));
vec3 ptBitangentSample = getPos(normalize(pos + theta * normalize(vecBitangent)));

return normalize(cross(ptTangentSample - pos, ptBitangentSample - pos));
}

关于opengl - GLSL 通过采样使用噪声函数在顶点着色器中计算球体网格上的法线会产生奇怪的图形错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39292925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com