Я использую функцию 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;
}
Большое спасибо за любую помощь.