Выборочное рисование некоторых выводов в шейдерах - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть объект framebuffer с 2 выходами:

layout(location = 0) out vec4 color;
layout(location = 1) out uint object_id;

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

color = some_color;
if (condition) {
    object_id = value;
}

Можно ли этого достичь?

Я думал, что смогу сделать это с glBlendEquation (1, GL_MAX) и просто написать 0 в остальной части if, но это не похоже на работу с текстурами r32ui.

1 Ответ

0 голосов
/ 28 сентября 2018

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

Что такое условие?Униформа?Что-то, что вычисляет шейдер?

Он поступает в качестве ввода вершинного шейдера.

Если вы не записываете одну из определяемых пользователем выходных переменных фрагментного шейдера, то этоявляется неопределенным поведением, а результат, который сохраняется в кадровом буфере, не определен.

См. Спецификация профиля ядра API OpenGL 4.6;17,4.ВСЕ РАБОЧИЕ РАМКИ БАРАБАНОВ;стр. 516

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

См. OpenGL 4.6 API CoreСпецификация профиля;15,2.ШЕЙДЕР ИСПОЛНЕНИЕ;стр. 492

Когда завершается фрагментный шейдер, значение каждой активной пользовательской выходной переменной записывается в компоненты цветового вывода фрагмента, с которым он связан.


Я думал, что смогу сделать это с glBlendEquation(1, GL_MAX) и просто написать 0 в остальной части if, но это не похоже на работу с текстурами r32ui.

Это невозможно, поскольку смешивание не применяется к буферам целочисленного формата.

Спецификация профиля ядра API OpenGL 4.6;17.3.6. Смешивание;стр. 502 :

Смешивание применяется только в том случае, если цветовой буфер имеет формат с фиксированной или плавающей точкой.Если буфер цвета имеет целочисленный формат, перейдите к следующей операции.


Что вы можете сделать, это использовать формат с фиксированной запятой для хранилища данных кадрового буфера, например GL_R16.GL_R16 имеет 16 битов для хранения значений от 0,0 до 1,0, и обеспечивается смешивание.Далее GL_R16 предоставляется как для текстур, так и для буферов рендеринга.Соответствующий тип данных: float.
Вы можете сохранить в нем целое число без знака, "нормализуя" значение, разделив его на 2 ^ 16-1:

layout(location = 1) out vec4 object_id;

object_id.r = float(value) / (exp2(16.0)-1.0);
...