将SDL曲面转换为GL纹理有问题

时间:2014-12-18 11:58:52

标签: c++ opengl sdl

我无法找到错误,为什么还没有创建文字?当使用纹理而不是文本时我得到的东西或带有彩色点的黑色背景,请帮助

GLuint texture;
SDL_Surface *text = NULL;
TTF_Font *font = NULL;
SDL_Color color = {0, 0, 0};


font = TTF_OpenFont("../test.ttf", 20);
text = TTF_RenderText_Solid(font, "Hello, SDL !!!", color);

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, text->w, text->h, 0, GL_RGB, GL_UNSIGNED_BYTE, text->pixels);

SDL_FreeSurface(text);

2 个答案:

答案 0 :(得分:2)

您可以添加的一件事是指定纹理过滤器,例如

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

答案 1 :(得分:0)

您必须先检查几件事

  1. 是否正确加载了字体?检查" font == NULL",也许是你的 字体路径错误
  2. 是着色器(如果使用着色器)设置正确吗?
  3. 我的猜测是你在 glTexImage2D 中设置错误的像素格式类型会导致纹理上出现随机颜色点

    下面是我的代码,通过SDL_image加载图像以供OpenGL使用,我认为这是一个很好的开始,可以找出你错过或遗忘的步骤。

    顺便说一下,这段代码并不完美。像素格式的类型超过四种(如索引颜色),我只处理其中的一些。

    /*
     * object_, originalWidth_ and originalHeight_ are private variables in
     * this class, don't panic.
     */
    void
    Texture::Load(string filePath, GLint minMagFilter,  GLint wrapMode)              
    {
        SDL_Surface* image;                                                      
        GLenum textureFormat;                                                    
        GLint bpp;              //Byte Per Pixel                                 
    
        /* Load image file */                                                    
        image = IMG_Load(filePath.c_str());                                      
        if (image == nullptr) {                                                  
                string msg("IMG error: ");                                       
                msg += IMG_GetError();                                           
                throw runtime_error(msg.c_str());                                
        }                                                                        
    
        /* Find out pixel format type */                                         
        bpp = image->format->BytesPerPixel;                                      
        if (bpp == 4) {                                                          
                if (image->format->Rmask == 0x000000ff)                          
                        textureFormat = GL_RGBA;                                 
                else                                                             
                        textureFormat = GL_BGRA;                                 
        } else if (bpp == 3) {                                                   
                if (image->format->Rmask == 0x000000ff)                          
                        textureFormat = GL_RGB;                                  
                else                                                             
                        textureFormat = GL_BGR;                                  
        } else {                                                                 
                string msg("IMG error: Unknow pixel format, bpp = ");            
                msg += bpp;                                                      
                throw runtime_error(msg.c_str());                                
        }                                                                        
    
        /* Store widht and height */                                             
        originalWidth_ = image->w;                                               
        originalHeight_ = image->h;
    
        /* Make OpenGL texture */                                                
        glEnable(GL_TEXTURE_2D);                                                 
        glGenTextures(1, &object_);                                              
        glBindTexture(GL_TEXTURE_2D, object_);                                   
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minMagFilter);     
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, minMagFilter);     
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode);             
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode);             
        glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);             
        glTexImage2D(                                                            
                GL_TEXTURE_2D,                  // texture type                  
                0,                              // level                         
                bpp,                            // internal format               
                image->w,                       // width                         
                image->h,                       // height                        
                0,                              // border                        
                textureFormat,                  // format(in this texture?)      
                GL_UNSIGNED_BYTE,               // data type                     
                image->pixels                   // pointer to data               
                );                                                               
    
        /* Clean these mess up */                                                
        glBindTexture(GL_TEXTURE_2D, 0);                                         
        glDisable(GL_TEXTURE_2D);                                                
        SDL_FreeSurface(image);
    }
    

    有关详细信息,请查看SDL wiki或深入了解其源代码,以全面了解SDL_Surface的体系结构。