Presentation is loading. Please wait.

Presentation is loading. Please wait.

Painterly Rendering CMPS 160 - Assignment 2. OpenGL OpenGL is a cross-language, cross- platform specification defining and API for 2D and 3D graphics.

Similar presentations


Presentation on theme: "Painterly Rendering CMPS 160 - Assignment 2. OpenGL OpenGL is a cross-language, cross- platform specification defining and API for 2D and 3D graphics."— Presentation transcript:

1 Painterly Rendering CMPS 160 - Assignment 2

2 OpenGL OpenGL is a cross-language, cross- platform specification defining and API for 2D and 3D graphics (taking advantage of hardware acceleration when possible).

3 GLUT “GL Utility Toolkit” GLUT is a layer on top of OpenGL that hides details of communicating with the system to control windows, and monitor the keyboard and mouse.

4 Assignment Overview Write code from scratch (ok, minimal base code) Due in 1 week Makefile takes care of building and converting image formats Build process assumes you use C++ but you don’t have to use an OO concepts (base code doesn’t). Designed for Mac lab (if you want to build elsewhere you should only have to change the Makefile) -- Makefile.cygwin available on class page

5 Demo My main.cc is 217 lines long Includes generous whitespace and comments Allows various color and brush modes. I spent way too much time painting cool pictures instead of debugging to give a good estimate on programming time… My guess 2-8 hours?

6 Concepts Think of GLUT as a machine, you configure it, turn it on, and leave it run by itself. Register “callbacks” to have to contact you back when certain events happen. Within callbacks, think of OpenGL as something you are sending message to. Use your normal loops and conditionals to get the right commands triggered at the right time and use glFlush() to get to to actually perform all the actions it has stored up. Its lazy on these Macs.

7 main.cc (in extreeeeeeeeeeeeeeeeeeeemly high level psuedocode) include ppm canvas header include gl/glut headers declare some shared state variables declare some callback functions declare main

8 main() Initialize glut -- glutInit load source image -- ppmLoadCanvas Create a window -- glutCreateWindow register callbacks -- glutSomethingFunc Let GLUT take over -- glutMainLoop() **never returns**

9 cb_display() Normally all screen drawing code goes here We are lazy We only draw when the user tries to paint something Leave the body of this function blank

10 cb_mouse(button,state,x,y) Called whenever a mouse button is pushed down or let up Put your code to draw a paint blob here or in…

11 cb_motion(x,y) Called for each location along a mouse dragging path When user drags, moves, drags again there is a jump in the coordinates fed to this function, use cb_mouse to figure out when this happens Paint here if you like Save this x,y for later so you can use it to draw lines from this position to the next If you want to track mouse motion when no buttons are down there is way

12 cb_keyboard(key,x,y) Called whenever a key is pressed You should exit(0) when the user presses ‘q’ You can use other keys to trigger changing of painting modes or clear the screen. No modifiers (alt,ctrl,whatever) are passed, there is a way to get these

13 cb_reshape(w,h) Called at startup and when the window is resized You should save w,h to help interpret mouse coordinates glViewport tells GL what part of the window you want to use (all of it!) Look up glMatrixMode and gluOrtho2D to setup projection matrix properly Optionally, clear the screen as well

14 Global state variables Canvas - the function where you actually paint needs access to the source image loaded in main() Window size - compare mouse coordinates to these to figure out relative location within window Last cursor position - draw lines from this location to current location to make directional strokes if you like

15 ppm_canvas usage canvas_t canvas; ppmLoadCanvas(“some.ppm”,&canvas); int x = 50; // column, left to right int y = 100; // row, top to bottom (I think) pixel_t pixel = PIXEL(canvas,x,y); int r = RED(pixel); float g = GREEN(pixel)/255.0; // OpenGL expects colors in the range 0.0f-1.0f

16 Actually painting something Look these up in the linked documentaiton: glBegin(GL_???) glEnd() glColor*() glVertex*()

17 the provided Makefile “make” builds your program, tells you what to write in your README if you don’t have one “make demo” builds binary+documentation tarball to brag to your friends/classmates without revealing top secret painting effect implementation “make some.ppm” converts some.jpg to ppm format (also works for gif, png, whatever…) If you use multiple source files to complete the assignment you must edit the a line in the Makefile


Download ppt "Painterly Rendering CMPS 160 - Assignment 2. OpenGL OpenGL is a cross-language, cross- platform specification defining and API for 2D and 3D graphics."

Similar presentations


Ads by Google