OpenGL FBO - белые пиксели кажутся прозрачными

Я делаю 2D-игру, используя OpenGL. Недавно я попытался реализовать объекты Framebuffer, и у меня возникли проблемы со смешением.

Я создаю FBO (используя формат GL_RGBA). Когда я выполняю рендеринг в FBO, я сначала очищаю его до полностью прозрачного черного и отключаю GL_BLEND. Затем я рисую текстуры и снова включаю GL_BLEND. Когда я рисую FBO-текстуру, я использую GL_SRC_ALPHA и GL_ONE_MINUS_SRC_ALPHA в качестве исходных и целевых пикселей соответственно в качестве функции смешивания. Я визуализирую его как текстурированный четырехугольник. Это не работает должным образом, так как белые пиксели кажутся прозрачными. Я пробовал экспериментировать с разными значениями функции смешивания, но все, что я пробовал, имело проблемы. Я не совсем понимаю, как работает смешивание, поэтому мне сложно осмыслить это. Может, я упускаю здесь что-то очевидное?

Вот изображение того, как это выглядит прямо сейчас. Когда кнопка выделяется, предполагается, что вокруг нее должно быть свечение, но вместо этого пиксели вокруг нее кажутся прозрачными: http://i.snag.gy/RnV4s.jpg

Вы также можете увидеть два текстовых блока на изображении. Верхний рисуется нормально, без FBO. Текстуры также обычно отображаются без FBO, поэтому я знаю, что проблема где-то в моем коде фреймбуфера.

Я вставил свой класс RenderTarget в pastebin (я привык называть его rendertarget вместо FBO): http://pastebin.com/dBXgjrUX

Вот как я его использую:

RT->Begin();
// draw stuff
RT->End();
RT->Draw();

Кто-нибудь может мне помочь? Сообщите мне, если вам понадобится дополнительная информация о моей проблеме.

Изменить: вот свойства OpenGL, которые я установил при запуске:

// Initialize shaders
shaderManager.InitializeStockShaders();

// Set some OpenGL properties
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel(GL_SMOOTH);
glAlphaFunc(GL_GREATER, 0.0f);

// Enables/disables
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glDisable(GL_DITHER);
glDisable(GL_LIGHTING);

person Mordi    schedule 18.06.2012    source источник
comment
Если вместо этого вы сделаете прозрачный черный цвет, исчезнут ли черные пиксели вместо белых? Мне интересно, оптимизирует ли драйвер при рендеринге в FBO запись в уже белые пиксели.   -  person Nathan Monteleone    schedule 18.06.2012
comment
Ой! На самом деле у меня прозрачный черный цвет (0,0, 0,0, 0,0, 0,0). Извини за это. Я редактировал вопрос. Я попытался установить белый цвет, и это дало те же результаты.   -  person Mordi    schedule 18.06.2012


Ответы (1)


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

Сначала вы сказали, что хотите нарисовать свечение вокруг кнопки. Я предполагаю, что все кнопки отрисовываются в FBO, объединяя их в оверлей пользовательского интерфейса. Свечение для меня звучит, как будто вы хотите что-то смешать, поэтому вы, вероятно, также захотите включить смешивание, рисование в FBO.

Затем помните о проблемах с буфером глубины. Смешивание и буферизация глубины имеют своеобразное взаимодействие. В вашем случае я предлагаю отключить тестирование глубины и запись глубины в FBO (или вообще не использовать прикрепление буфера глубины к FBO). Нарисуйте светящуюся кнопку последней, чтобы она не мешала рисованию других кнопок. Также вы должны убедиться, что ваше свечение выходит с ненулевым значением альфа, иначе оно будет прозрачным. Это то, что вы контролируете в своих шейдерах или в текстурной среде (в зависимости от того, что вы используете).


Обновление 1:

Ваш класс FBO должным образом не гарантирует, что текстуры, прикрепленные к связанному фреймбуферу, не должны быть связаны сами. Однако это легко исправить, переместив код вложения в привязку, где текстуры также не привязаны должным образом. См. Мой отредактированный pastebin http://pastebin.com/1uVT7VkR (я, вероятно, пропустил несколько вещей).

person datenwolf    schedule 18.06.2012
comment
Проверка глубины отключена (GL_DEPTH_TEST) при запуске приложения. Свечение на самом деле отрисовывается последним, хотя оно все еще является частью фреймбуфера. У меня действительно есть проект на github, но я не хочу публиковать ссылку публично. Однако проверьте ссылку pastebin в вопросе, если вы хотите увидеть мой класс RenderTarget.cpp. Вот где я занимаюсь всем, что касается FBO. - person Mordi; 18.06.2012
comment
Это очень мило, волк-свидание. Я этого не осознавал. Я внес ваши изменения, и все работает нормально. Однако, к сожалению, это не решило мою проблему с альфа-прозрачностью. - person Mordi; 19.06.2012
comment
Я обновил его, чтобы можно было просмотреть все возможные комбинации смешивания. Никакая комбинация не дает удовлетворительных результатов. У меня есть исходный код на github, если кто-то хочет помочь: github.com/Landeplage/Amigo - person Mordi; 23.06.2012