tgoop.com/unity_cg/62577
Last Update:
Поговорим про RenderBufferLoadAction и RenderBufferStoreAction
В обычном растер пайплайне на гпу, пожалуй самым важным и обязательным условием является установка рендертагрета.
Это так называемый бэкбуфер, куда будет записан (или не записан) результат работы всех этих вертекс-фрагмент (и прочих) операций.
Есть условная команда "установить рендертаргет".
При установке, тебе нужно задать несколько параметров:
- Color буфер (их может быть и несколько)
- Depth/stencil буфер (это один буфер, глубина и стенсиль просто лежат в разных битах)
- Нужно ли чистить буферы и если да - то каким значением (типа цвет - черный, белый, итд, глубина - 0, 1, или иное, аналогично для стенсиля).
- Вьюпорт
- Scissor rect (обычно никто его не трогает, ограниченно полезный лишь на пк)
- Load/Store действия.
Вот про них мы и поговорим.
Каковы последствия, если неправильно проставил?
Либо получишь некорректный результат на экране (с артефактами, например), либо удвоишь нагрузку на шину и получишь просадку производительности на ровном месте.
Load:
Отрендерил ты кубик в экран, но этот кубик рисуется же не на пустом месте - он рисуется на участке текстуры. А что делать с теми пикселями, которые были до кубика в этой текстуре?
Допустим, у тебя кубик полупрозрачный, а текстура не пустая - там картинка какая-то.
Чтобы альфабленд сработал - тебе нужны данные пикселей этой текстуры, где у тебя пиксели кубика нарисуются, чтобы их сблендить и результат получить. Для этого и нужен LoadAction.Load
Поэтому ЕСЛИ текстура не пустая И либо у тебя альфабленд, либо ты не все пиксели перерисуешь (типа будут участки не затронутые ни одним мешем - такого не бывает при блите, конечно, но вдруг у тебя не фуллскрин блит) - то тебе нужен
LoadAction.Load.
Иначе - DontCare + обязательно после установки таргета сделать cmd.ClearRenderTarget. Иначе магия может не сработать.
Store:
Обычно тебе нужно сохранять результат рендера в текстуру, иначе как бы, нафига рендер нужен, правда?
Но не всегда.
Скажем, тебе обычно не нужна глубина и стенсиль. Т.е. они тебе нужны на то время, пока ты рендеришь всякие кубики, партиклы. Но в это время глубина-и-стенсиль лежат в тайловой памяти на гпу и прекрасно выполняют свою функцию сравнения. А вот после окончания рендера тебе, допустим, только цвет и нужен. Значит для глубины можно поставить StoreAction.DontCare.
Для шедоумапы, к примеру, тебе цвет не нужен. Значит там - StoreAction.DontCare, а глубина - нужна. Там - Store.
Отдельный геморрой это MSAA. И если он включен, то с ним StoreAction'ы работают чуть иначе и менее очевидно. Но это уже другая история.
Вот так это чудо можно дебажить:
https://docs.unity3d.com/ScriptReference/Rendering.LoadStoreActionDebugModeSettings.html
Либо через рендердок
BY WellMOR in Unity CG Tech
Share with your friend now:
tgoop.com/unity_cg/62577