将抗锯齿图元绘制到位图 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 用户的帮助,他们教会了我很多东西不知不觉
我正在使用 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 用户的帮助,他们教会了我很多东西不知不觉