You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:04:51