所以我有一些代码旨在在两种输入颜色之间生成线性渐变:
struct color {
float r, g, b, a;
}
color produce_gradient(const color & c1, const color & c2, float ratio) {
color output_color;
output_color.r = c1.r + (c2.r - c1.r) * ratio;
output_color.g = c1.g + (c2.g - c1.g) * ratio;
output_color.b = c1.b + (c2.b - c1.b) * ratio;
output_color.a = c1.a + (c2.a - c1.a) * ratio;
return output_color;
}
我还在我的着色器中编写了(语义相同的)代码。
问题是,使用这种代码会在颜色相遇的中间产生“暗带”,这是由于亮度在计算机屏幕和用于表示这些像素的原始数据之间转换的方式的怪癖。
所以我的问题是:
- 我是否需要在主机功能、设备功能中校正伽马,或者两者都不需要?
- 纠正函数以正确处理伽玛的最佳方法是什么?我在下面提供的代码是否以适当的方式转换颜色?
代码:
color produce_gradient(const color & c1, const color & c2, float ratio) {
color output_color;
output_color.r = pow(pow(c1.r,2.2) + (pow(c2.r,2.2) - pow(c1.r,2.2)) * ratio, 1/2.2);
output_color.g = pow(pow(c1.g,2.2) + (pow(c2.g,2.2) - pow(c1.g,2.2)) * ratio, 1/2.2);
output_color.b = pow(pow(c1.b,2.2) + (pow(c2.b,2.2) - pow(c1.b,2.2)) * ratio, 1/2.2);
output_color.a = pow(pow(c1.a,2.2) + (pow(c2.a,2.2) - pow(c1.a,2.2)) * ratio, 1/2.2);
return output_color;
}
编辑:作为参考,这是与此问题相关的帖子,目的是解释“错误”在实践中的样子:https ://graphicdesign.stackexchange.com/questions/64890/in-gimp-how-做我得到的污迹模糊工具正确工作