|
Allegro + OpenGL |
Luiji99
Member #12,254
September 2010
|
Hey guys, I'm working on a 3-D OpenGL game and am using Allegro. However, I have no idea how to do this (with Allegro, that is, I understand OpenGL). Here's some code: 1#include <allegro5/allegro.h>
2#include <allegro5/allegro_opengl.h>
3
4int
5main (void)
6{
7 al_init ();
8
9 al_set_new_display_flags (ALLEGRO_OPENGL);
10
11 ALLEGRO_DISPLAY *display = al_create_display (800, 600);
12 al_set_current_opengl_context (display);
13
14 ALLEGRO_EVENT_QUEUE *event_queue = al_create_event_queue ();
15 al_register_event_source (event_queue, al_get_display_event_source (display));
16
17 glEnable (GL_DEPTH_TEST);
18 glViewport (0, 0, 800, 600);
19
20 for (;;)
21 {
22 ALLEGRO_EVENT event;
23 while (al_get_next_event (event_queue, &event))
24 if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
25 return EXIT_SUCCESS;
26
27 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
28
29 glBegin (GL_POLYGON);
30 glColor3f (1.0, 1.0, 1.0);
31 glVertex3f (0.5, -0.5, 0.5);
32 glVertex3f (0.5, 0.5, 0.5);
33 glVertex3f (-0.5, 0.5, 0.5);
34 glVertex3f (-0.5, -0.5, 0.5);
35 glEnd ();
36
37 glBegin (GL_POLYGON);
38 glColor3f (1.0, 0.0, 1.0);
39 glVertex3f (0.5, -0.5, -0.5);
40 glVertex3f (0.5, 0.5, -0.5);
41 glVertex3f (0.5, 0.5, 0.5);
42 glVertex3f (0.5, -0.5, 0.5);
43 glEnd ();
44
45 glBegin (GL_POLYGON);
46 glColor3f (0.0, 1.0, 0.0);
47 glVertex3f (-0.5, -0.5, 0.5);
48 glVertex3f (-0.5, 0.5, 0.5);
49 glVertex3f (-0.5, 0.5, -0.5);
50 glVertex3f (-0.5, -0.5, -0.5);
51 glEnd ();
52
53 glBegin (GL_POLYGON);
54 glColor3f (0.0, 0.0, 1.0);
55 glVertex3f (0.5, 0.5, 0.5);
56 glVertex3f (0.5, 0.5, -0.5);
57 glVertex3f (-0.5, 0.5, -0.5);
58 glVertex3f (-0.5, 0.5, 0.5);
59 glEnd ();
60
61 glBegin (GL_POLYGON);
62 glColor3f (1.0, 0.0, 0.0);
63 glVertex3f (0.5, -0.5, -0.5);
64 glVertex3f (0.5, -0.5, 0.5);
65 glVertex3f (-0.5, -0.5, 0.5);
66 glVertex3f (-0.5, -0.5, -0.5);
67 glEnd ();
68
69 glFlush ();
70 al_flip_display ();
71 }
72}
73
74/* vim:set ts=8 sts=2 sw=2 noet: */
Pardon how hideous it is, lacking any form of error checking and all. I'm just trying to figure out how Allegro and OpenGL work together. I'm sure a few of those calls aren't even necessary, but I've been trying everything to get something other than a blank, black screen. Any help would be greatly, GREATLY appreciated. Programming should be fun. That's why I hate Java. |
jmasterx
Member #11,410
October 2009
|
One thing that comes to mind, I think Allegro does not set a depth buffer, check this out to set one: ALLEGRO_DEPTH_SIZE How many depth buffer (z-buffer) bits to use. You might also want to check out: Agui GUI API -> https://github.com/jmasterx/Agui |
Luiji99
Member #12,254
September 2010
|
Hm, I've modified the code to set the ALLEGRO_DEPTH_SIZE to 30 (sort of a random number, I figured it'd be big enough to play with later): 1#include <err.h>
2
3#include <allegro5/allegro.h>
4#include <allegro5/allegro_opengl.h>
5
6int
7main (void)
8{
9 if (!al_init ())
10 errx (1, "failed to initialize allegro");
11
12 al_set_new_display_flags (ALLEGRO_OPENGL);
13 al_set_new_display_option (ALLEGRO_DEPTH_SIZE, 30, ALLEGRO_REQUIRE);
14
15 ALLEGRO_DISPLAY *display = al_create_display (800, 600);
16 if (!display)
17 errx (1, "failed to create display");
18
19 al_set_current_opengl_context (display);
20
21 ALLEGRO_EVENT_QUEUE *event_queue = al_create_event_queue ();
22 if (!event_queue)
23 errx (1, "failed to create event queue");
24
25 al_register_event_source (event_queue, al_get_display_event_source (display));
26
27 glEnable (GL_DEPTH_TEST);
28 glViewport (0, 0, 800, 600);
29
30 for (;;)
31 {
32 ALLEGRO_EVENT event;
33 while (al_get_next_event (event_queue, &event))
34 if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
35 {
36 al_destroy_event_queue (event_queue);
37 return EXIT_SUCCESS;
38 }
39
40 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
41
42 glBegin (GL_POLYGON);
43 glColor3f (1.0, 1.0, 1.0);
44 glVertex3f (0.5, -0.5, 0.5);
45 glVertex3f (0.5, 0.5, 0.5);
46 glVertex3f (-0.5, 0.5, 0.5);
47 glVertex3f (-0.5, -0.5, 0.5);
48 glEnd ();
49
50 glBegin (GL_POLYGON);
51 glColor3f (1.0, 0.0, 1.0);
52 glVertex3f (0.5, -0.5, -0.5);
53 glVertex3f (0.5, 0.5, -0.5);
54 glVertex3f (0.5, 0.5, 0.5);
55 glVertex3f (0.5, -0.5, 0.5);
56 glEnd ();
57
58 glBegin (GL_POLYGON);
59 glColor3f (0.0, 1.0, 0.0);
60 glVertex3f (-0.5, -0.5, 0.5);
61 glVertex3f (-0.5, 0.5, 0.5);
62 glVertex3f (-0.5, 0.5, -0.5);
63 glVertex3f (-0.5, -0.5, -0.5);
64 glEnd ();
65
66 glBegin (GL_POLYGON);
67 glColor3f (0.0, 0.0, 1.0);
68 glVertex3f (0.5, 0.5, 0.5);
69 glVertex3f (0.5, 0.5, -0.5);
70 glVertex3f (-0.5, 0.5, -0.5);
71 glVertex3f (-0.5, 0.5, 0.5);
72 glEnd ();
73
74 glBegin (GL_POLYGON);
75 glColor3f (1.0, 0.0, 0.0);
76 glVertex3f (0.5, -0.5, -0.5);
77 glVertex3f (0.5, -0.5, 0.5);
78 glVertex3f (-0.5, -0.5, 0.5);
79 glVertex3f (-0.5, -0.5, -0.5);
80 glEnd ();
81
82 glFlush ();
83 al_flip_display ();
84 }
85}
86
87/* vim:set ts=8 sts=2 sw=2 noet: */
However, now my program aborts with "cube: failed to create display". It seems that Allegro can't set the z-depth. I don't think it's anything wrong with my hardware/drivers, though, since GlxGears runs perfectly and I'm pretty sure that it uses a z-buffer, too. Thanks, Programming should be fun. That's why I hate Java. |
Arthur Kalliokoski
Second in Command
February 2005
|
I'm pretty sure z buffer sizes are limited to 16, 24 or 32 bits, since it's bits per element, it might have been better if they'd specified how many bytes per element, not bits. They all watch too much MSNBC... they get ideas. |
Luiji99
Member #12,254
September 2010
|
Ah, I totally misunderstood what that field did. Anyway... 1#include <err.h>
2
3#include <allegro5/allegro.h>
4#include <allegro5/allegro_opengl.h>
5
6int
7main (void)
8{
9 if (!al_init ())
10 errx (1, "failed to initialize allegro");
11
12 al_set_new_display_flags (ALLEGRO_OPENGL);
13 al_set_new_display_option (ALLEGRO_DEPTH_SIZE, 16, ALLEGRO_REQUIRE);
14
15 ALLEGRO_DISPLAY *display = al_create_display (300, 300);
16 if (!display)
17 errx (1, "failed to create display");
18
19 ALLEGRO_EVENT_QUEUE *event_queue = al_create_event_queue ();
20 if (!event_queue)
21 errx (1, "failed to create event queue");
22
23 al_register_event_source (event_queue, al_get_display_event_source (display));
24
25 glEnable (GL_DEPTH_TEST);
26 glClearColor (0.5, 0.5, 0.5, 1.0);
27
28 for (;;)
29 {
30 ALLEGRO_EVENT event;
31 while (al_get_next_event (event_queue, &event))
32 if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
33 {
34 al_destroy_event_queue (event_queue);
35 return EXIT_SUCCESS;
36 }
37
38 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
39 glLoadIdentity ();
40
41 glRotatef (45, 1, 0, 0);
42 glRotatef (45, 0, 1, 0);
43
44 glBegin(GL_POLYGON);
45 glColor3f(1, 0, 0 ); glVertex3f( 0.5, -0.5, -0.5);
46 glColor3f(0, 1, 0 ); glVertex3f( 0.5, 0.5, -0.5);
47 glColor3f(0, 0, 1 ); glVertex3f(-0.5, 0.5, -0.5);
48 glColor3f(1, 0, 1 ); glVertex3f(-0.5, -0.5, -0.5);
49 glEnd();
50
51 glBegin (GL_POLYGON);
52 glColor3f (1, 1, 1);
53 glVertex3f (0.5, -0.5, 0.5);
54 glVertex3f (0.5, 0.5, 0.5);
55 glVertex3f (-0.5, 0.5, 0.5);
56 glVertex3f (-0.5, -0.5, 0.5);
57 glEnd ();
58
59 glBegin (GL_POLYGON);
60 glColor3f (1, 0, 1);
61 glVertex3f (0.5, -0.5, -0.5);
62 glVertex3f (0.5, 0.5, -0.5);
63 glVertex3f (0.5, 0.5, 0.5);
64 glVertex3f (0.5, -0.5, 0.5);
65 glEnd ();
66
67 glBegin (GL_POLYGON);
68 glColor3f (0, 1, 0);
69 glVertex3f (-0.5, -0.5, 0.5);
70 glVertex3f (-0.5, 0.5, 0.5);
71 glVertex3f (-0.5, 0.5, -0.5);
72 glVertex3f (-0.5, -0.5, -0.5);
73 glEnd ();
74
75 glBegin (GL_POLYGON);
76 glColor3f (0, 0, 1);
77 glVertex3f (0.5, 0.5, 0.5);
78 glVertex3f (0.5, 0.5, -0.5);
79 glVertex3f (-0.5, 0.5, -0.5);
80 glVertex3f (-0.5, 0.5, 0.5);
81 glEnd ();
82
83 glBegin (GL_POLYGON);
84 glColor3f (1, 0, 0);
85 glVertex3f (0.5, -0.5, -0.5);
86 glVertex3f (0.5, -0.5, 0.5);
87 glVertex3f (-0.5, -0.5, 0.5);
88 glVertex3f (-0.5, -0.5, -0.5);
89 glEnd ();
90
91 glFlush ();
92 al_flip_display ();
93 }
94}
95
96/* vim:set ts=8 sts=2 sw=2 noet: */
Played around with it a bit more. The display creates now, but all I see is grey (I set the clear color just to make sure that the OpenGL calls were working). This code is essentially a GLUT equivalent that I'm basing this off of, and it works perfectly. It seems to be a problem with Allegro, or at least a difference in what can be assumed from each library: 1#include <GL/glut.h>
2
3static void
4display ()
5{
6 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
7
8 glLoadIdentity ();
9
10 glRotatef (45, 1, 0, 0);
11 glRotatef (45, 0, 1, 0);
12
13 glBegin (GL_POLYGON);
14 glColor3f (1, 0, 0);
15 glVertex3f (0.5, -0.5, -0.5);
16 glColor3f (0, 1, 0);
17 glVertex3f (0.5, 0.5, -0.5);
18 glColor3f (0, 0, 1);
19 glVertex3f (-0.5, 0.5, -0.5);
20 glColor3f (1, 0, 1);
21 glVertex3f (-0.5, -0.5, -0.5);
22 glEnd ();
23
24 glBegin (GL_POLYGON);
25 glColor3f (1, 1, 1);
26 glVertex3f (0.5, -0.5, 0.5);
27 glVertex3f (0.5, 0.5, 0.5);
28 glVertex3f (-0.5, 0.5, 0.5);
29 glVertex3f (-0.5, -0.5, 0.5);
30 glEnd ();
31
32 glBegin (GL_POLYGON);
33 glColor3f (1, 0, 1);
34 glVertex3f (0.5, -0.5, -0.5);
35 glVertex3f (0.5, 0.5, -0.5);
36 glVertex3f (0.5, 0.5, 0.5);
37 glVertex3f (0.5, -0.5, 0.5);
38 glEnd ();
39
40 glBegin (GL_POLYGON);
41 glColor3f (0, 1, 0);
42 glVertex3f (-0.5, -0.5, 0.5);
43 glVertex3f (-0.5, 0.5, 0.5);
44 glVertex3f (-0.5, 0.5, -0.5);
45 glVertex3f (-0.5, -0.5, -0.5);
46 glEnd ();
47
48 glBegin (GL_POLYGON);
49 glColor3f (0, 0, 1);
50 glVertex3f (0.5, 0.5, 0.5);
51 glVertex3f (0.5, 0.5, -0.5);
52 glVertex3f (-0.5, 0.5, -0.5);
53 glVertex3f (-0.5, 0.5, 0.5);
54 glEnd ();
55
56 glBegin (GL_POLYGON);
57 glColor3f (1, 0, 0);
58 glVertex3f (0.5, -0.5, -0.5);
59 glVertex3f (0.5, -0.5, 0.5);
60 glVertex3f (-0.5, -0.5, 0.5);
61 glVertex3f (-0.5, -0.5, -0.5);
62 glEnd ();
63
64 glFlush ();
65 glutSwapBuffers ();
66}
67
68int
69main (int argc, char *argv[])
70{
71 glutInit (&argc, argv);
72 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
73 glutCreateWindow (argv[0]);
74
75 glEnable (GL_DEPTH_TEST);
76 glClearColor (0.5, 0.5, 0.5, 1.0);
77
78 glutDisplayFunc (display);
79
80 glutMainLoop ();
81
82 return 0;
83}
==================== EDIT ==================== I did it! All I had to do was add "glMatrixMode (GL_PROJECTION)", which apparently GLUT automatically does and Allegro does not. It's kind of an odd difference, but I have a cube and that's satisfying!! Thanks for the help, Programming should be fun. That's why I hate Java. |
Thomas Fjellstrom
Member #476
June 2000
|
Allegro by default sets up a 2d "Allegro" matrix, so when you draw with allegro functions, things appear to work with a plain old 2d coordinate space with the top left being 0,0. -- |
Luiji99
Member #12,254
September 2010
|
Ah. Just wondering, might it be useful to include something like this in Allegro? I can clean this example up a bit...the resulting cube is pretty cool. It also takes advantage of ALLEGRO_TIMER, which is nice. Thanks, Programming should be fun. That's why I hate Java. |
Thomas Fjellstrom
Member #476
June 2000
|
If its showing stuff that existing examples don't show, I don't see why not. -- |
Luiji99
Member #12,254
September 2010
|
Unlike the current OpenGL example, this one actually renders 3-D. I don't know what the Direct3D example shows... I think it's also just pretty fun to run in the background to make you look cool in front of people looking over your shoulder. =) 1#include <allegro5/allegro.h>
2#include <allegro5/allegro_opengl.h>
3
4#include "common.c"
5
6int main(void)
7{
8 ALLEGRO_DISPLAY *display;
9 ALLEGRO_TIMER *timer;
10 ALLEGRO_EVENT_QUEUE *event_queue;
11 int rotation = 0;
12
13 if (!al_init())
14 abort_example("failed to initialize allegro");
15
16 al_set_new_display_flags(ALLEGRO_OPENGL);
17 al_set_new_display_option(ALLEGRO_DEPTH_SIZE, 16, ALLEGRO_REQUIRE);
18
19 display = al_create_display(600, 600);
20 if (!display)
21 abort_example("failed to create display");
22
23 timer = al_create_timer(ALLEGRO_BPS_TO_SECS(180));
24 if (!timer)
25 abort_example("failed to create timer");
26
27 event_queue = al_create_event_queue();
28 if (!event_queue)
29 abort_example("failed to create event queue");
30
31 al_register_event_source(event_queue, al_get_display_event_source(display));
32 al_register_event_source(event_queue, al_get_timer_event_source(timer));
33
34 glEnable(GL_DEPTH_TEST);
35 glClearColor(0.5, 0.5, 0.5, 1.0);
36 glMatrixMode(GL_PROJECTION);
37
38 al_start_timer(timer);
39
40 for (;;) {
41 ALLEGRO_EVENT event;
42 while (al_get_next_event(event_queue, &event))
43 if (event.type == ALLEGRO_EVENT_TIMER) {
44 rotation = rotation == 359 ? 0 : rotation + 1;
45 }
46 else if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
47 al_destroy_event_queue(event_queue);
48 al_destroy_timer(timer);
49 al_destroy_display(display);
50 return EXIT_SUCCESS;
51 }
52
53 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
54 glLoadIdentity();
55
56 glRotatef(rotation, 1, 0, 0);
57 glRotatef(rotation, 0, 1, 0);
58
59 glBegin(GL_POLYGON);
60 glColor3f(1, 0, 0);
61 glVertex3f(0.5, -0.5, -0.5);
62 glColor3f(0, 1, 0);
63 glVertex3f(0.5, 0.5, -0.5);
64 glColor3f(0, 0, 1);
65 glVertex3f(-0.5, 0.5, -0.5);
66 glColor3f(1, 0, 1);
67 glVertex3f(-0.5, -0.5, -0.5);
68 glEnd();
69
70 glBegin(GL_POLYGON);
71 glColor3f(1, 1, 1);
72 glVertex3f(0.5, -0.5, 0.5);
73 glVertex3f(0.5, 0.5, 0.5);
74 glVertex3f(-0.5, 0.5, 0.5);
75 glVertex3f(-0.5, -0.5, 0.5);
76 glEnd();
77
78 glBegin(GL_POLYGON);
79 glColor3f(1, 0, 1);
80 glVertex3f(0.5, -0.5, -0.5);
81 glVertex3f(0.5, 0.5, -0.5);
82 glVertex3f(0.5, 0.5, 0.5);
83 glVertex3f(0.5, -0.5, 0.5);
84 glEnd();
85
86 glBegin(GL_POLYGON);
87 glColor3f(0, 1, 0);
88 glVertex3f(-0.5, -0.5, 0.5);
89 glVertex3f(-0.5, 0.5, 0.5);
90 glVertex3f(-0.5, 0.5, -0.5);
91 glVertex3f(-0.5, -0.5, -0.5);
92 glEnd();
93
94 glBegin(GL_POLYGON);
95 glColor3f(0, 0, 1);
96 glVertex3f(0.5, 0.5, 0.5);
97 glVertex3f(0.5, 0.5, -0.5);
98 glVertex3f(-0.5, 0.5, -0.5);
99 glVertex3f(-0.5, 0.5, 0.5);
100 glEnd();
101
102 glBegin(GL_POLYGON);
103 glColor3f(1, 0, 0);
104 glVertex3f(0.5, -0.5, -0.5);
105 glVertex3f(0.5, -0.5, 0.5);
106 glVertex3f(-0.5, -0.5, 0.5);
107 glVertex3f(-0.5, -0.5, -0.5);
108 glEnd();
109
110 al_flip_display();
111 }
112}
113
114/* vim: set sts=3 sw=3 et: */
I think that under the Allegro.cc terms you guys now own that code or something. I don't exactly know how that provision works, I still own the Copyright, don't I? Anyway, for the wonders of legal clarity, I hereby give the Allegro developers permission to redistribute that code under any license they want, with or without modification. I PROVIDE NOT WARRANTY AT ALL. Programming should be fun. That's why I hate Java. |
Arthur Kalliokoski
Second in Command
February 2005
|
Luiji99 said: Unlike the current OpenGL example, this one actually renders 3-D. The ex_gldepth example shows interlocking 3D pyramids with textures. They all watch too much MSNBC... they get ideas. |
Luiji99
Member #12,254
September 2010
|
Ah, well then my example doesn't really add anything new. I like the way mine looks better, though. =P The current example actually has more stuff, too, such as drawing graphical textures onto the polygons. Thanks, Programming should be fun. That's why I hate Java. |
|