有没有办法在 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 scene
和 c = the world-color
。
有什么方法可以在 Allegro 5 中实现局部着色效果(可能没有大量透支)?
我想过使用着色器,但我还没有找到用我的 ALLEGRO_BITMAP*
-objects 实现这些的解决方案。
Allegro 的搅拌器非常简单,因此您需要一个着色器。只需编写一个着色器,然后在绘制阴影贴图时 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 中的默认着色器以获取更多信息关于编写着色器。
我正在用 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 scene
和 c = the world-color
。
有什么方法可以在 Allegro 5 中实现局部着色效果(可能没有大量透支)?
我想过使用着色器,但我还没有找到用我的 ALLEGRO_BITMAP*
-objects 实现这些的解决方案。
Allegro 的搅拌器非常简单,因此您需要一个着色器。只需编写一个着色器,然后在绘制阴影贴图时 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 中的默认着色器以获取更多信息关于编写着色器。