Смешивание с двумя источниками с ошибкой целевой ссылки с множественным отображением

#opengl #glsl

#opengl #glsl

Вопрос:

Я пытаюсь реализовать текстовый субпиксель, используя смешивание с двумя источниками.

https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_blend_func_extended.txt

 layout(location = 0, index = 0) out vec4 fragColor;
layout(location = 0, index = 1) out vec4 srcColor1;

void main()
{
  vec4 scolor0;
  vec4 scolor1;

  // some calulcations

  fragColor = scolor0;
  srcColor1 = scolor1;
}
 

Это работает нормально.
Но теперь я хочу записать в другую цель рендеринга
, например

 layout(location = 0, index = 0) out vec4 fragColor;
layout(location = 0, index = 1) out vec4 srcColor1;
layout(location = 1) out uvec4 myMRT;
 

и я попытался изменить location = 1 или location = 2, но в любом случае я получаю эту ошибку привязки

ошибка: ошибка компиляции сборки для фрагментного шейдера со смещением

ошибка: слишком много цветовых выходов при использовании вывода с двумя исходными кодами

Каков наилучший способ использования MRT в случае смешивания двух источников?

Ответ №1:

Спецификация профиля ядра OpenGL 4.6 указана в разделе 17.3.6.3 «Смешивание с двумя исходными кодами и несколькими буферами отрисовки» (выделение мое):

Функции смешивания, для которых требуется второй ввод цвета (Rs1; Gs1; Bs1; As1) ( SRC1_- COLOR , SRC1_ALPHA , ONE_MINUS_SRC1_COLOR , или ONE_MINUS_SRC1_ALPHA ), могут потреблять аппаратные ресурсы, которые в противном случае могли бы использоваться для рендеринга в нескольких буферах рисования. Следовательно, количество буферов отрисовки, которые могут быть присоединены к фреймбуферу, может быть меньше при использовании смешивания с двумя исходными кодами.

Максимальное количество буферов отрисовки, которые могут быть присоединены к одному фреймбуферу при использовании функций смешивания с двумя исходными кодами, зависит от реализации и может запрашиваться путем вызова GetIntegerv с помощью pname MAX_DUAL_SOURCE_DRAW_BUFFERS . При использовании смешивания с двумя исходными MAX_DUAL_SOURCE_DRAW_BUFFERS кодами вместо следует использовать MAX_DRAW_BUFFERS для определения максимального количества буферов отрисовки, которые могут быть присоединены кодин фреймбуфер. Значение MAX_DUAL_SOURCE_DRAW_BUFFERS должно быть не менее 1.

(Более старое ARB_blend_func_exteded расширение, на которое вы ссылались, использует другую формулировку, но также гарантирует минимальное значение 1 для MAX_DUAL_SOURCE_DRAW_BUFFERS )

Таким образом, даже с самой последней спецификацией GL, реализации GL вообще не требуются для поддержки смешивания с двумя исходными кодами с несколькими целями рендеринга. И просмотр текущего отчета для этой возможности на gpuinfo.org показывает, что не существует реальных реализаций word, поддерживающих значение больше 1. Так что нет, вы не можете этого сделать. По крайней мере, таково положение дел в декабре 2020 года.

Комментарии:

1. В моем uber shader я хочу подключить MRT к опции shader, что является очень распространенным рабочим процессом, но при смешивании с двумя исходными кодами это кажется невозможным, и на самом деле это проблема блокировки.