SDL2加载某些纹理使SDL_RenderFillRect颜色怪异

我制作了一个程序,它具有两种不同的状态,一种用于菜单显示-“菜单状态”,另一种状态用于绘制某些内容-“绘制状态”。
但是我碰到一个奇怪的事情,如果我加载某些png的纹理并将其复制到渲染器进行显示,然后离开“ Menu State”进入“ Draw State”。纹理将以某种方式使矩形颜色无法正确显示(例如,使绿色变暗)。
在我的代码中,切换到新状态(调用MenuState :: onExit())将擦除纹理贴图(使用std :: string进行纹理智能指针索引的贴图)
因此,加载的texutre甚至在“绘图状态”中都不存在。
 我不知道出了什么问题。这是我的一些代码

void TextureManager::DrawPixel(int x,int y,int width,int height,SDL_Renderer *pRenderer)
{
    SDL_Rect rect;
    rect.x = x;
    rect.y = y;
    rect.w = width;
    rect.h = height;

    SDL_SetRenderDrawColor(pRenderer,255,255);//same color value
    SDL_RenderFillRect(pRenderer,&rect);
}

static bool TextureManagerLoadFile(std::string filename,std::string id)
{
    return TextureManager::Instance().Load(filename,id,Game::Instance().GetRenderer());
}

bool TextureManager::Load(std::string filename,std::string id,SDL_Renderer *pRenderer)
{
    if(m_textureMap.count(id) != 0)
    {
        return false;
    }
    SDL_Surface *pTempSurface = IMG_Load(filename.c_str());
    SDL_Texture *pTexutre = SDL_CreateTextureFromSurface(pRenderer,pTempSurface);
    SDL_FreeSurface(pTempSurface);
    if(pTexutre != 0)
    {
        m_textureMap[id] = std::make_unique<textureData>(pTexutre,0);
        SDL_QueryTexture(pTexutre,NULL,&m_textureMap[id]->width,&m_textureMap[id]->height);
        return true;
    }
    return false;
}


void TextureManager::ClearFromTextureMap(std::string textureID)
{
    m_textureMap.erase(textureID);
}
bool MenuState::onEnter()
{
    if(!TextureManagerLoadFile("assets/Main menu/BTN PLAY.png","play_button"))
    {
        return false;
    }
    if(!TextureManagerLoadFile("assets/Main menu/BTN Exit.png","exit_button"))
    //replace different png file here will also affect the outcome
    {
        return false;
    }
    if(!TextureManagerLoadFile("assets/Main menu/BTN SETTINGS.png","setting_button"))
    {
        return false;
    }
    int client_w,client_h;
    SDL_GetWindowSize(Game::Instance().getclientWindow(),&client_w,&client_h);
    int playBtn_w = TextureManager::Instance().GetTextureWidth("play_button");
    int playBtn_h = TextureManager::Instance().GetTuextureHeight("play_button");
    int center_x = (client_w - playBtn_w) / 2;
    int center_y = (client_h - playBtn_h) / 2;
    ParamsLoader pPlayParams(center_x,center_y,playBtn_w,playBtn_h,"play_button");

    int settingBtn_w = TextureManager::Instance().GetTextureWidth("setting_button");
    int settingBtn_h = TextureManager::Instance().GetTuextureHeight("setting_button");
    ParamsLoader pSettingParams(center_x,center_y + (playBtn_h + settingBtn_h) / 2,settingBtn_w,settingBtn_h,"setting_button");

    int exitBtn_w = TextureManager::Instance().GetTextureWidth("exit_button");
    int exitBtn_h = TextureManager::Instance().GetTuextureHeight("exit_button");
    ParamsLoader pExitParams(10,10,exitBtn_w,exitBtn_h,"exit_button");

    m_gameObjects.push_back(std::make_shared<MenuUIObject>(&pPlayParams,s_menuToPlay));
    m_gameObjects.push_back(std::make_shared<MenuUIObject>(&pSettingParams,s_menuToPlay));
    m_gameObjects.push_back(std::make_shared<MenuUIObject>(&pExitParams,s_menuExit));
    //change order of the 3 line code above
    //or replace different png for exit button,will make the rectangle color different

    std::cout << "Entering Menu State" << std::endl;
    return true;
}

bool MenuState::onExit()
{
    for(auto i : m_gameObjects)
    {
       i->Clean();
    }
    m_gameObjects.clear();
    TextureManager::Instance().ClearFromTextureMap("play_button");
    TextureManager::Instance().ClearFromTextureMap("exit_button");
    TextureManager::Instance().ClearFromTextureMap("setting_button");
    std::cout << "Exiting Menu State" << std::endl;
    return true;
}
void Game::Render()
{
    SDL_SetRenderDrawColor(m_pRenderer,255);
    SDL_RenderClear(m_pRenderer);
    m_pGameStateMachine->Render();
    SDL_RenderPresent(m_pRenderer);
}

Menu State Figure
Correct Color
Wrong Color

编辑:此外,我发现这种奇怪的现象仅在使用'SDL_RENDERER_accELERATED'标志和-1或0驱动程序索引(即SDL_CreateRenderer(m_pWindow,1,SDL_RENDERER_accELERATED);或{{ 1}}工作正常!

sugartian 回答:SDL2加载某些纹理使SDL_RenderFillRect颜色怪异

我遇到了同样的问题。尝试呈现浅灰色时,我得到了鲜艳的绿色。

已解决问题的参数组合与要使用的驱动程序有关。 -1选择第一个符合条件的驱动程序,在这种情况下,需要对其进行加速。

使用SDL_GetRendererInfo可以看到在使用“ direct3d”驱动程序时发生的情况。

我发现this question在谈论在Direct3d中进行融合。

  

我终于明白了。除了Alpha Blending外,还有Color Blending。因此DirectX将最后一个纹理的颜色与最后一个图元合并。

该问题确实为DirectX中的问题提供了解决方法,但是我不确定如何将其应用于SDL。我也无法在SDL中找到此问题的解决方案。

我正在使用SDL_ttf绘制绿色文本,该文本使用纹理。然后在屏幕上其他位置绘制一个灰色矩形。

奇怪的是,它似乎并没有一直发生。但是,我的情况似乎主要发生在SDL_ttf中。起初我以为它可能是TTF_RenderText_Blended的副产品,但是其他情况也是如此。似乎也不受那些函数生成的纹理的混合模式的影响

因此,就我而言,我能够更改操作顺序以获得正确的颜色。

或者,也可以使用OpenGL驱动程序来解决此问题。与您提到的类似。 (这是我的驱动程序索引1)

我不确定这是否会归类为“答案”,但希望它可以帮助某人或向他们指出正确的方向。

,

这个问题困扰着我。 ekodes提供的链接是我如何解决的,因为操作顺序对我没有影响。

我能够先通过SDL_RenderGetD3D9Device(),然后通过SetTextureStageState拉动d3d9Device,如ekode d3d融合link中所述。

本文链接:https://www.f2er.com/2971476.html

大家都在问