#opengl #glsl #shader
#opengl #glsl #шейдер
Вопрос:
я выполняю некоторую постобработку.
когда я попытался выполнить рендеринг в фреймбуфер с двухцветной текстурой, я не хотел устанавливать выходной цвет на вторую выходную цветовую переменную, просто хотел установить первую переменную, но шейдер все равно установил внутреннюю первую выходную цветовую переменную на вторую выходную цветовую переменную
Render Loop
BindFrameBuffer();
unsigned int a[2] = { GL_COLOR_ATTACHMENT0 , GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, a);
RenderSomthing();!!!
Fragment shader
#version 330 core
layout (location = 0) out vec4 FragColor;
//layout (location = 1) out vec4 BloomColor;
void main()
{
FragColor = vec4(1.0);
//BloomColor= vec4(1.0); // i dont wanna draw on second color output variable
}
я не хочу трогать вторую выходную цветовую переменную, я хочу просто позволить ей очистить цвет
шейдер по-прежнему внутренне устанавливает первую выходную цветовую переменную во вторую выходную цветовую переменную
Ответ №1:
Если вы хотите записать только одно цветное вложение фреймбуфера, вам нужно указать только один буфер рисования перед рисованием геометрии:
unsigned int a[1] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, a);
RenderSomthing();
См. Спецификацию основного профиля API OpenGL 4.6 — 17.4.1 Выбор буферов для записи:
Если фрагментный шейдер выполняет запись в пользовательскую выходную переменную, DrawBuffers определяет набор буферов рисования, в которые каждый из нескольких выходных цветов, определенных этими переменными, записывается отдельно. Если фрагментный шейдер не выполняет запись в пользовательские выходные переменные, значения цветов фрагмента после выполнения шейдера не определены и могут отличаться для каждого цвета фрагмента. Если записаны некоторые, но не все определяемые пользователем выходные переменные, значения цветов фрагмента, соответствующие неписаным переменным, аналогично не определены.
Одним из вариантов записи в отдельные буферы является использование смешивания. Используйте glBlendFunci
или glBlendFuncSeparate
для индивидуального задания функции наложения для буфера рисования.
например, отключить запись в буфер рисования с индексом 1:
glBlendFunci(1, GL_ZERO, GL_ONE);
Комментарии:
1. нет. я хочу записать в 2-цветное вложение фреймбуфера, но в конкретном фрагментном шейдере я хочу записать только в первое цветовое вложение, поэтому я закодировал настройку только для первой выходной цветовой переменной, но во внутреннем opengl (?? возможно) установите первую выходную переменную во вторую переменную
2. @hour30000 «но для конкретного фрагментного шейдера я хочу записать только первое цветное вложение», — Поэтому вам нужно переключить буфер рисования, прежде чем рисовать что-либо с помощью этого конкретного шейдера. Или используйте смешивание. Смотрите ответ.
3. @Rabbid76 Разве нет способа рисовать только для первого цветового вложения в состоянии, которое glDrawBuffers(2, { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 } … я подумал, что если я установлю цвет только для layout (location = 0) из vec4 FragColor, а не layout (location = 1) из vec4 BloomColor, шейдер будет рисовать только для первого цветабуфер. потому что это означает, что шейдер устанавливает цвет для первого цветного вложения и ничего не рисует для второго цветного вложения
4. @hour30000 Нет. Прочитайте ответ. Что плохого в переключении буферов отрисовки? Вы также переключаете шейдер.
5. я знаю, что переключение буфера рисования работает.. но в моем движке рендеринга немного сложно менять шейдер, рисовать буферы каждый раз, когда рисуется так много объектов. поэтому мне интересно, возможно ли нарисовать только один буфер из двух без изменения состояния drarwbuffer, shader