I wanted to make a small OpenGL animation in GTK4. I have the following code for it, but no triangle is drawn.
The only thing that seems to work is glClearColor. The background flickers red as expected.
Any idea why it doesn’t work?
// $ gcc -o main main.c `pkg-config --cflags --libs gtk4` -lGL
#include <gtk/gtk.h>
#include <GL/gl.h>
static gboolean on_tick(GtkWidget *widget, GdkFrameClock *frame_clock, gpointer user_data) {
gtk_gl_area_queue_render(GTK_GL_AREA(widget));
return G_SOURCE_CONTINUE;
}
static void realize(GtkGLArea *area, gpointer user_data) {
gtk_gl_area_make_current(area);
if (gtk_gl_area_get_error(area) != NULL) {
return;
}
gtk_widget_add_tick_callback(GTK_WIDGET(area), on_tick, NULL, NULL);
}
static gboolean render(GtkGLArea *area, GdkGLContext *context) {
float r = (double)rand() / RAND_MAX;
glClearColor(r, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
// Zeichnen Sie hier Ihr Objekt
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex2f(-0.5, -0.5);
glColor3f(0.0, 1.0, 0.0);
glVertex2f(0.5, -0.5);
glColor3f(0.0, 0.0, 1.0);
glVertex2f(0.0, 0.5);
glEnd();
glFlush();
return TRUE;
}
static void activate(GtkApplication *app, gpointer user_data) {
GtkWidget *window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "OpenGL mit GTK4");
gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
GtkWidget *gl_area = gtk_gl_area_new();
gtk_widget_set_hexpand(gl_area, TRUE);
gtk_widget_set_vexpand(gl_area, TRUE);
gtk_window_set_child(GTK_WINDOW(window), gl_area);
g_signal_connect(gl_area, "render", G_CALLBACK(render), NULL);
g_signal_connect(gl_area, "realize", G_CALLBACK(realize), NULL);
gtk_window_present(GTK_WINDOW(window));
}
int main(int argc, char **argv) {
GtkApplication *app = gtk_application_new("org.example.opengl", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
int status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
```**strong text**