如何在 three.js 中仅在黑暗区域制作 emissiveMap 光照?
How to make emissiveMap lighting only in dark areas in three.js?
使用 three.js,我用纹理渲染地球。我还添加了一个发光纹理来添加城市灯光。但是我有一个问题,即使是地球的光区也会发出城市的光。
示例:
是否可以只在黑暗区域渲染自发光纹理光照?我没有找到任何方法。
我的贴图是这样设置的:
material.emissiveMap = loader.load('../assets/earth-light.png');
material.emissiveIntensity = 0.005;
material.emissive = new THREE.Color(163, 169, 133);
在我最初发表评论后,我一直在思考这个问题。我认为有一个解决方案。渲染完地球后,您可以在 a separate layer 中渲染城市灯光。图层让您可以使用互不影响的分隔灯光进行单独的渲染过程。
考虑到这一点,与其让城市发光,不如让它们反射从太阳另一侧发出的第二道光。
第 1 层渲染:
- 阳光
- 具有地球纹理的球体
第 2 层渲染:
- 太阳对面的光
- 另一个带有城市纹理的球体
你的城市 material 看起来像这样:
const cityOutlines = loader.load('../assets/earth-light.png');
const citiesMaterial = new THREE.MeshLambertMaterial({
transparent: true,
alphaMap: cityOutlines,
color: new THREE.Color(163, 169, 133),
depthTest: false, // So it doesn't z-fight the main Earth sphere
blending: THREE.AdditiveBlending // Lights are additive
});
这个 material 可以从太阳的另一面照亮。加法混合,黑色得不到光的部分会看不见,亮的部分会发光。
要查看正在运行的层以及如何设置它们,请访问 this demo in the Three.js website。您可以通过单击 < >
图标查看源代码。
使用 three.js,我用纹理渲染地球。我还添加了一个发光纹理来添加城市灯光。但是我有一个问题,即使是地球的光区也会发出城市的光。
示例:
是否可以只在黑暗区域渲染自发光纹理光照?我没有找到任何方法。
我的贴图是这样设置的:
material.emissiveMap = loader.load('../assets/earth-light.png');
material.emissiveIntensity = 0.005;
material.emissive = new THREE.Color(163, 169, 133);
在我最初发表评论后,我一直在思考这个问题。我认为有一个解决方案。渲染完地球后,您可以在 a separate layer 中渲染城市灯光。图层让您可以使用互不影响的分隔灯光进行单独的渲染过程。
考虑到这一点,与其让城市发光,不如让它们反射从太阳另一侧发出的第二道光。
第 1 层渲染:
- 阳光
- 具有地球纹理的球体
第 2 层渲染:
- 太阳对面的光
- 另一个带有城市纹理的球体
你的城市 material 看起来像这样:
const cityOutlines = loader.load('../assets/earth-light.png');
const citiesMaterial = new THREE.MeshLambertMaterial({
transparent: true,
alphaMap: cityOutlines,
color: new THREE.Color(163, 169, 133),
depthTest: false, // So it doesn't z-fight the main Earth sphere
blending: THREE.AdditiveBlending // Lights are additive
});
这个 material 可以从太阳的另一面照亮。加法混合,黑色得不到光的部分会看不见,亮的部分会发光。
要查看正在运行的层以及如何设置它们,请访问 this demo in the Three.js website。您可以通过单击 < >
图标查看源代码。