Я делаю 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);