gpt4 book ai didi

graphics - 如何计算glsl中两条法线之间的角度?

转载 作者:行者123 更新时间:2023-12-03 06:21:46 24 4
gpt4 key购买 nike

如何计算 glsl 中两条法线之间的角度?我正在尝试将菲涅耳效果添加到对象的外边缘(将该效果与 phong 阴影相结合),并且我认为角度是我唯一缺少的东西。

片段着色器:

varying vec3 N;
varying vec3 v;

void main(void) {
v = vec3(gl_ModelViewMatrix * gl_Vertex);
N = normalize(gl_NormalMatrix * gl_Normal);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

顶点着色器:

varying vec3 N;
varying vec3 v;

void main(void) {
vec3 L = normalize(gl_LightSource[0].position.xyz - v);
vec3 E = normalize(-v);
vec3 R = normalize(-reflect(L,N));

vec4 Iamb = gl_FrontLightProduct[0].ambient
vec4 Idiff = gl_FrontLightProduct[0].diffuse * max(dot(N,L), 0.0);
vec4 Ispec = gl_FrontLightProduct[0].specular * pow(max(dot(R,E),0.0), gl_FrontMaterial.shininess);
vec4 Itot = gl_FrontLightModelProduct.sceneColor + Iamb + Idiff + Ispec;

vec3 A = //calculate the angle between the lighting direction and the normal//
float F = 0.33 + 0.67*(1-cos(A))*(1-cos(A))*(1-cos(A))*(1-cos(A))*(1-cos(A));
vec4 white = {1.0, 1.0, 1.0, 1.0};

gl_FragColor = F*white + (1.0-F)*Itot;
}

不同的 vec3

最佳答案

两个向量之间的点积将返回角度的余弦(在 GLSL 中为 dot(a,b))。对其取反余弦将返回以弧度为单位的角度(在 GLSL 中为 acos(x))。

点积非常便宜,反余弦相当昂贵。

然而,菲涅耳效应并不真正需要角度。只需在向量之间有点结果就足够了。菲涅尔效应有很多近似方法,最便宜的一种是直接使用点。或对其进行平方 (x*x),或求其他幂。

在上面的着色器中,看起来您只想将点提高到 5 次方。像这样的东西:

float oneMinusDot = 1.0 - dot(L, N);
float F = pow(oneMinusDot, 5.0);

关于graphics - 如何计算glsl中两条法线之间的角度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/338762/

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