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

标签 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);
}

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

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 用户的帮助,他们在不知不觉中教会了我很多东西。

my post in the Allegro forum

关于c++ - 将抗锯齿图元绘制到位图 Allegro 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48091250/

相关文章:

c++ - 如何将整数数组从 Tcl 传递到 C++?

java - 如何从 Android 的内部存储中获取图像数组

c++ - 调用的函数清除前一个函数的更改

c++ - _main 未在 Mac OS X 10.11 上用 c++ 定义

类构造中的 C++ 内存泄漏

c++ - 在准备语句中使用多个 '?' 参数

c++ - 如何优雅地唤醒或终止 sleep 中的 std::thread?

Android:如何使用大量的Bitmaps?

Android ImageView 未更新

linux - 在 Linux Mint 17 x86_64 : skipping incompatible libraries 中编译 Open Surge 的问题