【问题标题】:"Invalid renderer" with SDL2 & OpenGL带有 SDL2 和 OpenGL 的“无效渲染器”
【发布时间】:2016-09-29 06:38:01
【问题描述】:

我之前已经使用过 SDL2,现在我尝试将它与 openGL 2.1 一起使用。 但是当我尝试创建渲染器时,我得到“无效的渲染器”。 为了创建渲染器,我之前已经为简单的 SDL2 项目使用了同一行,但使用 openGL 似乎无法正常工作。 有人知道为什么吗? 我试图更改 CreateRenderer 的标志,除了“SDL_RENDERER_SOFTWARE”之外,我对所有这些标志都有这个错误,但是我无法正确抓取输入,当鼠标光标离开窗口时,我有这个错误:“无效窗口”。

这是我的代码:

#include <SDL2/SDL.h>
#include <GL/glut.h>
#include <iostream>

const int WIDTH = 500, HEIGHT = 500;

using namespace std;

SDL_Window* pWindow;
SDL_Renderer* pRenderer;
SDL_Event event;

void initOGL()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(70,(double)WIDTH/HEIGHT,1,1000);

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
}

void initSDL()
{
    if (SDL_Init(SDL_INIT_VIDEO) != 0)
    {
        cout << "Video init failed" << endl;
        exit(EXIT_FAILURE);
    }
    cout << "Video initialized" << endl;


    // Window creation
    pWindow = SDL_CreateWindow("Test OGL w/ SDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
    if (!pWindow)
    {
        cout << "Window creation failed" << endl;
        exit(EXIT_FAILURE);
    }
    cout << "Window created" << endl;

    // Renderer creation
    pRenderer = SDL_CreateRenderer(pWindow, -1, SDL_RENDERER_ACCELERATED);
    if (!pRenderer)
    {
        cout << "Renderer creation failed" << endl;
    }
    cout << "Renderer created" << endl;

    // OGL version
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);

    // OGL context
    SDL_GLContext contexteOGL = SDL_GL_CreateContext(pWindow);
    if (!contexteOGL)
    {
        cout << "Echec création du contexte" << endl;
    }
    cout << "Contexte créé" << endl;
}

int main(int argc, char const *argv[])
{
    initSDL();
    initOGL();
    cout << "SDL_ERROR : " << SDL_GetError() << endl;
    return 0;
}

【问题讨论】:

  • 如果您确实需要 OpenGL 2.1,我建议您索取兼容性配置文件。但您的平台可能不支持它。 2.1 现在真的很老了,你应该使用更新的标准版本 >= 3.0
  • 混合SDL_CreateRendererSDL_GL_CreateContext 看起来不是一个好主意。充其量,它将用新的上下文替换上下文。如果您不使用 SDL2 渲染 API,请不要创建渲染器,只需设置上下文并使用 GL 进行绘制。
  • 感谢您的回答。 Jan Henke :是的,但我认为我的硬件不支持 >= openGL 加上我一点也不熟悉,我没有时间重新启动和翻译我的代码,因为它是一个项目,我只剩下一个月了:/ keltar:是的,但我认为我需要 SDL 来处理纹理,不是吗?
  • @JoutenJouJouHakujou 不,如果您不打算使用 SDL_RenderCopy 类的函数,则不需要 SDL_Renderer。实际上使用 SDL 来创建窗口/上下文、输入处理和线程,同时将所有绘图留给 GL 是一种常见的做法,甚至在 SDL2 之前也是如此(SDL
  • @JoutenJouJouHakujou 通过手动生成 GL 纹理并将surface-&gt;pixels 输入其中,例如第二个帖子opengl.org/discussion_boards/showthread.php/…。 “无效渲染器”SDL 错误和if(!pRenderer) 触发是不同的东西 - 我很难相信您仍然可以使用 NULL 渲染器,而“无效渲染器”可能在初始化期间被标记但实际上不是错误(选择 stackoverflow.com/questions/31628174/sdl2-invalid-renderer来自“相关问题”,令人惊讶的是这正是我想到的问题)。

标签: c++11 opengl sdl-2


【解决方案1】:

例如,如果您在 Linux 中从源代码编译 SDL,我可能是“内置支持的驱动程序”问题。

尝试在 SDL_CreateRenderer(pWindow, -1, 0) 中使用“flags = 0”;

然后测试实际选择的渲染器(这是在 C 中):

SDL_RendererInfo ri;
SDL_GetRendererInfo(pRenderer, &ri);
int n = SDL_GetNumRenderDrivers();
printf("Rendering drivers (%i):", n);
for(int i = 0; i < n; i++) {
    SDL_RendererInfo info;
    SDL_GetRenderDriverInfo(i, &info);
    printf(" '%s'", info.name);
}
printf(", active = '%s'\n", ri.name);

完整源代码为here

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多