C++ 基于SDL曲面的openGL纹理

C++ 基于SDL曲面的openGL纹理,c++,opengl,textures,sdl,C++,Opengl,Textures,Sdl,我从一个大项目中取出了我的字体系统,并将其修好以正常工作。将其插入到我的主项目中,现在字体无法正确呈现。剩下的是白色框,而不是字形纹理渲染。以下是与此问题相关的代码 bool KFont::MapGlyph(char a) { const char* T = &a; SDL_Surface* ThisGlyph; //Font is a struct that holds the font information Font->Font is the TTF

我从一个大项目中取出了我的字体系统,并将其修好以正常工作。将其插入到我的主项目中,现在字体无法正确呈现。剩下的是白色框,而不是字形纹理渲染。以下是与此问题相关的代码

bool KFont::MapGlyph(char a) { 
    const char* T = &a;
    SDL_Surface* ThisGlyph;
    //Font is a struct that holds the font information Font->Font is the TTF pointer.
    if(!(ThisGlyph = TTF_RenderUTF8_Blended(Font->Font, T, GlyphColor))) {
        //std::cout << "!" << std::endl;
        return false;
    }

    KTexture* Temp;
    Temp = new KTexture;

    if(!(Temp->LoadImage(ThisGlyph))) {     
        //std::cout<< "!!" << std::endl;
        return false;
    }

    SDL_FreeSurface(ThisGlyph);
    Glyphs->Glyphs.insert( std::pair<char,KTexture*>(a,Temp) );
    return true;

}
在渲染过程中,角色正确,要渲染的X/Y位置正确,曲面->w/h是否都相同?TextureID在工作版本中更改时始终保持为0。glBindTexture()似乎有问题,但我已经多次查看了不同的代码,无法理解为什么不进行渲染

渲染函数(如果有帮助)

void KTexture::RenderQuad(int x, int y, int w, int h) {
    glPushMatrix();
    glEnable(GL_TEXTURE_2D);

    if(TextureID & GL_INVALID_VALUE) exit(1);

    glBindTexture(GL_TEXTURE_2D,TextureID);

    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);

    glBegin(GL_QUADS);
        glTexCoord2f(0,0); glVertex3f(x,y,0);
        glTexCoord2f(1,0); glVertex3f(x+w,y,0);
        glTexCoord2f(1,1); glVertex3f(x+w,y+h,0);
        glTexCoord2f(0,1); glVertex3f(x,y+h,0);
    glEnd();

    glDisable(GL_TEXTURE_2D);
    glPopMatrix();
    glFlush();
}
这些是我的名字

if(SDL_Init(SDL_INIT_EVERYTHING) < 0 ) { 
        exit(0x1);
    }

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE,           8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,         8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,          8);
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,         8);

    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,        16);
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,       32);

    SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE,     8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE,   8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE,   8);

    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);

    if((Surf_Display = SDL_SetVideoMode(winWidth,winHeight,32, SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER |SDL_OPENGL | SDL_RESIZABLE )) == NULL) {
        exit(2);
    }

    glClearColor(0, 0, 0, 0);
    glClearDepth(1.0f);

    glViewport(0, 0, winWidth, winHeight);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho(0, winWidth, winHeight, 0, 1, -1);

    glMatrixMode(GL_MODELVIEW);
    glEnable (GL_BLEND); 

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glLoadIdentity();
if(SDL_Init(SDL_Init_EVERYTHING)<0){
退出(0x1);
}
SDL_GL_设置属性(SDL_GL_红色_大小,8);
SDL_GL_设置属性(SDL_GL_绿色_大小,8);
SDL_GL_SetAttribute(SDL_GL_BLUE_大小,8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_大小,8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,16);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,32);
SDL_GL_设置属性(SDL_GL_累计大小,8);
SDL_GL_设置属性(SDL_GL_累计绿色_大小,8);
SDL_GL_设置属性(SDL_GL_累计蓝色_大小,8);
SDL_GL_设置属性(SDL_GL_累计ALPHA_大小,8);
SDL_GL_SetAttribute(SDL_GL_多采样缓冲区,1);
SDL_GL_SetAttribute(SDL_GL_多样本样本,2);
如果((Surf_Display=SDL_SetVideoMode(winWidth,winHeight,32,SDL_-HWSURFACE | SDL_-GL_-DOUBLEBUFFER | SDL_-OPENGL | SDL_-resizeable))==NULL){
出口(2);
}
glClearColor(0,0,0,0);
glClearDepth(1.0f);
glViewport(0,0,winWidth,winHeight);
glMatrixMode(GL_投影);
glLoadIdentity();
glOrtho(0,winWidth,winHeight,0,1,-1);
glMatrixMode(GLU模型视图);
glEnable(GL_混合物);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
glLoadIdentity();

知道为什么我的字体不会呈现吗?我尝试将
glTexEnvf
模式更改为贴花、调制和混合,但没有任何效果。只有一些白色方块。

确保在
SDL\u SetVideoMode()
之后调用
KTexture::LoadImage()
,使其具有当前的GL上下文。

那些
TextureID&GL\u无效值测试应该做什么?拒绝任何名为
0x0501
的纹理?哈哈,不知道,它们是我在谷歌搜索尝试中找到的解决方案中建议的。实际上我已经把它们注释掉了。我一直在寻找解决方案,因为我搞不懂。是否正在使用当前GL上下文调用
KTexture::LoadImage()
?即,在
SDL\u SetVideoMode()
之后,捕捉。因此,在我的独立版本中,我创建上下文,然后呈现文本。在这里,我有一个类MyApp。MyApp声明具有要呈现的字体的菜单项。这发生在我创建openGL上下文之前。谢谢,谢谢。你可以添加它作为答案,我会选择它。
if(SDL_Init(SDL_INIT_EVERYTHING) < 0 ) { 
        exit(0x1);
    }

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE,           8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,         8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,          8);
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,         8);

    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,        16);
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,       32);

    SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE,     8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE,   8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE,   8);

    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);

    if((Surf_Display = SDL_SetVideoMode(winWidth,winHeight,32, SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER |SDL_OPENGL | SDL_RESIZABLE )) == NULL) {
        exit(2);
    }

    glClearColor(0, 0, 0, 0);
    glClearDepth(1.0f);

    glViewport(0, 0, winWidth, winHeight);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho(0, winWidth, winHeight, 0, 1, -1);

    glMatrixMode(GL_MODELVIEW);
    glEnable (GL_BLEND); 

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glLoadIdentity();