我有一个问题,就是将一个threejs材质(自定义片段着色器)朝向相机,在已旋转的网格上定向。
我正在寻找的效果是一个在中心看起来是透明的球体,并且朝向边缘逐渐变得更不透明。我的工作基于this demo。问题是,如果旋转网格,该技术将失败。
以下是问题的现场演示:http://palebluepixel.org/demos/threejs-rotation-question/
球体是相同的,但其中一个球体每帧都旋转一次(earthBad.rotation.y += 0.005;
)。通过旋转它,球体的透明半部分随之旋转。
顶点着色器
根据法向量和视图向量之间的角度计算透明度的intensity
。
uniform vec3 spherePosition;
uniform vec3 cameraPosition;
varying float intensity;
varying vec2 vUv;
void main()
{
vec3 viewVector = cameraPosition - spherePosition;
vec3 vNormal = normalize( normalMatrix * normal );
vec3 vNormel = normalize( normalMatrix * viewVector );
intensity = pow( 1.0 - dot(vNormal, vNormel), 0.5 );
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
片段着色器
使用纹理贴图并使用intensity
值覆盖Alpha通道。
uniform sampler2D sphereTexture;
varying float intensity;
varying vec2 vUv;
void main()
{
vec4 fragColor = texture2D(sphereTexture, vUv);
fragColor.a = intensity;
gl_FragColor = fragColor;
}
当网格未旋转时,球体的透明半部分完全跟随相机。但是,当网格旋转时,透明的一半会随之旋转。
对于我的业余人士来说,在材质的着色器运行后,似乎three.js将旋转应用于网格。
我该如何解决这个问题?我尝试将网格物体quaternion
拉入着色器,以为我可以将反向旋转应用于intensity
计算,但数学算法没有找到。