有没有办法在 Allegro 中对位图进行部分着色?

Is there a way to partially tint bitmaps in Allegro?

我正在用 Allegro 5 编写游戏,目前正在研究我的绘图算法。经过计算,我最终得到两个 ALLEGRO_BITMAP* 对象,其中一个是我的 "scene",上面绘制了地形,另一个是阴影贴图。

场景只是在位图上绘制的游戏元素的纹理。 阴影贴图是一个位图,使用黑色表示光,使用白色表示先前渲染的阴影。​​

为了在屏幕上绘制这些位图,我使用 al_draw_scaled_bitmap(...)al_set_blender(ALLEGRO_DEST_MINUS_SRC, ALLEGRO_ONE, ALLEGRO_ONE) 从场景中减去阴影贴图的白色元素以使其可见。

我遇到的问题是,我想让阴影贴图上的所有白色像素都着色为世界色,这在之前的每一帧中都已经计算过了,而所有黑色元素都没有被修改(灰色表示部分着色)。

对于 rgb 中的红色、绿色和蓝色通道,最终颜色可以像 p.r * c.r + 1 - p.r 一样计算 p = the pixel-color on the scenec = the world-color

有什么方法可以在 Allegro 5 中实现局部着色效果(可能没有大量透支)?

我想过使用着色器,但我还没有找到用我的 ALLEGRO_BITMAP*-objects 实现这些的解决方案。

A​​llegro 的搅拌器非常简单,因此您需要一个着色器。只需编写一个着色器,然后在绘制阴影贴图时 al_use_shader 着色器,然后在完成后 al_use_shader(NULL)。着色器可以使用默认顶点源,您可以通过 al_get_default_shader_source 获得该默认顶点源。所以你只需要编写片段着色器。你的片段着色器应该有一个 uniform vec4 这是色调颜色。您还会有 x, y 浮点数,代表目的地的 x 和 y 值。它还会有一个采样器,它是场景位图(它应该是目标,因为你正在绘制它)。您将从 x、y 处的采样器中采样(x 和 y 应该从 0 到 1,您可以使用 xpixel / width(与 y 相同)获得这些),然后使用输入颜色进行计算,然后存储gl_FragColor 中的结果(本文假设您使用的是 GLSL (OpenGL)。同样的原则适用于 Direct3D。)查看 Allegro 源代码中 src/shader_source.inc 中的默认着色器以获取更多信息关于编写着色器。