将抗锯齿图元绘制到位图 Allegro 5

Drawing antialiased primitives to bitmap Allegro 5

我正在使用 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);

定义了我们在新创建的位图中需要多少样本,"the downside" 这个实现的原因是它只能与 OpenGl 一起使用,所以......我们需要强制 OpenGl(Windows仅) 以查看此新功能的工作情况,以及我们如何将其组合在一起并在位图上绘制抗锯齿图元?

首先,我们需要定义ALLEGRO_UNSTABLE

#define ALLEGRO_UNSTABLE

然后我们需要添加一些快板 headers(我们需要的)

#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 论坛中查看我的 post,在那里我得到了许多可爱的 allegro 用户的帮助,他们教会了我很多东西不知不觉

my post in the Allegro forum