2017-08-29 15 views
0

運行我的SDL程序時遇到此錯誤。它編譯得很好,但窗口打開了一會兒,然後關閉了。「找不到匹配的渲染驅動程序!」來自SDL_CreateRenderer()?

這裏是我的代碼:

//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,在我InitSDL_Environment()功能權限指着Graphic_Renderer = SDL_CreateRenderer...線。

正如您所看到的,該錯誤的第一位是我自己製作的,最後一位是由SDL_GetError()生成的,所以這是SDL可以識別的問題。

我發現this forum post關於大家都建議下載OpenGL庫的基本問題。從那裏,我搜索並找到this link。該頁面上的任何鏈接似乎都不會導致我可以下載的任何內容,並且OpenGL庫下載,搜索甚至解決問題的方式逐漸變得模糊不清。那個論壇帖子畢竟是四歲的。

如果它是SDL庫的OpenGL問題,那麼我會在哪裏獲得OpenGL庫,以及我應該下載哪些庫?我只是用我的代碼做一些愚蠢的事情嗎?

+3

爲什麼在*'SDL_Init()'之前調用'SDL_CreateWindow()'*? – genpfault

+0

您的視頻卡驅動程序是從供應商的網站(NVidia,AMD)下載的並且是最新的?通用MS驅動程序不能使用硬件OpenGL加速。 – VuVirt

+0

當在SDL_CreateRenderer()之前使用'SDL_GetNumRenderDrivers()'和'SDL_GetRendererInfo()'爲每個渲染驅動程序轉儲'SDL_RendererInfo :: name'值時會發生什麼? – genpfault

回答

0

所以我做了一些愚蠢的代碼!當然< _ <

我改變了我的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()可以用來了解可用卡而煩惱,拍攝此錯誤信息被初始化。

謝謝解說員!這是一個巨大的幫助。