我正在使用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;
}非常感谢您的帮助。
发布于 2016-06-19 15:37:28
函数SDL_SetTextureColorMod对红色、绿色和蓝色值使用Uint8。值0将不是颜色。而值255将是最大颜色。因此,若要将颜色重置为正常颜色,请使用255表示红色、绿色和蓝色。如:
SDL_SetTextureColorMod(texture, 255, 255, 255);https://stackoverflow.com/questions/37883407
复制相似问题