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

时间:2018-01-04 08:18:47

标签: c++ bitmap allegro allegro5

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

在目标位图上绘制一个cicle和一个三角形(测试目的),如图所示,在项目显示选项上我有

al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 4, ALLEGRO_SUGGEST);
al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST);

启用抗锯齿,问题是gameBuffer上呈现的所有基元都有锯齿,但在gameBuffer外部渲染的基元非常流畅,我该如何解决呢?或者有没有办法做我正在尝试做的事情并获得在gameBuffer上绘制的平滑原语?

1 个答案:

答案 0 :(得分:2)

似乎Allegro 5有一些实验性功能可以定义这个宏(在定义任何allegro标题之前):

#define ALLEGRO_UNSTABLE

启用此宏后,我们可以创建一个位图来绘制我们想要的任何内容并使用位图执行任何操作,是的,我们可以在不启用 ALLEGRO_UNSTABLE 宏的情况下执行此操作,但是这是一个新的过程称为:

al_set_new_bitmap_samples(int numberOfSamplesDesired);

定义了我们在新创建的位图中需要多少样本,这个实现的“缺点”是它只能用于OpenGl所以...我们需要强制OpenGl(仅限Windows)才能看到这个新特性工作,我们如何将它们放在一起并在位图上绘制抗锯齿原语?

首先,我们需要定义 ALLEGRO_UNSTABLE

#define ALLEGRO_UNSTABLE

然后我们需要添加一些allegro标题(我们需要的那些)

#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个样本为例(lol),要绘制到位图,我们使用像这样的程序

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论坛上的帖子,在那里我得到了许多可爱的快板用户的帮助,这些用户在不知情的情况下教会了我很多。

my post in the Allegro forum