SDL OpenGL 窗口无响应,透明

Posted

技术标签:

【中文标题】SDL OpenGL 窗口无响应,透明【英文标题】:SDL OpenGL window not responding, transparent 【发布时间】:2014-05-07 20:37:52 【问题描述】:

我用 OpenGL 上下文创建的 SDL 窗口有问题:

    它是透明的,你可以看到它后面的控制台。从下面的代码中可以看出,我只是写了一些东西来在屏幕上显示红色。

    它不响应任何东西。当我将鼠标悬停在屏幕上时,加载光标就会出现,点击什么也不做。

#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,我已经检查过 :)

【问题讨论】:

SDL_GL_SetAttribute()ing 之后你创建一个上下文并没有真正做任何事情。 我建议你好好看看你的事件循环while 声明。那里有一个分号,那不属于。专业提示:使用像 uncrustify 这样的工具来自动格式化代码的缩进;我对您的代码执行了此操作,并且由于多余的分号,“循环”左大括号最终位于不同的行中(您当然需要 K&R 样式的缩进才能看到这一点)。 datenwolf:哇,太笨拙了!我没看到:) 【参考方案1】:

在创建上下文之后设置像素格式属性是毫无意义的。创建上下文后,默认帧缓冲区的像素格式是不可变的。

将您的所有呼叫移至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);

现在,您可能正在获得单缓冲像素格式。这不适用于现代窗口管理器,后者仅在您交换后/前缓冲区时更新单个窗口。缓冲区交换会导致隐式刷新(无论是否交换缓冲区),所以这个问题很可能是由于合成窗口管理器造成的。

【讨论】:

谢谢,稍后我会检查这是否可行,我有一个链接器错误需要先修复;) 谢谢,成功了。我有一个误解,即当您更改设置时,它会更改所有现有的 glcontexts。我错了。非常感谢您的回答。

以上是关于SDL OpenGL 窗口无响应,透明的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 2 和 Primusrun 在单个缓冲区上无显示(透明窗口)

OpenGL/GLFW/GLM - 键盘输入无响应

VC++创建一个窗口,要窗口无边框,透明,可拖动,属性栏不显示该怎么做?

从 API 获取数据时 tkinter 窗口无响应

为啥在 Jupyter 笔记本中调用 cv2.imshow() 时出现无响应窗口

在新进程中运行时窗口标题中的“无响应”