2016-06-14 86 views
2

我正在使用Allegro 5编写游戏,目前正在研究我的绘图算法。经过计算,我得到两个ALLEGRO_BITMAP*-对象,其中一个是我的“场景”,其上绘制地形,另一个是阴影图。有没有办法在Allegro中部分色调位图?

场景只是在位图上绘制的游戏元素的纹理。 阴影贴图是一种位图,对于先前呈现的阴影使用浅色和白色的黑色。

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

我遇到的问题是,我希望阴影贴图上的所有像素都被着色为世界颜色,这已经在以前的每一帧中计算过了,并且所有黑色元素都不会被修改(灰色意味着部分着色)。

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

有没有办法在Allegro 5(可能没有大量透支)中实现部分着色效果

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

+0

你可以将你的位图分成子位图,但我认为这不是你想要的。你能包括一些照片吗?两个将工作,你现在拥有什么,你想拥有什么。 – rlam12

回答

3

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中查看默认着色器以获取有关编写着色器的更多信息。

+0

谢谢,我会试一试! – 0liCom

+0

+1工作正常,即使我已经改变了一点,并使用了一个backbuffer位图,其中已经绘制了所有内容以计算阴影并将其绘制到显示器后台缓冲区。仍然可以改进,但它的工作原理,这是我想要的一切,性能足够好 – 0liCom