假设我有这个字符,我想让用户选择它,所以当它被选中时,我希望显示一个轮廓线。
这个字符是一个包含一些网格的object3D。 我尝试克隆并设置背面材料,但是没有成功,问题在于形状中的每个立方体都在单独地呈现反面,因此轮廓线不正确。
我需要为轮廓线创建另一个网格吗?还有更简单的方法吗?
假设我有这个字符,我想让用户选择它,所以当它被选中时,我希望显示一个轮廓线。
这个字符是一个包含一些网格的object3D。 我尝试克隆并设置背面材料,但是没有成功,问题在于形状中的每个立方体都在单独地呈现反面,因此轮廓线不正确。
我需要为轮廓线创建另一个网格吗?还有更简单的方法吗?
@spassvolgel所写的是正确的;
我怀疑需要做的是这样的:1.首先渲染背景;2.然后,在另一个透明的图层上,用一个扁平的颜色绘制角色模型,稍微比原来的大一点;3.在另一个透明图层上,使用角色的正常材质/纹理;4.最后,将角色图层放在轮廓图层的顶部,然后将它们组合放置在背景中。
您只需创建多个场景,并使用顺序渲染通道将它们组合起来:
renderer.autoClear = false;
. . .
renderer.render(scene, camera); // the entire scene
renderer.clearDepth();
renderer.render(scene2, camera); // just the selected item, larger, in a flat color
renderer.render(scene3, camera); // the selected item again
three.js.r.129
uniform vec3 viewVector;
uniform float c;
uniform float p;
varying float intensity;
void main()
{
vec3 vNormal = normalize( normalMatrix * normal );
vec3 vNormel = normalize( normalMatrix * viewVector );
intensity = pow( c - dot(vNormal, vNormel), p );
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
uniform vec3 glowColor;
varying float intensity;
void main()
{
vec3 glow = glowColor * intensity;
gl_FragColor = vec4( glow, 1.0 );
}
我在gamedev.stackexchange.com上找到了一些可能有用的东西。他们谈论了模板缓冲区。但是我不知道如何将其应用于THREE.js..
我还没有找到答案,但是我想演示一下当我创建多个网格,并在每个网格后面放置另一个网格时会发生什么。
side: THREE.BackSide
正如您所看到的,这不是期望的效果。我希望在所有三个网格后面有一个干净的轮廓,而且不重叠。我的着色器编程水平真的很低,但在大多数在线资源中,人们都建议使用克隆网格的方法。