SDL清算SDL_SetTextureColorMod效果

SDL Clearing SDL_SetTextureColorMod effect

我正在使用 SDL_SetTextureColorMod 函数修改纹理。 可见In this question's answer,函数本身不修改贴图,只在绘制时修改颜色。

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

SDL_SetTextureColorMod(texture, 1, 1, 1);

但这并没有重置效果

代码

#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;
}

非常感谢您的帮助。

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

SDL_SetTextureColorMod(texture, 255, 255, 255);