我正在使用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;
}
非常感谢您的帮助。
答案 0 :(得分:3)
SDL_SetTextureColorMod函数使用Uint8作为红色,绿色和蓝色值。值0将不是颜色。而值255将是最大颜色。因此,要将颜色重置为正常,您将使用255表示红色,绿色和蓝色。如:
SDL_SetTextureColorMod(texture, 255, 255, 255);