【发布时间】:2013-11-14 15:06:35
【问题描述】:
我想在我的 Three.js 应用程序中模拟相机曝光控制,但我不知道应该如何处理。
所以我的问题是:我如何实现或模拟曝光控制,以便我可以配置相机或渲染器以获得非常黑暗的场景的清晰图像,或者不会过度曝光非常明亮的灯光场景?理想情况下,它应该与真实相机的工作方式一样接近(更像是调整 ISO 速度而不是光圈/快门)。
目前我使用各种可配置的 EffectComposer 后处理效果。其中一些允许在渲染后控制亮度、对比度等。显然这除了微调之外没有什么好处,因为不可能从已经渲染的标准动态范围图像中恢复高光或黑色阴影。
我考虑过的一些方法:
- 单独手动调整每个灯以获得所需的曝光。这是我目前的方法,我想摆脱它。
- 已经提到后处理。这太有限了,并且在极端情况下会导致图像质量下降。
- 我看到了一些可以调整曝光的 HDR 渲染示例。这些是使用自定义 HDR 着色器实现的,我想尽可能使用标准 Three.js MeshPhongMaterial 系统和着色器,因为所有其他内置功能,如阴影等。我想使用这些功能并不容易,并且使用一些 HDR 着色器方法?请注意,我不需要高动态范围,只需要可调曝光。
- 通过对场景中的所有灯光应用某种强度倍增器来作弊。这似乎很难实际实现,因为光衰减算法等带来了我不完全理解的额外复杂性,而且我认为创建看起来与提高/降低相机灵敏度相同的结果并不容易。
- 只需在 WebGLRenderer 中调整 gamma(预渲染)。我找不到这样做的方法,而且我不完全确定伽玛是否是模拟曝光的正确方法(也许是?)。
【问题讨论】:
-
我认为除了编写自定义着色器之外别无选择。现有的 three.js 管道在如何将灯光应用于场景方面相当严格,因此调整它们的强度可能永远不会是您想要的结果。还要考虑它正是您希望控制的灯光和阴影的角色。但是,您可以在现有着色器的基础上进行构建——将所有位放在一起并仅更改最终的颜色分配。这可能就足够了。
标签: three.js