我正在使用 C++ 和 Allegro 5 做一个小项目,我的问题是
有没有办法使用 Allegro 5 将抗锯齿图元绘制到位图? 我的意思是我正在使用这个功能
void draw_to_gameBuffer(ALLEGRO_BITMAP *&gameBuffer, ALLEGRO_DISPLAY *&display)
{
static float x = 0;
al_set_target_bitmap(gameBuffer);
al_draw_filled_rectangle(0,0, 350, 622, al_map_rgb(130, 80, 120));
al_draw_filled_circle(x, 200, 100, al_map_rgb(12, 138, 129));
al_draw_filled_triangle(0, 0, 100, 0, 50, 100, al_map_rgb(12, 138, 129));
x += 2.7;
if(x > 350 + 100)
x = -250;
al_set_target_backbuffer(display);
}
如图所示在目标位图上绘制圆环和三角形(测试目的),在我的项目显示选项上
al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 4, ALLEGRO_SUGGEST);
al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST);
要启用抗锯齿,问题是在 gameBuffer 上渲染的所有图元都有锯齿,但在 gameBuffer 外渲染的图元非常平滑,我该如何解决?或者有没有办法做我想做的事情并在 gameBuffer 上绘制平滑的图元?
最佳答案
似乎 Allegro 5 具有一些实验性功能,可以在定义此宏时启用(在定义任何 allegro header 之前):
#define ALLEGRO_UNSTABLE
启用这个宏后,我们可以创建一个位图来绘制任何我们想要的东西,并用位图做任何我们想做的事情,是的,我们可以在不启用 ALLEGRO_UNSTABLE 宏的情况下做到这一点,但是有这个新程序称为:
al_set_new_bitmap_samples(int numberOfSamplesDesired);
定义了我们希望在新创建的位图中有多少样本,此实现的“缺点”是它只能与 OpenGl 一起使用,所以...我们需要强制 OpenGl(仅限 Windows)才能看到此新功能工作,我们如何将它们放在一起并在位图上绘制抗锯齿图元?
首先,我们需要定义ALLEGRO_UNSTABLE宏
#define ALLEGRO_UNSTABLE
然后我们需要添加一些快板标题(我们需要的)
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
之后我们需要定义一个位图
ALLEGRO_BITMAP *buffer = nullptr;
现在我们启用 OpenGl 和我们想要的标志以及显示选项
al_set_new_display_flags(ALLEGRO_WINDOWED | ALLEGRO_RESIZABLE | ALLEGRO_OPENGL);
al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 2, ALLEGRO_SUGGEST); //antialias stuff
al_set_new_display_option(ALLEGRO_SAMPLES, 4, ALLEGRO_SUGGEST); //antialias stuff
为了创建我们的位图,我们首先调用实验程序然后创建我们的位图
al_set_new_bitmap_samples(4);
buffer = al_create_bitmap(bufferWidth, bufferHeight);
以 4 个样本为例(笑),要绘制到位图,我们使用这样的过程
void draw_to_buffer(ALLEGRO_BITMAP *&buffer, ALLEGRO_DISPLAY *&display)
{
al_set_target_bitmap(buffer);
al_clear_to_color(al_map_rgb(0, 0, 0));
//anything you want to draw to the bitmap
al_set_target_backbuffer(display);
}
现在我们只需要按照通常在屏幕上绘制位图的方式来绘制位图
al_draw_bitmap(buffer, 0, 0, 0);
差不多就这些了,如果您对此实现有任何问题或疑问,您可以查看我在 Allegro 论坛中的帖子,在那里我得到了许多可爱的 allegro 用户的帮助,他们在不知不觉中教会了我很多东西。
关于c++ - 将抗锯齿图元绘制到位图 Allegro 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48091250/