SDL 清除 SDL_SetTextureColorMod 效果

Jan*_*ser 1 sdl

我正在使用 SDL_SetTextureColorMod 函数来修改纹理。正如在这个问题的答案中看到,该函数本身不修改纹理,只在绘制时进行颜色修改。

问题是,在调用 SDL_SetTextureColorMod 时,我无法重置效果,而且我在网上找不到任何东西。简而言之,我想为纹理添加例如变暗效果。但是,我希望能够绘制原始纹理。在应用程序中按 G 时,会应用效果。我也试过

SDL_SetTextureColorMod(texture, 1, 1, 1);
Run Code Online (Sandbox Code Playgroud)

但这并没有重置效果

代码

#include <SDL.h>
#include <SDL_image.h>

#include <iostream>

using namespace std;

int main2();

int WinMain()
{
    main2();
}
SDL_Texture* LoadTexture( const string& Filename, SDL_Renderer * renderer )
{
    if(renderer == nullptr)
        return nullptr;

    SDL_Texture* texture = IMG_LoadTexture( renderer, Filename.c_str() );
    if ( texture == nullptr )
    {
        std::cout << __FUNCTION__ << "(...): " << "Failed to load texture " << Filename << " error : " << SDL_GetError() << std::endl;
        return nullptr;
    }

    return texture;
}
int main2()
{
    bool quit = false;
    SDL_Event event;

    SDL_Init(SDL_INIT_VIDEO);
    IMG_Init(IMG_INIT_JPG);

    SDL_Window * window = SDL_CreateWindow("SDL2 Grayscale",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
    SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0);
    SDL_Texture * texture = LoadTexture("teeth.png", renderer);
    if(!texture)
        return 0;

    while (!quit)
    {
        SDL_WaitEvent(&event);

        switch (event.type)
        {
        case SDL_QUIT:
            quit = true;
            break;
        case SDL_KEYDOWN:
            switch (event.key.keysym.sym)
            {
            case SDLK_g:
                //Uint8 * r, *g, *b;


                SDL_SetTextureColorMod(texture, 100, 100, 100);
                //greytexture = Greyscale(image, renderer, GreyscalePercentage);
                break;
            case SDLK_1:
                SDL_SetTextureColorMod(texture, 1, 1, 1);
                break;
            }
            break;
        }

        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);
    }

    SDL_DestroyTexture(texture);
    //SDL_FreeSurface(image);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    IMG_Quit();
    SDL_Quit();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助。

小智 5

函数 SDL_SetTextureColorMod 将 Uint8 用于红色、绿色和蓝色颜色值。值 0 表示没有颜色。而值 255 将是最大颜色。因此,要将颜色重置为正常,您将使用 255 表示红色、绿色和蓝色。如:

SDL_SetTextureColorMod(texture, 255, 255, 255);
Run Code Online (Sandbox Code Playgroud)