gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:11 24 4
gpt4 key购买 nike

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

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

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

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

最终颜色可以像 p.r * c.r + 1 - p.r 那样计算,其中 p = 场景中的像素颜色c = 世界-颜色 用于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com