我正在 Allegro 5 中编写游戏,目前正在研究我的绘图算法。经过计算我最终得到两个 ALLEGRO_BITMAP*
- 对象,其中一个是我的“场景”,上面绘制了地形,另一个是阴影贴图。
场景只是位图上绘制的游戏元素的纹理。 阴影贴图是一个位图,使用黑色表示浅色,使用白色表示先前渲染的阴影。
为了在屏幕上绘制这些位图,我使用 al_draw_scaled_bitmap(...)
和al_set_blender(ALLEGRO_DEST_MINUS_SRC, ALLEGRO_ONE, ALLEGRO_ONE)
从场景中减去阴影贴图的白色元素以使它们可见。
我遇到的问题是,我希望将阴影贴图上的所有白色像素着色为世界颜色,该颜色已在之前的每一帧中计算过,并且所有黑色元素根本不被修改(灰色表示部分着色)。
最终颜色可以这样计算 p.r * c.r + 1 - p.r
与 p = the pixel-color on the scene
和c = the world-color
用于 RGB 中的红色、绿色和蓝色 channel 。
有没有办法在 Allegro 5 中实现部分着色效果(可能不会出现大量 overdraw )?
我想过使用着色器,但我还没有找到用我的 ALLEGRO_BITMAP*
实现这些的解决方案-对象。
最佳答案
Allegro 的混合器相当简单,因此您需要一个着色器。只需编写一个着色器,然后在绘制阴影贴图时 al_use_shader
着色器,然后在完成后al_use_shader(NULL)
即可。着色器可以使用通过 al_get_default_shader_source
获取的默认顶点源。所以你只需要编写片段着色器。您的片段着色器应该有一个uniform vec4
,它是色调颜色。您还会有 x, y float ,它们代表目的地的 x 和 y 值。它还会有一个采样器,它是场景位图(它应该是目标,因为您正在绘制它)。您将从采样器的 x、y 处采样(x 和 y 应该从 0 到 1,您可以通过使用 xpixel/width(与 y 相同)获得这些值),然后使用输入颜色进行计算,然后存储gl_FragColor
中的结果(本文假设您使用的是 GLSL (OpenGL)。同样的原理也适用于 Direct3D。)查看 Allegro 源代码中 src/shader_source.inc 中的默认着色器以了解更多信息有关编写着色器的信息。
关于c++ - 有没有办法在 Allegro 中对位图进行部分着色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37819428/