“找不到匹配的渲染驱动程序!”来自SDL_CreateRenderer()?

时间:2017-08-29 16:06:20

标签: c opengl sdl-2

运行SDL程序时遇到此错误。编辑得很好,但窗口打开了一会儿,然后关闭了。

这是我的代码:

//Using SDL and standard IO
#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
#include <string.h>

// SDL Main Resources
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
SDL_Window* Window = NULL;
SDL_Texture* Canvas = NULL;
SDL_Renderer* Graphic_Renderer = NULL;
SDL_Event Event;

// Initialize SDL resources
int InitSDL_Environment(){
    // Window
    Window = SDL_CreateWindow("UML Prototype", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
    if(Window == NULL){
        printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
        SDL_Quit();
        return 0;
    }
    // Video Engine
    if(SDL_Init(SDL_INIT_VIDEO) < 0){
        printf( "SDL Video Engine could not be initialized! SDL Error: %s\n", SDL_GetError() );
        return 0;
    }
    // Image Formats
    int imgFlags = IMG_INIT_PNG;
    if(!(IMG_Init(imgFlags) & imgFlags)){
        printf("SDL Image Formats could not be initialized! SDL_image Error: %s\n", IMG_GetError());
        return 0;
    }
    // Graphics Renderer
    Graphic_Renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED);
    if(Graphic_Renderer == NULL){
        printf("Graphics renderer could not be created! SDL Error: %s\n", SDL_GetError());
        return 0;
    }
    SDL_SetRenderDrawColor(Graphic_Renderer, 0xFF, 0xFF, 0xFF, 0xFF);
    // Return Success
    return 1;
}

// Load image from file
SDL_Texture* SDL_LoadTexture(char* src){
    SDL_Texture* texture = NULL;
    SDL_Surface* loadData = IMG_Load(src);
    if(!loadData){
        printf("Image \"%s\" could not be loaded! SDL_image ERROR: %s\n", src, IMG_GetError());
        return NULL;
    }
    texture = SDL_CreateTextureFromSurface(Graphic_Renderer, loadData);
    if(!texture){
        printf("Image \"%s!\" could not be processed! SDL Error: %s\n", src, SDL_GetError());
    }
    SDL_FreeSurface(loadData);
    return texture;
}

int main( int argc, char* args[] )
{   
    // Load SDL Resources
    if(!InitSDL_Environment()){return 1;}
    SDL_Texture* image = SDL_LoadTexture("Duck.png");
    if(image == NULL){
        printf("Image could not be found! SDL_Error: $s\n", SDL_GetError());
        return 2;
    }
    SDL_Rect sign;
    sign.x = 40;
    sign.y = 31;
    sign.w = 300;
    sign.h = 300;

    // Main loop
    for(;;){
        // Update screen
        SDL_RenderClear(Graphic_Renderer);
        SDL_RenderCopy(Graphic_Renderer, image, NULL, NULL);
        SDL_RenderPresent(Graphic_Renderer);

        // Event handling
        SDL_PollEvent(&Event);
        if(Event.type == SDL_QUIT){
            SDL_DestroyWindow(Window);
            SDL_Quit();
            return 0;
        }
    }
}

当我调整批处理文件以将程序错误发布到控制台窗口时,它会显示Graphics renderer could not be created! SDL Error: Couldn't find matching render driver,指向我Graphic_Renderer = SDL_CreateRenderer...函数中的InitSDL_Environment()行。

正如您所看到的,该错误的第一位是我自己制作的,最后一位是由SDL_GetError()生成的,因此这是SDL识别的问题。

我发现this forum post有关每个人都建议下载OpenGL库的基本问题。从那里,我搜索并找到了this link。该页面上没有链接似乎导致我可以下载的任何内容,并且逐渐模糊的OpenGL库下载,搜索或者是否甚至可以解决问题。那个论坛帖子毕竟是四年了。

如果这是SDL库的OpenGL问题,我究竟会在哪里获得OpenGL库,哪些应该下载?我只是对我的代码做了些蠢事吗?

1 个答案:

答案 0 :(得分:0)

所以我对我的代码做了一些愚蠢的事!当然&lt; _&lt;

我改变了我的InitSDL_Environment()功能,它起作用了。我将SDL_CreateWindow功能移到SDL_Init(SDL_INIT_VIDEO)部分下方。因此,初始化SDL视频,然后创建窗口。真棒!

// Initialize SDL resources
int InitSDL_Environment(){
    // Video Engine
    if(SDL_Init(SDL_INIT_VIDEO) < 0){
        printf( "SDL Video Engine could not be initialized! SDL Error: %s\n", SDL_GetError() );
        return 0;
    }
    // Image Formats
    int imgFlags = IMG_INIT_PNG;
    if(!(IMG_Init(imgFlags) & imgFlags)){
        printf("SDL Image Formats could not be initialized! SDL_image Error: %s\n", IMG_GetError());
        return 0;
    }
    // Window
    Window = SDL_CreateWindow("UML Prototype", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
    if(Window == NULL){
        printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
        SDL_Quit();
        return 0;
    }
    // Graphics Renderer
    Graphic_Renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED);
    if(Graphic_Renderer == NULL){
        printf("Graphics renderer could not be created! SDL Error: %s\n", SDL_GetError());
        return 0;
    }
    SDL_SetRenderDrawColor(Graphic_Renderer, 0xFF, 0xFF, 0xFF, 0xFF);
    // Return Success
    return 1;
}

评论提出了三个要点:

  1. SDL纹理要求计算机具有显卡和显卡。他们的最新驱动程序,可能需要手动更新。
  2. 需要在创建窗口之前初始化SDL视频
  3. 函数SDL_GetNumRenderDrivers()SDL_GetRendererInfo()可用于查找有关可用卡片的信息并解决此错误。
  4. 感谢评论员!这是一个巨大的帮助。