OpenGL: glTexEnvi, glBlendFunc и текстовые сообщения на экране - PullRequest
1 голос
/ 25 сентября 2011

Я занимаюсь разработкой видеоплеера и использую OpenGL для рисования рамок и экранных сообщений.

Для рисования рамки я использую:

glBegin(GL_QUADS);
// Draw the quads
glTexCoord2f(0.0f, 0.0f); 
glVertex2f (_movieRect.origin.x,_movieRect.origin.y + _movieRect.size.height); 

glTexCoord2f(0.0f, _imageRect.size.height);
glVertex2f (_movieRect.origin.x, _movieRect.origin.y );

glTexCoord2f(_imageRect.size.width, _imageRect.size.height);
glVertex2f (_movieRect.origin.x + _movieRect.size.width,_movieRect.origin.y); 

glTexCoord2f(_imageRect.size.width, 0.0f);
glVertex2f (_movieRect.origin.x + _movieRect.size.width, _movieRect.origin.y + _movieRect.size.height);

glEnd();

Пока я рисую сообщение на экране, я рисую прямоугольник, который содержит представление текста, который я собираюсь показать. Для управления прозрачностью я делаю это перед тем, как рисовать текстовое сообщение:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

Теперь я хочу дать возможность изменять яркость в режиме реального времени. Для этого я использую:

double t = _brightnessValue;

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
if (t > 1.0f)
{
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,      GL_ADD);
    glColor4f(t-1, t-1, t-1, t-1);
}
else
{
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,      GL_SUBTRACT);
    glColor4f(1-t, 1-t, 1-t, 1-t);
}
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB,         GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB,         GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA,    GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA,       GL_TEXTURE);

Яркость изменена правильно, но теперь текстовые сообщения неверны. Прямоугольник вокруг текста прозрачен, только если яркость имеет значение по умолчанию, и даже на текст влияет коррекция яркости. (то есть текст по умолчанию белый, и он становится все более серым по мере уменьшения яркости).

Изменяет ли регулировка яркости альфа-спектр за пределами 0-1? Как я могу решить эту проблему?

Извините, если это звучит глупо, но я впервые использую OpenGL

1 Ответ

1 голос
/ 08 января 2012

Помните, OpenGL - это конечный автомат.Вы можете установить свое состояние TexEnv, нарисовать рамку, затем вернуть состояние TexEnv в нормальное состояние и нарисовать свое OSD.

...