Unity Render Shadow Only 1 Main Camera 通过使用 OnPreRender(), OnPostRender()

Unity Render Shadow Only 1 Main Camera by using OnPreRender(), OnPostRender()

我有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 个主摄像头。

当然,下面这段代码的目的是让Main camera只渲染阴影。

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

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

但它使Main Camera不渲染阴影。它只是使每个 shadowDistance 为 0.

请帮忙。

我真的不明白为什么,但如果你不想在子摄像头上附加任何东西,你可以改为使用 Camera.onPreRender and Camera.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