【问题标题】:Unity Render Shadow Only 1 Main Camera by using OnPreRender(), OnPostRender()Unity 使用 OnPreRender()、OnPostRender() 仅渲染 1 个主摄像机的阴影
【发布时间】:2019-06-05 07:09:04
【问题描述】:

我有 4 个摄像头。 1个主摄像头和3个副摄像头。

我不想在 3 个子摄像头中渲染阴影,所以我将下面的代码附加到 3 个子摄像头。

// https://answers.unity.com/questions/1219726/make-shadows-disappear.html

private void OnPreRender()
{
    shadowDisatance = QualitySettings.shadowDistance;
    QualitySettings.shadowDistance = 0;
}

private void OnPostRender()
{
    QualitySettings.shadowDistance = shadowDisatance;
}

它工作正常,但我只是不想将此脚本附加到 3 个子摄像机。相反,我只想制作一个脚本并将其附加到 1 个主摄像头。

当然,下面这段代码的目的是让主摄像头只渲染阴影。

private void OnPreRender()
{
    QualitySettings.shadowDistance = 40;
}

private void OnPostRender()
{
    QualitySettings.shadowDistance = 0;
}

但它使主相机不渲染阴影。它只是使每个 shadowDistance 为 0。

请帮忙。

【问题讨论】:

  • 只是一个sidenode,您也可以简单地在子摄像机中设置QualitySettings.shadows = ShadowQuality.Disable,而不对主摄像机执行任何操作,而不是处理距离
  • 感谢您的建议。但问题是我只是不想将脚本附加到 3 个子摄像机......
  • 好吧..为什么不呢?
  • 实际上,我还有 10 个副摄像头……我的“老板”建议我,我们只能操纵一个主摄像头。
  • 在你的问题中你谈到了 3 ......也许你的“老板”必须更加灵活;)或者看看我的回答

标签: c# unity3d camera shadow


【解决方案1】:

我真的不明白为什么,但是如果您不想在子摄像机上附加任何东西,您可以改用 Camera.onPreRenderCamera.onPostRender 并让它为除主摄像机之外的每个摄像机做这件事。

如前所述,我宁愿更改 QualitySettings.shadows 而不是 shadowDistance,但这显然取决于您。

类似的东西

[RequireComponent(typeof(Camera))]
public class DisableSubCamShadows : MonoBehaviour
{
    // either drag this in via the inspector
    public Camera mainCamera;

    private ShadowQuality _originalShadowSettings

    // or get it on runtime
    private void Awake()
    {
        // mainCamera will be the one attached to this object
        mainCamera = GetComponent<Camera>();

        // store original shadow settings
        _originalShadowSettings = QualitySettings.shadows;
    }

    private void OnEnable()
    {
        // register the callbacks when enabling object
        Camera.onPreRender += MyPreRender;
        Camera.onPostRender += MyPostRender;
    }

    private void OnDisable()
    {
        // remove the callbacks when disabling object
        Camera.onPreRender -= MyPreRender;
        Camera.onPostRender -= MyPostRender;
    }

    // callback before ANY camera starts rendering
    private void MyPreRender(Camera cam)
    {
        // if mainCamera set to originalShadowSettings 
        // could also simply return but just to be sure
        //
        // for other camera disable shadows
        QualitySettings.shadows = cam == mainCamera ? originalShadowSettings : ShadowQuality.Disable;   
    }

    // callback after ANY camera finishes rendering
    private void MyPostRenderer(Camera cam)
    {
        // restore shadow settings
        QualitySettings.shadows = originalShadowSettings;
    }
}

将此附加到 MainCamera

【讨论】:

  • 哇,这太不可思议了。我真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多