This is definitely possible to make work - I'm using Allegro for such stuff myself, and there it's as easy as first drawing the OpenGL, then restoring your transforms and projection_transforms and render_state, and then you can simply draw using allegros primitives or whatever.
An example (minorly edited version of allegro example ex_opengl - https://github.com/liballeg/allegro5/bl ... x_opengl.c ), I have a al_draw_rectangle close to the bottom of the main loop that is drawn over the openGL fun.
build with
An example (minorly edited version of allegro example ex_opengl - https://github.com/liballeg/allegro5/bl ... x_opengl.c ), I have a al_draw_rectangle close to the bottom of the main loop that is drawn over the openGL fun.
build with
Code:
gcc test.c -o test `pkg-config --cflags --libs gl allegro-5 allegro_primitives-5 allegro_main-5 ` -lm
Code:
#define ALLEGRO_UNSTABLE#include <stdio.h>#include <math.h>#include <allegro5/allegro.h>#include <allegro5/allegro_opengl.h>#include <allegro5/allegro_primitives.h>#include <stdio.h>#include <stdarg.h>#ifdef ALLEGRO_ANDROID #include "allegro5/allegro_android.h"#endifvoid init_platform_specific(void);void abort_example(char const *format, ...);void open_log(void);void open_log_monospace(void);void close_log(bool wait_for_user);void log_printf(char const *format, ...);void init_platform_specific(void){#ifdef ALLEGRO_ANDROID al_install_touch_input(); al_android_set_apk_file_interface();#endif}#ifdef ALLEGRO_POPUP_EXAMPLES#include "allegro5/allegro_native_dialog.h"ALLEGRO_TEXTLOG *textlog = NULL;void abort_example(char const *format, ...){ char str[1024]; va_list args; ALLEGRO_DISPLAY *display; va_start(args, format); vsnprintf(str, sizeof str, format, args); va_end(args); if (al_init_native_dialog_addon()) { display = al_is_system_installed() ? al_get_current_display() : NULL; al_show_native_message_box(display, "Error", "Cannot run example", str, NULL, 0); } else { fprintf(stderr, "%s", str); } exit(1);}void open_log(void){ if (al_init_native_dialog_addon()) { textlog = al_open_native_text_log("Log", 0); }}void open_log_monospace(void){ if (al_init_native_dialog_addon()) { textlog = al_open_native_text_log("Log", ALLEGRO_TEXTLOG_MONOSPACE); }}void close_log(bool wait_for_user){ if (textlog && wait_for_user) { ALLEGRO_EVENT_QUEUE *queue = al_create_event_queue(); al_register_event_source(queue, al_get_native_text_log_event_source( textlog)); al_wait_for_event(queue, NULL); al_destroy_event_queue(queue); } al_close_native_text_log(textlog); textlog = NULL;}void log_printf(char const *format, ...){ char str[1024]; va_list args; va_start(args, format); vsnprintf(str, sizeof str, format, args); va_end(args); al_append_native_text_log(textlog, "%s", str);}#elsevoid abort_example(char const *format, ...){ va_list args; va_start(args, format); vfprintf(stderr, format, args); va_end(args); exit(1);}void open_log(void){}void open_log_monospace(void){}void close_log(bool wait_for_user){ (void)wait_for_user;}void log_printf(char const *format, ...){ va_list args; va_start(args, format); #ifdef ALLEGRO_ANDROID char x[1024]; vsnprintf(x, sizeof x, format, args); ALLEGRO_TRACE_CHANNEL_LEVEL("log", 1)("%s", x); #else vprintf(format, args); #endif va_end(args);}#endif/* vim: set sts=3 sw=3 et: *//* Simple example showing how to use an extension. It draws a yellow triangle * on red background onto a texture, then draws a quad with that texture. */GLuint tex, fbo;bool no_fbo = false;static void draw_opengl(void){ double secs = al_get_time(); ALLEGRO_TRANSFORM projection = *al_get_current_projection_transform(); ALLEGRO_TRANSFORM t; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* Let's create a texture. It will only be visible if we cannot draw over * it with the framebuffer extension. */ if (!tex) { unsigned char *pixels = malloc(256 * 256 * 4); int x, y; for (y = 0; y < 256; y++) { for (x = 0; x < 256; x++) { unsigned char r = x, g = y, b = 0, a = 255; pixels[y * 256 * 4 + x * 4 + 0] = r; pixels[y * 256 * 4 + x * 4 + 1] = g; pixels[y * 256 * 4 + x * 4 + 2] = b; pixels[y * 256 * 4 + x * 4 + 3] = a; } } glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, pixels); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); free(pixels); } /* Let's create a framebuffer object. */ if (!fbo && !no_fbo) { /* Did Allegro discover the OpenGL extension for us? */ if (al_get_opengl_extension_list()->ALLEGRO_GL_EXT_framebuffer_object) { /* If yes, then it also filled in the function pointer. How nice. */ glGenFramebuffersEXT(1, &fbo); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); /* Attach the framebuffer object to our texture. */ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0); if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { no_fbo = true; } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } else { /* We are screwed, the extension is not available. */ no_fbo = true; } } /* Draw a yellow triangle on red background to the framebuffer object. */ if (fbo && !no_fbo) { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); glPushAttrib(GL_VIEWPORT_BIT | GL_TRANSFORM_BIT); glViewport(0, 0, 256, 256); glClearColor(1, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0, 256, 256, 0, -1, 1); glDisable(GL_TEXTURE_2D); glColor3f(1, 1, 0); glTranslatef(128, 128 + sin(secs * ALLEGRO_PI * 2 * 2) * 20, 0); glBegin(GL_TRIANGLES); glVertex2f(0, -100); glVertex2f(100, 0); glVertex2f(-100, 0); glEnd(); glPopMatrix(); glPopAttrib(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } /* Draw a quad with our texture. */ glClearColor(0, 0, 1, 1); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslatef(320, 240, 0); glRotatef(secs * 360 / 4, 0, 0, 1); glColor3f(1, 1, 1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, tex); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex2f(-100, -100); glTexCoord2f(1, 0); glVertex2f(+100, -100); glTexCoord2f(1, 1); glVertex2f(+100, +100); glTexCoord2f(0, 1); glVertex2f(-100, +100); glEnd(); /* Restore projection. */ al_identity_transform(&t); al_use_transform(&t); al_use_projection_transform(&projection); al_set_render_state(ALLEGRO_DEPTH_TEST, 0);}int main(int argc, char **argv){ ALLEGRO_DISPLAY *display; ALLEGRO_EVENT_QUEUE *queue; ALLEGRO_EVENT event; int frames = 0; double start; (void)argc; (void)argv; if (!al_init()) { abort_example("Could not init Allegro.\n"); } open_log(); al_install_keyboard(); al_set_new_display_flags(ALLEGRO_OPENGL); display = al_create_display(640, 480); if (!display) { abort_example("Could not create display.\n"); } queue = al_create_event_queue(); al_register_event_source(queue, al_get_keyboard_event_source()); al_register_event_source(queue, al_get_display_event_source(display)); start = al_get_time(); while (true) { /* Check for ESC key or close button event and quit in either case. */ if (!al_is_event_queue_empty(queue)) { while (al_get_next_event(queue, &event)) { switch (event.type) { case ALLEGRO_EVENT_DISPLAY_CLOSE: goto done; case ALLEGRO_EVENT_KEY_DOWN: if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) goto done; break; } } } draw_opengl(); al_draw_rectangle(20, 20, 300, 200, al_map_rgba_f(0.5, 0, 0, 1), 1); al_flip_display(); frames++; }done: log_printf("%.1f FPS\n", frames / (al_get_time() - start)); al_destroy_event_queue(queue); al_destroy_display(display); close_log(true); return 0;}
Statistics: Posted by gusnan — 2024-04-14 12:20