2016-07-21 13 views
0

Я смотрю, как я собираюсь реализовать сглаживание в отложенном рендерере освещения. Таким образом, три прохода, проход геометрии, пропуск накопления освещения, а затем второй проход геометрии для затенения.Multisampling, как читать «уникальные» тексели

С обычной мультисэмплингом, MSAA, целью является только мультисэмпл пикселей на краях многоугольника. И для каждого треугольника записывайте результат шейдера фрагмента в подпикселы, которые он покрывает. Но, конечно, это известная проблема, что это немного проблематично с отложенным освещением.

Цель состоит в том, чтобы избежать оценки всех подпикселей во 2-м и 3-м проходах, поскольку в основном это будет суперсэмплинг. Если кто-то знает другой (лучший/возможный) способ достижения этого, я бы очень хотел его услышать. Но вот моя идея:

Если вы можете сделать фрагментарный шейдер в первом проходе, напишите только первый подпиксель, который покрывает треугольник. Это позволяет вам игнорировать неписаные тексели в проходе освещения. И затем, наконец, во втором прохождении геометрии, как-то читайте назад только первый подпиксель, который соответствует треугольник, который мы написали первоначально, а затем запустили освещение (и теперь записываем все покрытые тексели как обычно, так что результат может быть разрешено). Таким образом, только «уникальные» тексели будут оцениваться на 2-м и 3-м проходах.

Может ли кто-нибудь сказать, как это можно сделать в glsl (или подтвердить, что это невозможно)? Я действительно не вижу причин, по которым это теоретически не было бы возможно, но также не вижу никакого способа сделать это в glsl.

ответ

1

На данный момент я собираюсь игнорировать цели вашего вопроса и вместо этого сосредоточиться на конкретной просьбе:

  1. Вы можете написать в «первой» пробы только из фрагмента шейдер?

Да. Что вам нужно сделать, так это то, что ваш шейдер фрагмента объявляет массив целых чисел, используя украшение SampleMask (или, на языке GLSL, используйте gl_SampleMaskIn, an array of signed integers). Затем вы будете проходить через этот массив по-бит, чтобы найти первый бит, который установлен.

Этот бит является «первым образцом». Таким образом, вы затем объявляете массив целых чисел вывода, используя украшение SampleMask (в языке GLSL, gl_SampleMask, an array of signed integers). Вы устанавливаете бит «first sample» равным 1, а все остальные равны нулю.

  1. Вы знаете, что было написано «первым образцом», для определенного пикселя в мультисэмпльном изображении?

Если вы не пишете эти данные в какую-либо другую часть памяти, например, SSBO или что-то еще. В мультисэмпльном изображении не известно, к какому образцу были записаны, поэтому он не знает, что является первым.

И даже если вы можете:


Вся ваша идея не будет работать.

Мультисэмплинг - это просто суперсэмплинг, основанный на одном упрощающем предположении. А именно, что это нормально, чтобы все образцы, сгенерированные треугольником, имели одинаковые значения для каждого фрагмента (за исключением глубины). В все остальные, это просто суперсэмплинга: добавление большего количества выборок на пиксель.

Если два треугольника перекрываются, то ваш подход «первого образца» не имеет смысла. Зачем? Поскольку есть два «первые образцы»: первый образец из треугольника 1, и первый образец из треугольника 2. И треугольник 2 может быть перезаписан «первый образец» из треугольника 1.

Даже если не было перезаписи из первого образца, вы все еще не знаете, сколько образцов каждый треугольник внес вклад. Если один треугольник внес правильные 50% выборок пикселя, а перекрывающийся треугольник предоставил нижние 50% выборок пикселя, тогда вы должны получить только 25% от вклада первого треугольника. Как вы знаете, как это сделать с помощью вашего метода?

+0

Хорошо, я вижу проблему с перекрытием. Но если вы пишете все покрытые образцы в первый проход, то в проходе освещения обнаружите повторяющиеся значения и только напишите в первую из каждой группы. Затем во втором примере прохождения геометрии первый охватываемый субпиксель (работает, потому что мы повторно используем буфер глубины). Где только накладные расходы - обнаружение дубликатов в шейдере освещения. Единственная проблема заключается в том, что дубликаты могут быть похожими на совпадения. Но даже если вы делаете суперсэмплинг в проходе освещения, все еще будет время, полученное в проходах геометрии по сравнению с суперсэмплингом? – Aedoro

 Смежные вопросы

  • Нет связанных вопросов^_^