Отрисовка сглаженных примитивов в растровое изображение 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, совершенно гладкие, как я могу это решить? Или есть способ сделать то, что я пытаюсь сделать, и получить гладкие примитивы, отрисованные в игровом буфере?


person Amaury Permer    schedule 04.01.2018    source источник


Ответы (1)


Похоже, что в 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 образца в качестве примера (смеется), для рисования в растровое изображение мы используем такую ​​​​процедуру

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, которые многому меня научили, не зная об этом.

моя запись на форуме Allegro

person Amaury Permer    schedule 16.01.2018
comment
В большинстве случаев вы можете получить мультисэмплинг на заднем буфере, просто включив ALLEGRO_SAMPLE_BUFFERS. - person BugSquasher; 10.04.2019