SDL OpenGL 纹理显示问题

Posted

技术标签:

【中文标题】SDL OpenGL 纹理显示问题【英文标题】:SDL OpenGL Texture display issue 【发布时间】:2013-05-13 08:51:13 【问题描述】:

我正在关注this tutorial,以便从 SDL_Surface 加载 OpenGL 纹理,我复制/粘贴代码并对其进行了调整,但它只显示缓冲区的错误旧部分,即有点烦人......因为我不知道出了什么问题。我还在 Mac Os X 上使用 Qt5。这是我的代码

GLuint texture;         // This is a handle to our texture object
SDL_Surface *surface;   // This surface will tell us the details of the image
GLenum texture_format;
GLint  nOfColors;
surface = IMG_Load("/brique.png");

if ( surface ) 

    // get the number of channels in the SDL surface
    nOfColors = surface->format->BytesPerPixel;
    if (nOfColors == 4)     // contains an alpha channel
    
        if (surface->format->Rmask == 0x000000ff)
            texture_format = GL_RGBA;
        else
            texture_format = GL_BGRA;
     else if (nOfColors == 3)     // no alpha channel
    
        if (surface->format->Rmask == 0x000000ff)
            texture_format = GL_RGB;
        else
            texture_format = GL_BGR;
     else 
        printf("warning: the image is not truecolor..  this will probably break\n");
        // this error should not go unhandled
    

    glEnable( GL_TEXTURE_2D );
    // Have OpenGL generate a texture object handle for us
    glGenTextures( 1, &texture );

    // Bind the texture object
    glBindTexture( GL_TEXTURE_2D, texture );

    // Set the texture's stretching properties
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

    // Edit the texture object's image data using the information SDL_Surface gives us
    glTexImage2D( GL_TEXTURE_2D, 0, nOfColors, surface->w, surface->h, 0, texture_format, GL_UNSIGNED_BYTE, surface->pixels );

else 
    printf("SDL could not load image.bmp: %s\n", SDL_GetError());
    SDL_Quit();
    exit (1);


// Free the SDL_Surface only if it was successfully created
if ( surface ) 
    SDL_FreeSurface( surface );

结果如下:

这是来自函数 glTexImage2D 的调试

【问题讨论】:

您是否已对此进行了调试以准确查看正在运行的代码以及传递给 glTexImage2D 的代码? 【参考方案1】:

您可能或没有声明 a(这会翻转 屏幕缓冲区

SDL_GL_SwapBuffers();

这样做把它放在循环的最后部分:

qglClearColor(qtPurple.dark());

/****************************************
... some ogl initialization code here ...
****************************************/

while (!done)

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   /***********************************
   ... some ogl rendering code here ...
   ***********************************/

   SDL_GL_SwapBuffers();

在 QT5 OGL 上查看本教程:

http://qt-project.org/doc/qt-5.0/qtopengl/hellogl.html

【讨论】:

你有没有调用过 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)qglClearColor(对于 QT5)? 我应该在哪里给他们打电话?渲染之前? glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) - 就在 while 循环的下方/内部。 qglClearColor 在 OpenGL 初始化之前用于 QT5 清除缓冲区。 这要好得多,您应该将其发布为答案:)

以上是关于SDL OpenGL 纹理显示问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL + SDL 有时会从坐标中提取

使用 openGL 在 SDL2 中全屏显示窗口

C++ OpenGL/SDL 2.0 无法加载纹理

使用 SDL 加载 OpenGL 纹理

SDL 3d OpenGL:立方体上的纹理产生空白屏幕

更多 SDL C++ Opengl 显示问题