SDL3调用SDL_RenderTexture渲染纹理时出现_com_error报错求助
SDL3渲染纹理报错解决方法
错误原因分析
你遇到的ID3D11Device1::CreatePixelShader: Parameter is not correct错误,核心原因是传入了空纹理给SDL_RenderTexture,同时代码存在几处逻辑问题:
- 未初始化SDL_image的图片格式支持,导致PNG纹理加载失败,
fairy变量为空 - 未检查
IMG_LoadTexture的返回值,无法及时发现纹理加载失败 SDL_RenderTexture的返回值判断逻辑搞反,SDL函数成功返回0、失败返回非0,原代码的判断会在渲染失败时才触发日志,但此时空纹理已经导致底层D3D报错
具体修复步骤
1. 初始化SDL_image并检查纹理加载结果
在Game::init函数中,SDL初始化完成后添加SDL_image的初始化代码,并检查纹理加载是否成功:
void Game::init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen) { int flags = 0; if (fullscreen) { flags = SDL_WINDOW_FULLSCREEN; } if(SDL_Init(SDL_INIT_VIDEO) < 0) { std::cout << "Error: Couldn't initialize SDL!" << std::endl; is_running = false; return; } // 初始化SDL_image,确保支持PNG格式 if (!(IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG)) { std::cout << "IMG初始化失败: " << IMG_GetError() << std::endl; is_running = false; return; } // 创建窗口 window = SDL_CreateWindow(title, xpos, ypos, width, height, flags); if(!window) { std::cout << "窗口创建失败: " << SDL_GetError() << std::endl; is_running = false; return; } std::cout << "Window Created!" << std::endl; // 创建渲染器 renderer = SDL_CreateRenderer(window, NULL); if(!renderer) { std::cout << "渲染器创建失败: " << SDL_GetError() << std::endl; is_running = false; return; } std::cout << "Renderer Created" << std::endl; is_running = true; // 加载纹理并检查结果 fairy = IMG_LoadTexture(renderer, "assets/hadita.png"); if (!fairy) { std::cout << "加载纹理失败: " << IMG_GetError() << std::endl; is_running = false; } }
2. 修正SDL_RenderTexture的判断逻辑
SDL3中SDL_RenderTexture成功返回0、失败返回非0,修改渲染函数的判断逻辑:
void Game::render() { SDL_RenderClear(renderer); // 只有返回值不为0时才说明渲染出错 if(SDL_RenderTexture(renderer, fairy, NULL, NULL) != 0) { SDL_Log("IMG Render Error: %s", SDL_GetError()); } SDL_RenderPresent(renderer); }
3. 修复其他潜在问题
将全局变量
fairy改为Game类的成员变量,避免全局变量生命周期问题:
在mygame.h的Game类private部分添加:SDL_Texture* fairy = nullptr;删除
mygame.cpp中的全局变量声明SDL_Texture* fairy = NULL;修复事件处理逻辑,用while循环处理所有待处理事件,避免漏掉退出事件:
void Game::handle_events() { SDL_Event event; // 使用while循环处理所有事件 while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_EVENT_QUIT: is_running = false; break; default: break; } } }修正
is_running的初始化值,bool类型规范初始值为false:private: bool is_running = false; SDL_Window* window = nullptr; SDL_Renderer* renderer = nullptr; SDL_Texture* fairy = nullptr;
额外注意事项
- 确保
assets/hadita.png路径正确,程序运行时的工作目录要包含该assets文件夹 - 如果使用其他图片格式,需要对应初始化SDL_image的支持(如
IMG_INIT_JPG对应JPG)
内容的提问来源于stack exchange,提问作者user29427142
相关产品推荐
相关产品推荐

