似乎最好的解决方案是为此编写自己的着色器。
我已经通过这种方式解决了这个问题。代码如下:
tint.frag
uniform sampler2D texture;
uniform vec4 flashColor;
void main()
{
vec4 pixel_color = texture2D(texture, gl_TexCoord[0].xy);
float percent = flashColor.a;
vec4 colorDifference = vec4(0,0,0,1);
colorDifference.r = flashColor.r - pixel_color.r;
colorDifference.g = flashColor.g - pixel_color.g;
colorDifference.b = flashColor.b - pixel_color.b;
pixel_color.r = pixel_color.r + colorDifference.r * percent;
pixel_color.g = pixel_color.g +colorDifference.g * percent;
pixel_color.b =pixel_color.b + colorDifference.b * percent;
gl_FragColor = pixel_color;
}
要使用 tint.frag 文件(它是一个着色器文件),您应该发送 flashColor 值
以这种方式到 sf::Shader 对象:
.cpp 代码
flashColor.a = 1.0;//1.0 for 100% effect to 0.0 for 0% effect
shader.loadFromFile("shader/tint.frag", sf::Shader::Fragment);//use your own
//file path
shader.setUniform("flashColor", sf::Glsl::Vec4(1, 0, 0, 1));//from left to
//right: red,green,blue,alpha. Alpha is useless in this shader file.
//max is 1, not 255.
window.draw(yoursprite, &shader);
通过更改 flashColor.a,您可以更改着色效果。 0 是原始颜色,1 是用你想要的颜色完全着色纹理。