C++ 使用SDL\U TTF在OpenGL中显示文本

C++ 使用SDL\U TTF在OpenGL中显示文本,c++,c,opengl,sdl,sdl-ttf,C++,C,Opengl,Sdl,Sdl Ttf,我是OpenGL的初学者,我创建了一个使用SDL_TTF在OpenGL中编写文本的函数。以下是我的函数代码: #define WINDOW_WIDTH 832 #define WINDOW_HEIGHT 487 #define glVertex2px(x,y) glVertex2d((double)(x) * 2.0 / (double)WINDOW_WIDTH - 1.0, 1.0 - (double)(y) * 2.0 / (double)WINDOW_HEIGHT); void glWri

我是OpenGL的初学者,我创建了一个使用SDL_TTF在OpenGL中编写文本的函数。以下是我的函数代码:

#define WINDOW_WIDTH 832
#define WINDOW_HEIGHT 487
#define glVertex2px(x,y) glVertex2d((double)(x) * 2.0 / (double)WINDOW_WIDTH - 1.0, 1.0 - (double)(y) * 2.0 / (double)WINDOW_HEIGHT);
void glWriteText2d(TTF_Font *font,const char *text,SDL_Color color,const int x,const int y){
    GLuint texture;
    SDL_Surface *surface;
    surface = TTF_RenderText_Blended(font,text,color);
    glGenTextures(1,&texture);
    glBindTexture(GL_TEXTURE_2D,texture);
    gluBuild2DMipmaps(GL_TEXTURE_2D,4,surface->w,surface->h,GL_RGBA,GL_UNSIGNED_BYTE,surface->pixels);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
    GLboolean textureIsEnabled = glIsEnabled(GL_TEXTURE_2D);
    glEnable(GL_TEXTURE_2D);
    glColor3ub(255,255,255);
    glBegin(GL_QUADS);
        glTexCoord2f(0,0);
        glVertex2px(x,y);
        glTexCoord2f(0,1);
        glVertex2px(x,y + surface->h);
        glTexCoord2f(1,1);
        glVertex2px(x + surface->w,y + surface->h);
        glTexCoord2f(1,0);
        glVertex2px(x + surface->w,y);
    glEnd();
    if(!textureIsEnabled){
        glDisable(GL_TEXTURE_2D);
    }
}

这个函数不起作用,因为当我使用它时,它会在文本应该出现的位置绘制一个矩形,它是
color
的颜色。我应该在代码中更改什么才能使其正常工作?

生成的纹理充满纯色。使其形成文本形状的是alpha通道,但您没有启用alpha混合,因此无法看到它。加

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
或者至少alpha测试(由于缺少混合,将产生更锐利的边缘-对于某些字体,这样看起来更好)


还要注意,您既没有释放生成的
SDL_曲面
也没有释放GL纹理;那样你的内存就会很快用完。纹理可以重复使用,SDL_曲面可以在将数据复制到GL纹理后立即释放。

生成的纹理将填充纯色。使其形成文本形状的是alpha通道,但您没有启用alpha混合,因此无法看到它。加

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
或者至少alpha测试(由于缺少混合,将产生更锐利的边缘-对于某些字体,这样看起来更好)


还要注意,您既没有释放生成的
SDL_曲面
也没有释放GL纹理;那样你的内存就会很快用完。纹理可以重复使用,SDL_曲面可以在您将数据复制到GL纹理后立即释放。

抱歉,但我认为您应该先了解OpenGL的更多信息,然后再尝试制作当前正在尝试的内容。首先,OpenGL没有内置的文本函数,也不是现代的OpenGL。此外,您不应该将这个旧的OpenGL 1.1与它的固定函数管道一起使用。这肯定是完全不赞成的。我以前从未见过glVertex2px。我也找不到关于它的东西。因此,最后,如果没有进一步的信息,很难从这个上下文中说出什么是错误的。也许你把Modelview/投影矩阵设置错了,所以你只能看到整体的一小部分?@Michael About
glVertex2px
,这是我自己制作的一个宏,它使用窗口左上角的像素数绘制东西,就像SDL一样。在2D中,我发现这更实用。我忘了在代码中包含它的定义,但我进行了编辑以更正这一点。对不起,但我认为您应该先了解更多有关OpenGL的信息,然后再尝试制作当前正在尝试的内容。首先,OpenGL没有内置的文本函数,也不是现代的OpenGL。此外,您不应该将这个旧的OpenGL 1.1与它的固定函数管道一起使用。这肯定是完全不赞成的。我以前从未见过glVertex2px。我也找不到关于它的东西。因此,最后,如果没有进一步的信息,很难从这个上下文中说出什么是错误的。也许你把Modelview/投影矩阵设置错了,所以你只能看到整体的一小部分?@Michael About
glVertex2px
,这是我自己制作的一个宏,它使用窗口左上角的像素数绘制东西,就像SDL一样。在2D中,我发现这更实用。我忘了在代码中包含它的定义,但我进行了编辑以更正它。