视图矢量和法线之间的角度?
Angle between view vector and normal?
相当标准的 GLSL 问题。不幸的是,虽然我熟悉它背后的数学原理,但我对 webgl 级别的实现并不确定。着色器调试起来相当棘手。
我正在尝试在 glsl 着色器级别获取视图向量与对象法线之间的角度。我正在使用 threejs,但通过它们创建了我自己的共享者。
这是顶点着色器的相关部分:
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
vec3 nmalInWorld = normalize(normalMatrix * normal);
vec3 camInWorld = cameraPosition;
vec4 posInWorld = modelViewMatrix * vec4(position, 1.0);
posInWorld /= posInWorld[3];
angle = -dot(normalize(posInWorld - vec4(cameraPosition, 1.0)), normalize(vec4(nmalInWorld,1.0)));
if(angle > 0.7){
angle = 1.0;
}else{
angle = 0.0;
}
我已经尝试了这种安排的几种排列方式,所以如果不必要地复杂化,我提前表示歉意。我确实得到了一些与我想要的非常相似的东西——它在相机视角方面肯定总是一样的,但由于某种我不明白的原因它没有居中。片段着色器只是直接将角度修补到色域。
如您所见,白点没有位于球体的中心,这是预期的结果。我真的不明白为什么。也许它缺少透视变换应用程序?试过了没有成功。我不认为视图矢量在这种情况下应该相关,无论相机的目标如何,球体都应该保持相同的颜色。
posInWorld
、vec4(cameraPosition, 1.0)
和 vec4(nmalInWorld,1.0)
是 Homogeneous coordinates。
向量夹角Dot product of 2 Cartesian Unit vectors is equal to the Cosine。
"view"向量是从顶点位置到相机位置的归一化笛卡尔向量。当顶点位置被 modelViewMatrix
变换时,结果是视图中的位置 space。相机的viewspace位置是(0,0,0),因为viewspace的原点就是相机的位置:
vec4 posInView = modelViewMatrix * vec4(position, 1.0);
posInView /= posInView[3];
vec3 VinView = normalize(-posInView.xyz); // (0, 0, 0) - posInView
normalMatrix
将向量从模型 space 转换为视图 space:
vecr NinView = normalize(normalMatrix * normal);
VinView
和 NinView
都是视图 space 中的向量。前者是顶点到相机的点,后者是顶点坐标处的曲面法向量。
两个向量夹角的余弦可以通过点积得到:
float NdotV = dot(NinView, VinView);
相当标准的 GLSL 问题。不幸的是,虽然我熟悉它背后的数学原理,但我对 webgl 级别的实现并不确定。着色器调试起来相当棘手。
我正在尝试在 glsl 着色器级别获取视图向量与对象法线之间的角度。我正在使用 threejs,但通过它们创建了我自己的共享者。
这是顶点着色器的相关部分:
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
vec3 nmalInWorld = normalize(normalMatrix * normal);
vec3 camInWorld = cameraPosition;
vec4 posInWorld = modelViewMatrix * vec4(position, 1.0);
posInWorld /= posInWorld[3];
angle = -dot(normalize(posInWorld - vec4(cameraPosition, 1.0)), normalize(vec4(nmalInWorld,1.0)));
if(angle > 0.7){
angle = 1.0;
}else{
angle = 0.0;
}
我已经尝试了这种安排的几种排列方式,所以如果不必要地复杂化,我提前表示歉意。我确实得到了一些与我想要的非常相似的东西——它在相机视角方面肯定总是一样的,但由于某种我不明白的原因它没有居中。片段着色器只是直接将角度修补到色域。
如您所见,白点没有位于球体的中心,这是预期的结果。我真的不明白为什么。也许它缺少透视变换应用程序?试过了没有成功。我不认为视图矢量在这种情况下应该相关,无论相机的目标如何,球体都应该保持相同的颜色。
posInWorld
、vec4(cameraPosition, 1.0)
和 vec4(nmalInWorld,1.0)
是 Homogeneous coordinates。
向量夹角Dot product of 2 Cartesian Unit vectors is equal to the Cosine。
"view"向量是从顶点位置到相机位置的归一化笛卡尔向量。当顶点位置被 modelViewMatrix
变换时,结果是视图中的位置 space。相机的viewspace位置是(0,0,0),因为viewspace的原点就是相机的位置:
vec4 posInView = modelViewMatrix * vec4(position, 1.0);
posInView /= posInView[3];
vec3 VinView = normalize(-posInView.xyz); // (0, 0, 0) - posInView
normalMatrix
将向量从模型 space 转换为视图 space:
vecr NinView = normalize(normalMatrix * normal);
VinView
和 NinView
都是视图 space 中的向量。前者是顶点到相机的点,后者是顶点坐标处的曲面法向量。
两个向量夹角的余弦可以通过点积得到:
float NdotV = dot(NinView, VinView);