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

标签 c++ colors allegro allegro5

我正在 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.rp = the pixel-color on the scenec = 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/

相关文章:

c++ - 使 if 条件在其为真时返回或 while 在其为真时返回

r - plotly - 在哪里可以找到plotly包中使用的默认调色板

python - 在颜色图中插入标记线

c++ - 使用 Allegro 库播放任何类型的视频文件的典型示例是什么?

C++快板: Program Crashes when I move the window

c++ - Allegro 5 在错误的时间绘图

C++ 未修改的 bool 数组更改 (OS X)

c# - 通过Mono将数组从C++传递到C#

c++ - 一元负重载 : member or non-member?

java - 绿色像素的颜色无效