OpenGL - Draw on top of image

This is my first time using opengl and I am experimenting with adding/drawing polygons/points/etc. on top of a PPM image. The image is already loaded when the application runs. My attempt to draw a square is from lines 30 - 35. The program runs but the square is not present. Just the image. Any help is appreciated.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include<windows.h>
#include <stdio.h>
#include <stdlib.h>
#include<Gl/gl.h>
#include<GL/glut.h>

int n;
int m;

int *image;

void myInit (void)
{
     glClearColor ( 1.0, 1.0, 1.0 , 1.0);
     glColor3f ( 1.0f, 0.0f, 0.0f );
     glPointSize ( 4.0 );
     glMatrixMode ( GL_PROJECTION );
     glLoadIdentity ( );
     gluOrtho2D ( 0.0, 400.0, 1.0, 400.0 );
}


void display(void)
{

    glClear ( GL_COLOR_BUFFER_BIT );
    glRasterPos2i(0,0);
    glDrawPixels(n,m,GL_RGB, GL_UNSIGNED_INT, image);
    glPointSize(10.0);
    glBegin(GL_POLYGON);
             glVertex2f(-0.5, -0.5);
             glVertex2f(-0.5, 0.5);
             glVertex2f(0.5, 0.5);
             glVertex2f(0.5, -0.5);
    glEnd();
    glFlush ( );

}

void myreshape(int h, int w)
{
	glMatrixMode (GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0.0, (GLfloat) n, 0.0, (GLfloat) m);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glViewport(0,0,h,w);
}

int main(int argc, char**argv)
{
	FILE *fd;
	int k, nm;
	char c;
	char b[70];
	float s;
	char red, green, blue;
	int x, y;

	fd = fopen("map.ppm", "r");
	if(fd == 0)
	{
		exit(0);
	}


	fscanf(fd, "%s", b);
	if((b[0] != 'P') || (b[1] != '6'))
	{
		printf("%s is not a PPM file!\n", b);
		exit(0);
	}

	fscanf(fd, "%c", &c);

	fscanf(fd, "%c", &c);
	while(c == '#')
	{
		fscanf(fd, "%[^\n]", b);
		printf("%s\n", b);
		fscanf(fd, "%c", &c);
		printf("%c", c);
	}

	ungetc(c,fd);

	fscanf(fd, "%d %d %d", &n, &m, &k);

	printf("%d rows  %d colums  max value = %d\n", n, m, k);

	nm = n*m;

	image = (int*)malloc(3*sizeof(GLint)*nm);

	s = 255./k;

	for(x = 0; x < m; x++)
	{
		for(y = n-1; y >= 0; y--)
		{
           fscanf(fd, "%c", &red);
    	   fscanf(fd, "%c", &green);
	       fscanf(fd, "%c", &blue);

		   image[3*nm - 3*(x*n +y) -3] = green;
		   image[3*nm - 3*(x*n +y) -2] = blue;
		   image[3*nm - 3*(x*n +y) -1] = red;

		}
	}


	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(n,m);
	glutInitWindowPosition(0,0);
	glutCreateWindow("Little BigHorn");
	glutReshapeFunc(myreshape);
	glutDisplayFunc(display);
	glPixelTransferf(GL_RED_SCALE, s);
	glPixelTransferf(GL_GREEN_SCALE, s);
	glPixelTransferf(GL_BLUE_SCALE, s);
	glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_TRUE);
	glClearColor(1.0, 1.0, 1.0, 1.0);
	myInit ( );
    glutMainLoop ( );
}
Last edited on
> The program runs but the square is not present
¿where do you think that the square should appear?
When you do gluOrtho2D ( 0.0, 400.0, 1.0, 400.0 ); you are defining the mapping from coordinates to the pixels in the window, ¿what coordinates correspond to the corners of the window?

Think where the (0,0) is located, and how far is the (0.5, 0.5)
(0,0) is located in the bottom left hand corner, correct?
In myInit, you call gluOrtho2D with 0 <= x <= 400 and 1 <= y <= 400. These ranges of coordinates will be displayed in the window. So the bottom left actually corresponds to (0, 1).
In myreshape, this is changed to (0, 0), but myreshape is only called when the window is reshaped.
Now, even if the window is reshaped, only the top right quarter of the square might be visible, since the rest has x < 0 and/or y < 0. But even then, it might not be visible, because the square is tiny. The top right corner that might be visible after reshaping is only 0.5x0.5 in size. So if m and n are not too small, the square will be so small in comparison that it won't even be visible anymore.

So. Move the square into view, and make it a bit larger
or adjust the coordinate system
Thanks guys
Topic archived. No new replies allowed.