Войти
ПрограммированиеФорумГрафика

[Unity] Command Buffer issue

#0
14:05, 18 окт. 2019

У меня есть задача сделать fft с поддержкой shader model 3 на Unity, по этой причине я не использую compute shaders, делаю рендер последовательный из Render Target в Render Target.

Я создаю Command Buffer на старте, потом на Update я каждый раз его заполняю, в том числе отпляю новые данные в шейдер (хотя это всего лишь время - я думал время от Unity не работает)

Суть проблемы такова - что я вижу только лишь один какой-то обработанный frame - картинка не обновляется как в UI так и на плоскости, хотя в шейдере с помощью Render Doc я вижу что идет обновление.

Идеи?


#1
15:00, 18 окт. 2019

Блит не туда
2019
ужасы, триллер

#2
16:28, 18 окт. 2019
    // create render pipeline
    bool CreateCommandBuffer()
    {
        if(PingPongCommands == null)
            PingPongCommands = new CommandBuffer();
        PingPongCommands.Clear();

        // new material for each pass to set
        //var newBeginMaterial = Instantiate(MatFFTHeightBegin);
        var time = Time.timeSinceLevelLoad;
        MatFFTHeightBegin.SetFloat("_Phase", time);

        // prepare height map fft
        PingPongCommands.SetRenderTarget(rtiPingRG);
        //PingPongCommands.ClearRenderTarget(true, true, new Color(0, 0, 0, 0));
        PingPongCommands.DrawMesh(QuadMesh, QuadMatrix, MatFFTHeightBegin, 0, 0);

        var curRT = rtiPongRG;
        var prevRT = rtiPingRG;

        var curTexture = rtPingRG;
        var prevTexture = rtPongRG;

        // render ping pong
        // shader Y pass
        for (int fft = 0; fft < FFTPassesNum; ++fft)
        {
            // new material for each pass to set
            var material = MatsFFT[fft];
            // to material
            material.SetTexture("_InputFFT", curTexture);

            PingPongCommands.SetRenderTarget(curRT);
            PingPongCommands.DrawMesh(QuadMesh, QuadMatrix, material, 0, 0);

            // swap
            var temp = curRT;
            curRT = prevRT;
            prevRT = temp;

            var tempT = curTexture;
            curTexture = prevTexture;
            prevTexture = tempT;
        }

        //return true;
   
        // shader X pass
        for (int fft = 0; fft < FFTPassesNum; ++fft)
        {
            // new material for each pass to set
            var material = MatsFFT[fft + FFTPassesNum];

            // to material
            material.SetTexture("_InputFFT", curTexture);

            PingPongCommands.SetRenderTarget(curRT);
            PingPongCommands.DrawMesh(QuadMesh, QuadMatrix, material, 0, 0);

            // swap
            var temp = curRT;
            curRT = prevRT;
            prevRT = temp;

            var tempT = curTexture;
            curTexture = prevTexture;
            prevTexture = tempT;
        }

        // final fft
        // it's always on output in first texture
        MatFFTHeightEnd.SetTexture("_InputFFT", rtPingRG);

        PingPongCommands.SetRenderTarget(rtiHeightMap);
        PingPongCommands.DrawMesh(QuadMesh, QuadMatrix, MatFFTHeightEnd, 0, 0);

        //FFTCamera.AddCommandBuffer(CameraEvent.AfterEverything, PingPongCommands);

        MatFFTNormalMap.SetTexture("_HeightMap", rtHeightMap);

        PingPongCommands.SetRenderTarget(rtiNormalMap);
        PingPongCommands.DrawMesh(QuadMesh, QuadMatrix, MatFFTNormalMap, 0, 0);

        return true;
    }

Blit не используется

ПрограммированиеФорумГрафика