颜色调制可以让你改变渲染纹理的颜色。在这里,我们将使用各种颜色来调制一个纹理。
//Texture wrapper class
class LTexture
{
public:
//Initializes variables
LTexture();
//Deallocates memory
~LTexture();
//Loads image at specified path
bool loadFromFile( std::string path );
//Deallocates texture
void free();
//Set color modulation
void setColor( Uint8 red, Uint8 green, Uint8 blue );
//Renders texture at given point
void render( int x, int y, SDL_Rect* clip = NULL );
//Gets image dimensions
int getWidth();
int getHeight();
private:
//The actual hardware texture
SDL_Texture* mTexture;
//Image dimensions
int mWidth;
int mHeight;
};
我们要在纹理包装器类中添加一个函数,允许设置纹理调制。它所要做的就是接收一个红、绿、蓝三色组件。
void LTexture::setColor( Uint8 red, Uint8 green, Uint8 blue ){
//调制纹理
SDL_SetTextureColorMod( mTexture, red, green, blue );
}
设置纹理调制就像调用SDL_SetTextureColorMod[1]一样简单。你只需传入你想调制的纹理和你想调制的颜色。
现在颜色调制是如何工作的呢?假设你有这样的纹理:
然后你用红色255,绿色128,蓝色255来调制它。你最终会得到这样的结果:
你可能已经注意到 SDL_SetTextureColorMod 接受 Uint8 作为颜色组件的参数。Uint8是一个无符号的8位整数。这意味着它可以从0到255。128大约是0和255之间的一半,所以当你把绿色调制到128时,它会把纹理上任何像素的绿色分量减半。
红色和蓝色的方块不会受到影响,因为它们没有绿色,但绿色的亮度会减半,白色会变成淡淡的洋红色(洋红色是红色255,绿色0,蓝色255)。颜色调制只是在整个纹理中乘以一种颜色的方法。
//Main loop flag
bool quit = false;
//Event handler
SDL_Event e;
//调制成分
Uint8 r = 255;
Uint8 g = 255;
Uint8 b = 255;
这里是主循环之前。在这个演示中,我们将使用按键来调制各个颜色组件。要做到这一点,我们需要跟踪颜色组件的值。
//While application is running
while( !quit )
{
//Handle events on queue
while( SDL_PollEvent( &e ) != 0 )
{
//User requests quit
if( e.type == SDL_QUIT )
{
quit = true;
}
//按键时改变RGB值
else if( e.type == SDL_KEYDOWN )
{
switch( e.key.keysym.sym )
{
//增加红色
case SDLK_q:
r += 32;
break;
//增加绿色
case SDLK_w:
g += 32;
break;
//增加蓝色
case SDLK_e:
b += 32;
break;
//减少红色
case SDLK_a:
r -= 32;
break;
//减少绿色
case SDLK_s:
g -= 32;
break;
//减少蓝色
case SDLK_d:
b -= 32;
break;
}
}
}
//Clear screen
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
SDL_RenderClear( gRenderer );
//调制和渲染纹理
gModulatedTexture.setColor( r, g, b );
gModulatedTexture.render( 0, 0 );
//Update screen
SDL_RenderPresent( gRenderer );
}
在我们的事件循环中,我们会让q、w和e键增加红、绿、蓝三色的分量,让a、s和d键减少红、绿、蓝三色的分量。它们增加/减少32个分量,所以每按一次键都会有明显的变化。
而最后我们设置的是纹理调制和渲染纹理。
[1]
SDL_SetTextureColorMod: http://wiki.libsdl.org/SDL_SetTextureColorMod
[2]
这里: http://www.lazyfoo.net/tutorials/SDL/12_color_modulation/12_color_modulation.zip
[3]
原文链接: http://www.lazyfoo.net/tutorials/SDL/12_color_modulation/index.php