我正在使用Allegro 5编写游戏,我正在研究绘图算法。经过计算后,我最终得到了两个ALLEGRO_BITMAP*
- 对象,其中一个是我的“场景”,其上绘制了地形,另一个是阴影贴图。
场景只是在位图上绘制的游戏元素的纹理。 阴影贴图是一个位图,使用黑色颜色表示之前渲染的阴影的浅色和白色。
为了在屏幕上绘制这些位图,我使用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*
- 对象实现这些的解决方案。
答案 0 :(得分: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中的默认着色器,了解有关写入的更多信息着色器。