我在C中迈出了第一步,并试图制作一个渐变颜色函数,它在屏幕上(垂直)绘制了一堆矩形。这是到目前为止的代码:
void draw_gradient(uint32_t start_color, uint32_t end_color) {
int steps = 8;
int draw_height = window_height / 8;
//Change this value inside the loop to write different color
uint32_t loop_color = start_color;
for (int i = 0; i < steps; i++) {
draw_rect(0, i * draw_height, window_width, draw_height, loop_color);
}
}
现在忽略end_color
,我想尝试传递一个简单的红色,如0xFFFF0000
(ARGB)..然后采取红色的'FF',并将其转换为整数或减少它使用loop_color
变量。
我不知道如何从十六进制中获得红色值,然后将其作为一个数字,然后将其写回十六进制…任何想法?
因此,在8步中,代码应该以十六进制形式从FF
到00
或从255
到0
的整数形式进行。
正如你所说的,你的颜色是RGB格式的。此计算假设垂直梯度-即从上到下(线性线)。
步骤如下:
- 获取要绘制的线条数;这是你的矩形高度
- 从开始和结束颜色中获取A, R, G, B颜色组件
uint8_t start_a = start_color >> 24;
uint8_t start_r = start_color >> 16;
uint8_t start_g = start_color >> 8;
uint8_t start_b = start_color >> 0;
uint8_t end_a = end_color >> 24;
uint8_t end_r = end_color >> 16;
uint8_t end_g = end_color >> 8;
uint8_t end_b = end_color >> 0;
- 计算每个组件的步长
float step_a = (float)(end_a - start_a) / (float)height;
float step_r = (float)(end_r - start_r) / (float)height;
float step_g = (float)(end_g - start_g) / (float)height;
float step_b = (float)(end_b - start_b) / (float)height;
- 运行for循环并为每种颜色应用不同的步骤
for (int i = 0; i < height; ++i) {
uint32_t color = 0 |
((start_a + i * step_a) & 0xFF) << 24 |
((start_r + i * step_r) & 0xFF) << 16 |
((start_g + i * step_g) & 0xFF) << 8 |
((start_b + i * step_b) & 0xFF) << 0
draw_horizontal_line(i, color);
}
对于step_x
最好使用float,并在每次迭代中使用乘法/加法。否则,使用整数四舍五入时,您可能永远不会增加number,因为它总是被四舍五入。