В моем шейдере я также получаю логическое значение, которое говорит мне, следует ли мне писать во второй вывод или нет.
Что такое условие?Униформа?Что-то, что вычисляет шейдер?
Он поступает в качестве ввода вершинного шейдера.
Если вы не записываете одну из определяемых пользователем выходных переменных фрагментного шейдера, то этоявляется неопределенным поведением, а результат, который сохраняется в кадровом буфере, не определен.
См. Спецификация профиля ядра 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);