SDL OpenGL窗口没有响应,透明

时间:2014-05-07 20:37:53

标签: c++ opengl sdl glew

我使用OpenGL上下文创建的SDL窗口存在问题:

  1. 它是透明的,你可以看到它背后的控制台。正如您从下面的代码中看到的,我只是写了一些东西来向屏幕显示红色。

  2. 它没有回应任何事情。只要我将鼠标悬停在屏幕上,就会出现加载光标,点击什么都不做。


  3. #define main SDL_main
    #include "stdafx.h"
    
    int main(int argc, char **argv)
    {
        bool quit = false;
    
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
    
        if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
            SDL_Quit( );
            return 1;
        }
    
        SDL_Window* window = NULL;
        window = SDL_CreateWindow("SandVox", 100, 100, 600, 400, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
    
        if (!window) {
            std::cout << "Unable to create window" << std::endl;
            SDL_DestroyWindow(window);
            return 0;
        }
    
        SDL_GLContext glcontext = SDL_GL_CreateContext(window);
        SDL_GL_MakeCurrent(window, glcontext);
        glewInit( );
    
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
        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_SetSwapInterval(1);
    
        SDL_Renderer* render = NULL;
        render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    
        SDL_Event *mainEvent = NULL;
        mainEvent = new SDL_Event( );
    
        while (!quit && mainEvent->type != SDL_QUIT) ;
        {
            SDL_PollEvent(mainEvent);
            /*
               SDL_RenderClear(render);
               SDL_RenderPresent(render);
             */
            glClearColor(1.0, 0.0, 0.0, 1.0);
            glClear(GL_COLOR_BUFFER_BIT);
            SDL_GL_SwapWindow(window);
        }
    
    
        SDL_GL_DeleteContext(glcontext);
        SDL_DestroyRenderer(render);
        SDL_DestroyWindow(window);
        delete mainEvent;
        SDL_Quit( );
    
        return 0;
    }
    
    stdafx.h没有任何令人兴奋的事情,只有这个:

    #include <SDL.h>
    #include <SDL_image.h>
    #include <SDL_mixer.h>
    #include <GL/glew.h>
    #include <GL/GL.h>
    #include <GL/glxew.h>
    #include <GL/wglew.h>
    #include <GL/GLU.h>
    

    编辑:要抢先一个人可能有的问题,是的,我的计算机上安装了OpenGL 4.0,我已经检查过了:)

1 个答案:

答案 0 :(得分:2)

在 之后设置像素格式属性 ,您创建上下文是非常没有意义的。一旦创建了上下文,默认帧缓冲区的像素格式就是不可变的。

将您的所有来电移至SDL_GL_SetAttribute (...),以便他们来到SDL_GL_CreateContext(window)

可以随时设置交换间隔,但需要移动此代码块中的所有其他内容:

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
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_SetSwapInterval(1);

目前,您可能正在获得单缓冲像素格式。这与现代窗口管理器不相符合,现代窗口管理器只在交换后台/前台缓冲区时更新单个窗口。缓冲区交换会导致隐式刷新(无论是否交换缓冲区),因此这个问题很可能是由于合成窗口管理器造成的。