UNSAFECSHARP Telegram 212
Поговорим про 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

Либо через рендердок

Автор: @shiko_q
Источник: https://www.tgoop.com/unity_cg/62577

#rendering #graphics
🔥19👍5



tgoop.com/unsafecsharp/212
Create:
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

Либо через рендердок

Автор: @shiko_q
Источник: https://www.tgoop.com/unity_cg/62577

#rendering #graphics

BY Unity: Всё, что вы не знали о разработке


Share with your friend now:
tgoop.com/unsafecsharp/212

View MORE
Open in Telegram


Telegram News

Date: |

The Channel name and bio must be no more than 255 characters long Each account can create up to 10 public channels ZDNET RECOMMENDS How to Create a Private or Public Channel on Telegram? Telegram users themselves will be able to flag and report potentially false content.
from us


Telegram Unity: Всё, что вы не знали о разработке
FROM American