gpt4 book ai didi

c++ - 将 SDL_TTF 文本渲染到 openGL 红色方 block 上而不是文本

转载 作者:太空宇宙 更新时间:2023-11-03 10:20:20 30 4
gpt4 key购买 nike

我一直在尝试在 Windows XP、VS2010 上使用 SDL 和 SDL_TTF 库将文本渲染到 openGL 窗口上。
版本:
SDL 版本 1.2.14
SDL TTF 开发版 1.2.10
openGL(版本至少有 2-3 年历史)。

我已经使用 SDL/SDL_image 成功创建了一个 openGL 窗口,并且可以毫无问题地将线/多边形渲染到它上面。

然而,转到文本,我当前的程序似乎存在一些缺陷,我在尝试 this code here 时得到以下结果

enter image description here

对于那些不愿意粘贴的人来说,这里只有关键的代码段:

void drawText(char * text) {
glLoadIdentity();
SDL_Color clrFg = {0,0,255,0}; // set colour to blue (or 'red' for BGRA)
SDL_Surface *sText = TTF_RenderUTF8_Blended( fntCourier, text, clrFg );
GLuint * texture = create_texture(sText);
glBindTexture(GL_TEXTURE_2D, *texture);
// draw a polygon and map the texture to it, may be the source of error
glBegin(GL_QUADS); {
glTexCoord2i(0, 0); glVertex3f(0, 0, 0);
glTexCoord2i(1, 0); glVertex3f(0 + sText->w, 0, 0);
glTexCoord2i(1, 1); glVertex3f(0 + sText->w, 0 + sText->h, 0);
glTexCoord2i(0, 1); glVertex3f(0, 0 + sText->h, 0);
} glEnd();
// free the surface and texture, removing this code has no effect
SDL_FreeSurface( sText );
glDeleteTextures( 1, texture );
}

第 2 部分:

// create GLTexture out of SDL_Surface
GLuint * create_texture(SDL_Surface *surface) {
GLuint texture = 0;

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// The SDL_Surface appears to have BGR_A formatting, however this ends up with a
// white rectangle no matter which colour i set in the previous code.
int Mode = GL_RGB;

if(surface->format->BytesPerPixel == 4) {
Mode = GL_RGBA;
}

glTexImage2D(GL_TEXTURE_2D, 0, Mode, surface->w, surface->h, 0, Mode,
GL_UNSIGNED_BYTE, surface->pixels);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

return &texture;
}

我是否遗漏了一些明显的代码?
感谢您对此主题的任何帮助。
我已经尝试学习 openGL 和 SDL 3 天了,所以请原谅我的任何错误信息。


编辑:

我注意到使用
TTF_RenderUTF8_Shaded
TTF_RenderUTF8_Solid

抛出一个空指针异常,意味着在实际的文本渲染函数中有一个错误(我怀疑),我不知道这意味着 TTF_RenderUTF8_Blended 返回一个红色方 block 但我怀疑所有的麻烦取决于此。

最佳答案

我认为问题出在 glEnable(GL_TEXTURE_2D)glDisable(GL_TEXTURE_2D) 函数中,每次在屏幕上绘制文本时都必须调用它们。也许SDL 和 GL 表面之间的颜色转换也不正确。我已将 create_texturedrawText 合并为一个函数,可以正确显示文本。那是代码:

void drawText(char * text, TTF_Font* tmpfont) {
SDL_Rect area;
SDL_Color clrFg = {0,0,255,0};
SDL_Surface *sText = SDL_DisplayFormatAlpha(TTF_RenderUTF8_Blended( tmpfont, text, clrFg ));
area.x = 0;area.y = 0;area.w = sText->w;area.h = sText->h;
SDL_Surface* temp = SDL_CreateRGBSurface(SDL_HWSURFACE|SDL_SRCALPHA,sText->w,sText->h,32,0x000000ff,0x0000ff00,0x00ff0000,0x000000ff);
SDL_BlitSurface(sText, &area, temp, NULL);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sText->w, sText->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp->pixels);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS); {
glTexCoord2d(0, 0); glVertex3f(0, 0, 0);
glTexCoord2d(1, 0); glVertex3f(0 + sText->w, 0, 0);
glTexCoord2d(1, 1); glVertex3f(0 + sText->w, 0 + sText->h, 0);
glTexCoord2d(0, 1); glVertex3f(0, 0 + sText->h, 0);
} glEnd();
glDisable(GL_TEXTURE_2D);
SDL_FreeSurface( sText );
SDL_FreeSurface( temp );
}

screenshot

我正在按如下方式初始化 OpenGL:

int Init(){
glClearColor( 0.1, 0.2, 0.2, 1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho( 0, 600, 300, 0, -1, 1 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if( glGetError() != GL_NO_ERROR ){
return false;
}
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA);
}

关于c++ - 将 SDL_TTF 文本渲染到 openGL 红色方 block 上而不是文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7831568/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com