我正在尝试使用 SDL_ttf 和 openGL 呈现文本。
我打开字体并将文本渲染到 SDL_Surface,然后将该表面附加到纹理并将其绑定以供 openGL 渲染。
我已经用谷歌搜索了这个问题,但没有得到很多点击,这会让我相信我理解了一些东西。
唯一重要的两个函数,因为我几乎制作了一个临时变量来解决这个问题。他们是:
SDL_Surface* CFont::BlendedUTF8Surface() {
SDL_Surface* Surf_Text;
SDL_Color Blah;
Blah.r = 0;
Blah.b = 255;
Blah.g = 0;
if(!(Surf_Text = TTF_RenderUTF8_Blended(pFont,TxtMsg,Blah))) {
char str[256];
sprintf_s(str, "? %s \n", TTF_GetError());
OutputDebugString(str);
}
return Surf_Text;
}
这使用 SDL_ttf 将文本呈现到 Surf_Text 表面。你可以看到我已经最大化了蓝色通道。我一会儿再谈这个。这里是渲染
void CLabel::OnRender(int xOff,int yOff) {
if(Visible) {
glColor4f(1.0,1.0,1.0,1.0);
Font.Color(FontColors.r, FontColors.g, FontColors.b); //useless I overwrote the variable with Blah to test this
SDL_Surface* Surf_Text;
Surf_Text = Font.BlendedUTF8Surface();
Text_Font.OnLoad(Surf_Text);
Text_Font.RenderQuad(_X+xOff,_Y+yOff);
SDL_FreeSurface(Surf_Text);
glColor4f(0.0,0.0,0.0,1.0);
}
}
好吧,据我所知,问题可能来自当前的颜色状态和纹理环境模式。
当我以这种方式渲染文本时,文本会改变颜色,但就像 R 和 B 通道已经切换一样。如果我制作红色 255,则文本为蓝色,如果我制作蓝色 255,则文本为红色。绿色保持绿色(RGB vs BGR?)。
如果我删除glColor4f
渲染函数中的调用,则文本根本拒绝渲染彩色。总是黑色(我习惯性地将颜色设置回(0,0,0),每次我渲染一些东西,所以可能因为模式是调制(R = 0 * Texture(Font)R等)所以它会是黑色的。有道理.
如果我将 Texture 环境设置为 DECAL,则文本呈现黑色,文本后面的框呈现我试图呈现文本的颜色。
我想我只是不知道这样做的正确方法。有人对 SDL_ttf 和 openGL 纹理环境有任何经验,可以提供一些想法吗?
编辑:
我已经对函数进行了一些重写并测试了表面,并最终弄清楚了一些事情。如果我使用 GL_DECAL 文本呈现正确的颜色,并且像素值在表面上的任何地方都为 0 我尝试渲染的不是红色(渲染值为 255,这很奇怪,因为红色是它应该的第一个通道至少我期望的是 255^3(或以十六进制 FF0000 表示)。使用 DECAL,alpha 空间(文本周围的空白区域,像素值为 0)显示当前 glColor() 调用的颜色。如果我使用混合,则 alpha 区域会消失,但我的文本也会呈现为混合(当然),因此它与底层背景纹理混合。
我想更合适的问题是如何只混合空白而不是文本?我的猜测是我可以调用一个新的 glBlendFunc(); 但我已经测试过参数,我就像树林里的孩子。不知道如何获得所需的结果。
解决方案尚未完全验证,但表面的格式确实是 BGRA 但我无法实现此更正。我将尝试为此创建一个颜色交换功能。
此修复无效。我没有设置 BGR,而是想创建一个新的 RGB 表面:
if (Surface->format->Rmask == 0x00ff0000) {
Surface = SDL_CreateRGBSurfaceFrom(Surface->pixels, Surface->w, Surface->h, 32, Surface->pitch, Surface->format->Rmask, Surface->format->Gmask, Surface->format->Bmask, Surface->format->Amask);
}
在那之后失败了,我尝试交换Surface->format->Bmask
,Surface->format->Rmask
但这也没有效果。