SDL清除SDL_SetTextureColorMod效果

时间:2016-06-17 13:52:52

标签: sdl

我正在使用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;
}

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

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

SDL_SetTextureColorMod(texture, 255, 255, 255);