2016-06-17 2 views
0

Я использую функцию SDL_SetTextureColorMod для изменения текстуры. Как видно In this question's answer, функция не изменяет сама текстура, только при изменении рисунка изменяется только цвет.SDL Clearing SDL_SetTextureColorMod effect

Проблема в том, что при вызове 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

Функция SDL_SetTextureColorMod использует Uint8 для значений красного, зеленого и синего цветов. Значение 0 не будет цвета. Хотя значение 255 будет максимальным цветом. Таким образом, чтобы вернуть цвета в нормальное состояние, вы должны использовать 255 для красного, зеленого и синего. Как и в случае:

SDL_SetTextureColorMod(texture, 255, 255, 255);