【问题标题】:Unity 3D: How can I have directional light on for one camera and off for another?Unity 3D:如何让一台摄像机开启定向光而另一台关闭?
【发布时间】:2017-12-26 05:54:17
【问题描述】:

我需要并排显示两个摄像头。一个将打开太阳(定向灯),一个将关闭太阳,同时渲染相同的场景。我尝试在 OnPreRender() 方法中使用 sun.SetActive() ,对于一个相机,我将其设置为 sun.SetActive(false) 和 sun.SetActive(true) 。它不起作用,两个相机都没有太阳。我怎样才能达到预期的输出?

【问题讨论】:

  • 两个对象是否共享相同的脚本组件?好奇它们是否实际上都被设置为相同的值。还是你用标签来分隔它们?
  • 不,我正在使用单独的脚本来控制太阳(定向光)对象。两个相机的两个单独的脚本。我想要实现的是一台相机的阳光显示和另一台相机的无阳光显示。这两个显示器会同时并排渲染,这样我们可以在一个显示器上看到有阳光的效果,在另一个显示器上看到无阳光效果,以进行比较。
  • 嘿,我找到了解决方案。有效。 OnPreRender() 工作正常。感谢您的回复:)
  • 干得好!如果您有可重复的解决方案,请发布您自己问题的答案,以便未来的读者受益。

标签: c# unity3d mono game-engine


【解决方案1】:

对于高于 Unity 4.6 的版本,您还需要在初始尝试中添加 OnPreCull

我为旧版本保留 OnPrerender,您在日志中获得了建议但忽略它。

将此脚本添加到您的相机:

function OnPreCull () {
     if (sun != null)
         sun.enabled = false;
 }

 function OnPreRender() {
     if (sun != null)
         sun.enabled = false;
 }
 function OnPostRender() {
     if (sun != null)
         sun.enabled = true;
 }

【讨论】:

    【解决方案2】:

    另一种方法是复制所有游戏对象并将其设置到不同的层 - 例如:“阳光”和“阴影”。复制的对象需要嵌套在原始对象中,这可能会很混乱,您需要一个脚本来在运行时复制场景的对象。

    层次结构看起来像这样:

    您的定向灯的剔除遮罩(在灯光的检查器上)将设置为除“Shadowed”图层上的对象之外的所有内容。

    然后是 2 个摄像头,剔除除其中一层之外的所有内容:

    我不确定这在性能方面是否比 joreldraw 的解决方案更好或更差。但我猜这将取决于模型的数量和复杂性。在 joreldraw 的解决方案中,我们每帧启用/禁用光源多次。有了这个解决方案,我们就有了两倍的游戏对象。如果您的场景中没有很多对象,那么这个解决方案可能会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 2012-06-03
      相关资源
      最近更新 更多