Hello,
I am able to draw a triangle with OpenGL and Freeglut:
#include <GL/gl.h> /* for glClear */
#include <GL/freeglut.h> /* for glutInit */
#include <stdio.h> /* for printf */
static void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0); /* color: red */
glVertex2i(-1, -1); /* position: left/bottom */
glColor3f(0, 1, 0); /* color: green */
glVertex2i(0, 1); /* position: center/top */
glColor3f(0, 0, 1); /* color: blue */
glVertex2i(1, -1); /* position: right/bottom */
glEnd();
glFlush();
}
static void key(unsigned char key, int x, int y)
{
switch(key)
{
case 'q':
glutLeaveMainLoop();
break;
default:
break;
}
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutCreateWindow("freeglut test");
glutDisplayFunc(display);
glutKeyboardFunc(key);
printf("GL_VENDOR: %s\n", glGetString(GL_VENDOR));
printf("GL_RENDERER: %s\n", glGetString(GL_RENDERER));
printf("GL_VERSION: %s\n", glGetString(GL_VERSION));
printf("GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
glutMainLoop();
return 0;
}
Also, I am able to draw a triangle with OpenGL and SDL2:
#include <GL/gl.h> /* for glClear */
#include <SDL.h> /* for SDL_Init */
static void display(SDL_Window *window)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0); /* color: red */
glVertex2i(-1, -1); /* position: left/bottom */
glColor3f(0, 1, 0); /* color: green */
glVertex2i(0, 1); /* position: center/top */
glColor3f(0, 0, 1); /* color: blue */
glVertex2i(1, -1); /* position: right/bottom */
glEnd();
glFlush();
SDL_GL_SwapWindow(window);
}
static int key(int *loop)
{
SDL_Event event = {0};
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
case SDLK_q:
*loop = 0;
}
break;
case SDL_WINDOWEVENT:
switch(event.window.event)
{
case SDL_WINDOWEVENT_CLOSE:
*loop = 0;
}
}
}
return 0;
}
int main()
{
SDL_Window *window = NULL;
SDL_GLContext glcontext = NULL;
int loop = 1;
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) != 0)
{
SDL_Log("Unable to initialize SDL: %s", SDL_GetError());
return 1;
}
window = SDL_CreateWindow("sdl2 test", 0, 0, 300, 300, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
glcontext = SDL_GL_CreateContext(window);
printf("GL_VENDOR: %s\n", glGetString(GL_VENDOR));
printf("GL_RENDERER: %s\n", glGetString(GL_RENDERER));
printf("GL_VERSION: %s\n", glGetString(GL_VERSION));
printf("GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
while(loop)
{
key(&loop);
display(window);
}
SDL_GL_DeleteContext(glcontext);
SDL_Quit();
return 0;
}
The triangle is shown:
[new users can’t upload more than one image so you can’t see it]
However, I am unable to draw a triangle with OpenGL and Gtk3:
#include <gtk/gtk.h>
#include <GL/gl.h>
static gboolean on_realize(GtkGLArea *area, GdkGLContext *context)
{
printf("on_realize: start\n");
gtk_gl_area_make_current(GTK_GL_AREA(area));
if(gtk_gl_area_get_error(area) != NULL)
{
printf("on_realize: error: gtk_gl_area_make_current\n");
return FALSE;
}
printf("GL_VENDOR: %s\n", glGetString(GL_VENDOR));
printf("GL_RENDERER: %s\n", glGetString(GL_RENDERER));
printf("GL_VERSION: %s\n", glGetString(GL_VERSION));
printf("GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
printf("on_realize: end\n");
return TRUE;
}
static gboolean on_render(GtkGLArea *area, GdkGLContext *context)
{
printf("on_render: start\n");
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0); // color: red
glVertex2i(-1, -1); // position: left/bottom
glColor3f(0, 1, 0); // color: green
glVertex2i(0, 1); // position: center/top
glColor3f(0, 0, 1); // color: blue
glVertex2i(1, -1); // position: right/bottom
glEnd();
glFlush();
printf("on_render: end\n");
return TRUE;
}
int main(int argc, char **argv)
{
// declare
GtkWidget *window = NULL;
GtkWidget *area = NULL;
// init
gtk_init(&argc, &argv);
// new
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
area = gtk_gl_area_new();
// connect
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(area, "realize", G_CALLBACK(on_realize), NULL);
g_signal_connect(area, "render", G_CALLBACK(on_render), NULL);
// set
gtk_window_set_title(GTK_WINDOW(window), "Window");
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
// add
gtk_container_add(GTK_CONTAINER(window), area);
// show
gtk_widget_show_all(window);
// loop
gtk_main();
return 0;
}
The triangle is not shown and I only see the black color:
[new users can’t upload more than one image so you can’t see it]
As you can see, the code is more or less the same with Freeglut, SDL2 and Gtk3 so I am not sure why it is not working with Gtk3.
Am I missing something please?
Thank you.
Best regards.