Graphics 如何计算glsl中两条法线之间的角度?
如何计算glsl中两条法线之间的角度?我试图将菲涅尔效果添加到对象的外边缘(将该效果与phong着色相结合),我认为角度是我唯一缺少的东西 片段着色器:Graphics 如何计算glsl中两条法线之间的角度?,graphics,geometry,glsl,angle,fresnel,Graphics,Geometry,Glsl,Angle,Fresnel,如何计算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_ModelViewProj
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,你可以得到它们之间夹角的余弦
cos A = DotProduct(v1, v2) / (Length(v1) * Length(v2))
使用此方法,在计算F时不需要计算余弦。因为向量是单位向量,例如,长度为1,所以甚至可以避免除法。两个向量之间的点积将返回角度的余弦(在GLSL中为点(a,b))。取其弧余弦将以弧度为单位返回角度(在GLSL中为acos(x)) 圆点产品很便宜,弧余弦很贵 然而,菲涅耳效应实际上并不需要角度。向量之间有点结果就足够了。菲涅耳效应有很多近似方法,其中最便宜的方法就是直接使用圆点。或者将其平方(x*x),或者提升到其他幂 在上面的着色器中,看起来您只是想将圆点提高到5次方。比如:
float oneMinusDot = 1.0 - dot(L, N);
float F = pow(oneMinusDot, 5.0);
glsl甚至有一个内置的点积运算符。代码行非常简单:cA=dot(v1,v2);在此之后,所有cos(A)引用都可以替换为cA。两个向量之间的
点积将返回角度的余弦
语句仅适用于单位向量。