Обрезка альфа-значений с низким OpenGL

Я ввел DLL в игровой процесс, чтобы создать оверлейный интерфейс, но проблема в том, что альфа-значения "обрезаются" (не отображаются вообще)

Я проверил несколько значений альфа-канала, и, похоже, он не работает, если альфа ниже 0,3.

Чтобы проиллюстрировать, что происходит, изображение, которое я пытаюсь визуализировать:

Тест прозрачности

и игра рендеринга изображения:

Рендер игры

Что именно здесь происходит? Это текущее состояние OpenGL? Я новичок в API, и я понятия не имею, почему это происходит.

Дополнительная информация:

Текстура создается из буфера с:

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, this->width, this->height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, this->buffer);

Я получаю этот буфер от Awesomium, и значения верны... Я проверил альфа-значения.

Рендеринг выполняется с помощью этой функции (я тоже пытался вызвать функцию рендеринга текстур в игре, но возникает та же проблема):

void DrawTextureExt(int texture, float x, float y, float width, float height)
{
    glPushAttrib(GL_ALL_ATTRIB_BITS);
    {
        glPushMatrix();
        {
            glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

            glEnable(GL_BLEND);
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            // glBlendFunc(GL_ONE, GL_ONE); << tried this too.. ugly results

            glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, texture);

            glTranslatef(x, y, 0.0);

            glRotatef(0, 0.0, 0.0, 1.0);
            glTranslatef(-x, -y, 0.0);

            glBegin(GL_QUADS);
            {
                glTexCoord2f(0, 0); glVertex2f(x, y);
                glTexCoord2f(0, 1); glVertex2f(x, y + height);
                glTexCoord2f(1, 1); glVertex2f(x + width, y + height);
                glTexCoord2f(1, 0); glVertex2f(x + width, y);
            }
            glEnd();

            glBindTexture(GL_TEXTURE_2D, 0);
        }
        glPopMatrix();
    }
    glPopAttrib();
}

1 ответ

Решение

Похоже на то, что программа, в которую вы зацепились, использует альфа-тесты в конце своей функции рендеринга (что имело бы смысл) и оставила альфа-тестирование включенным в конце, с которым вы затем работаете. Попробуйте, что произойдет, если вы сначала отключите альфа-тест в своем хуке. (glDiable(GL_ALPHA_TEST)).

Другие вопросы по тегам