Используйте RenderTexture.DiscardContent с эффектами изображения - PullRequest
0 голосов
/ 12 апреля 2020

Я использую эффект изображения для преобразования карты глубины ортогональной камеры c в пользовательскую карту теней.

Эта текстура затем передается на основную камеру для рендеринга.

Код для пользовательской камеры довольно прост:

[ExecuteInEditMode, ImageEffectAllowedInSceneView]
[RequireComponent(typeof(Camera))]
public class ShadowMaster : MonoBehaviour
{
    public Material material;
    public Camera shadowCamera;
    public bool updateInEditor = true;
    public bool updateInGame = true;

    void Start() {
        shadowCamera = GetComponent<Camera>();
        shadowCamera.enabled = false;

        EditorApplication.playModeStateChanged += HandleOnPlayModeChanged;
    }

    [ImageEffectOpaque]
    void OnRenderImage (RenderTexture src, RenderTexture dest) {
        src.DiscardContents(true, false);
        if (material)
            Graphics.Blit (src, dest, material);
        else
            Graphics.Blit (src, dest);
    }

    void LateUpdate() {
        if ((Application.isPlaying == true && updateInGame)
        || (Application.isPlaying == false && updateInEditor))
        {
            shadowCamera.Render();
        }
    }

    public void SetMaterial(Material src)
    {
        material = src;
    }

    void HandleOnPlayModeChanged(PlayModeStateChange mode)
    {
        if (mode == PlayModeStateChange.EnteredEditMode || mode == PlayModeStateChange.EnteredPlayMode)
        {
            shadowCamera.Render();
        }
    }
}

Моя проблема в том, что теневая камера по-прежнему отображает всю непрозрачную геометрию после прохождения карты глубины и до эффекта изображения, что совершенно бесполезно, так как только глубина используется.

Я пытался использовать RenderTexture.DiscardContent, но если он что-то делает, он не отображается в отладчике кадров. Моя проблема в том, что кроме вызова этого аргумента src в OnRenderImage, я не знаю, как получить доступ к фактическому RenderTexture, используемому до эффекта, а не к цели RenderTexture, в которой хранится карта теней.

Точно так же, если я удаляю буфер глубины окончательной текстуры рендеринга, первая текстура рендеринга также не имеет никакой информации о глубине, отрисовывает объекты не по порядку и не сохраняет никакой информации о глубине, даже если для depthTextureMode установлено значение глубина.

...