Unity Render Shadow Only 1 Main Camera с помощью OnPreRender (), OnPostRender () - PullRequest
0 голосов
/ 05 июня 2019

У меня есть 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.

Пожалуйста, помогите.

1 Ответ

1 голос
/ 05 июня 2019

Я не совсем понимаю, почему, но если вы не хотите прикреплять что-либо к подкамерам, вы можете вместо этого использовать Camera.onPreRender и 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;
    }
}

прикрепите это к основной камере

...