5 #define GL_GLEXT_PROTOTYPES 1
20 void reshape(int x, int y);
21 void keyb(unsigned char key, int x, int y);
23 int win_width, win_height;
24 int max_xscroll, max_yscroll;
28 unsigned int img[IMG_W * IMG_H];
30 unsigned int vbo_pos, vbo_col;
33 int mode = MODE_POINTS;
35 int have_vbo = 1; /* TODO */
38 int main(int argc, char **argv)
40 glutInit(&argc, argv);
41 glutInitWindowSize(800, 600);
42 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
43 glutCreateWindow("GL pixel drawing methods");
45 glutDisplayFunc(display);
46 glutReshapeFunc(reshape);
47 glutKeyboardFunc(keyb);
60 int i, j, xor, r, g, b;
66 for(i=0; i<IMG_H; i++) {
67 for(j=0; j<IMG_W; j++) {
69 r = (xor >> 1) & 0xff;
71 b = (xor << 1) & 0xff;
72 *ptr++ = r | (g << 8) | (b << 16);
76 glPixelStorei(GL_UNPACK_ROW_LENGTH, IMG_W);
78 win_width = glutGet(GLUT_WINDOW_WIDTH);
79 win_height = glutGet(GLUT_WINDOW_HEIGHT);
81 glGenTextures(1, &tex);
82 glBindTexture(GL_TEXTURE_2D, tex);
83 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
84 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
85 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, win_width, win_height, 1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
87 varr_sz = win_width * win_height * sizeof *varr * 2;
88 if(!(varr = malloc(varr_sz))) {
89 fprintf(stderr, "failed to allocate vertex array\n");
92 carr_sz = win_width * win_height * sizeof *carr * 3;
93 if(!(carr = malloc(carr_sz))) {
94 fprintf(stderr, "failed to allocate color array\n");
99 for(i=0; i<win_height; i++) {
100 for(j=0; j<win_width; j++) {
108 glGenBuffers(1, &vbo_pos);
109 glBindBuffer(GL_ARRAY_BUFFER, vbo_pos);
110 glBufferData(GL_ARRAY_BUFFER, varr_sz, varr, GL_STATIC_DRAW);
112 glGenBuffers(1, &vbo_col);
113 glBindBuffer(GL_ARRAY_BUFFER, vbo_col);
114 glBufferData(GL_ARRAY_BUFFER, carr_sz, 0, GL_STREAM_DRAW);
123 unsigned int tm = glutGet(GLUT_ELAPSED_TIME);
124 float t = tm / 256.0f;
125 int xoffs = (int)((sin(t) * 0.5f + 0.5f) * max_xscroll);
126 int yoffs = (int)((cos(t) * 0.5f + 0.5f) * max_yscroll);
127 unsigned int *start = img + yoffs * IMG_W + xoffs;
132 /* draw with points */
134 for(i=0; i<win_height; i++) {
135 for(j=0; j<win_width; j++) {
136 int r = start[j] & 0xff;
137 int g = (start[j] >> 8) & 0xff;
138 int b = (start[j] >> 16) & 0xff;
139 vptr[0] = r / 255.0f;
140 vptr[1] = g / 255.0f;
141 vptr[2] = b / 255.0f;
148 glBindBuffer(GL_ARRAY_BUFFER, vbo_pos);
149 glVertexPointer(2, GL_FLOAT, 0, 0);
150 glBindBuffer(GL_ARRAY_BUFFER, vbo_col);
151 glBufferSubData(GL_ARRAY_BUFFER, 0, carr_sz, carr);
152 glColorPointer(3, GL_FLOAT, 0, 0);
153 glBindBuffer(GL_ARRAY_BUFFER, 0);
155 glVertexPointer(2, GL_FLOAT, 0, varr);
156 glColorPointer(3, GL_FLOAT, 0, carr);
159 glEnableClientState(GL_VERTEX_ARRAY);
160 glEnableClientState(GL_COLOR_ARRAY);
162 glDrawArrays(GL_POINTS, 0, win_width * win_height);
164 glDisableClientState(GL_VERTEX_ARRAY);
165 glDisableClientState(GL_COLOR_ARRAY);
169 /* draw with glDrawPixels */
170 glDrawPixels(win_width, win_height, GL_RGBA, GL_UNSIGNED_BYTE, start);
174 /* draw with textured quad */
178 /* draw with textured triangle */
183 assert(glGetError() == GL_NO_ERROR);
191 void reshape(int x, int y)
193 glViewport(0, 0, x, y);
195 glMatrixMode(GL_PROJECTION);
197 glOrtho(0, x, 0, y, -1, 1);
201 max_xscroll = IMG_W - win_width;
202 max_yscroll = IMG_H - win_height;
203 if(max_xscroll < 0) max_xscroll = 0;
204 if(max_yscroll < 0) max_yscroll = 0;
207 void keyb(unsigned char key, int x, int y)
214 mode = (mode + 1) % NUM_MODES;