我正在开发一个电影播放器,我正在使用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
答案 0 :(得分:1)
请记住,OpenGL是一个状态机。您可以设置TexEnv状态,绘制帧,然后将TexEnv状态恢复为正常状态,并绘制OSD。