grafika komputer - malifauzi.lecture.ub.ac.id filerecall opengl can’tperforming windowing tasks or...

56
GRAFIKA KOMPUTER ~ M. Ali Fauzi

Upload: ngodang

Post on 14-Jul-2019

227 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

GRAFIKA KOMPUTER~ M. Ali Fauzi

Page 2: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Your First OpenGL Program

Page 3: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Simple Program Architecture

Inisialisasi

Update logika

Rendering

De-Inisialisasi

Keluar ?

Page 4: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

RECALL

Page 5: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Recall

OpenGL can’t performing windowing tasks or obtaining user input, but GLUT

Page 6: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

THE CODE

Page 7: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

#include <windows.h>

#include <GL/glut.h>

void display() {

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex2f(-0.5f, -0.5f);

glVertex2f( 0.5f, -0.5f);

glVertex2f( 0.5f, 0.5f);

glVertex2f(-0.5f, 0.5f);

glEnd();

glFlush();

}

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutCreateWindow("OpenGL Setup Test");

glutInitWindowSize(320, 320);

glutInitWindowPosition(50, 50);

glutDisplayFunc(display);

glutMainLoop();

return 0;

}

Page 8: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

#include <windows.h>

#include <GL/glut.h>

The Header

// For MS Windows

Page 9: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

#include <windows.h>

#include <GL/glut.h>

The Header

// GLUT, includes glu.h and gl.h/* Handler for window-repaint event. Call back when the window first appears and whenever the window needs to be re-painted. */

Page 10: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

The Main

/* Main function: GLUT runs as a console application starting at main() */GLUT command startswith glut*

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutCreateWindow("OpenGL Setup Test");

glutInitWindowSize(320, 320);

glutInitWindowPosition(50, 50);

glutDisplayFunc(display);

glutMainLoop();

return 0;

}

Page 11: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

The Main

// Initialize GLUT

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutCreateWindow("OpenGL Setup Test");

glutInitWindowSize(320, 320);

glutInitWindowPosition(50, 50);

glutDisplayFunc(display);

glutMainLoop();

return 0;

}

Page 12: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);

glutCreateWindow("OpenGL Setup Test");

glutInitWindowSize(320, 320);

glutInitWindowPosition(50, 50);

glutDisplayFunc(display);

glutMainLoop();

return 0;

}

The Main

// Specify the display Mode – RGB or color Index, single or double Buffer

Page 13: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutCreateWindow("OpenGL Setup Test");

glutInitWindowSize(320, 320);

glutInitWindowPosition(50, 50);

glutDisplayFunc(display);

glutMainLoop();

return 0;

}

The Main

// Create a window with the given title// Set the window's initial width & height

Page 14: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutCreateWindow("OpenGL Setup Test");

glutInitWindowSize(320, 320);

glutInitWindowPosition(50, 50);

glutDisplayFunc(display);

glutMainLoop();

return 0;

}

The Main

// Position the window's initial top-left corner

Page 15: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutCreateWindow("OpenGL Setup Test");

glutInitWindowSize(320, 320);

glutInitWindowPosition(50, 50);

glutDisplayFunc(display);

glutMainLoop();

return 0;

}

The Main

// Register display callback handler for window re-paint

Page 16: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutCreateWindow("OpenGL Setup Test");

glutInitWindowSize(320, 320);

glutInitWindowPosition(50, 50);

glutDisplayFunc(display);

glutMainLoop();

return 0;

}

The Main

// Enter the infinitely event-processing loop

Page 17: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

void display() {

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex2f(-0.5f, -0.5f);

glVertex2f( 0.5f, -0.5f);

glVertex2f( 0.5f, 0.5f);

glVertex2f(-0.5f, 0.5f);

glEnd();

glFlush();

}

The Display

// Set background color to black and opaque

Page 18: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

void display() {

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex2f(-0.5f, -0.5f);

glVertex2f( 0.5f, -0.5f);

glVertex2f( 0.5f, 0.5f);

glVertex2f(-0.5f, 0.5f);

glEnd();

glFlush();

}

The Display

// Clear the color buffer

Page 19: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

void display() {

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex2f(-0.5f, -0.5f);

glVertex2f( 0.5f, -0.5f);

glVertex2f( 0.5f, 0.5f);

glVertex2f(-0.5f, 0.5f);

glEnd();

glFlush();

}

The Display

// Draw a Red 1x1 Square centered at origin

Page 20: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

void display() {

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex2f(-0.5f, -0.5f);

glVertex2f( 0.5f, -0.5f);

glVertex2f( 0.5f, 0.5f);

glVertex2f(-0.5f, 0.5f);

glEnd();

glFlush();

}

The Display

// Red

Page 21: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

void display() {

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex2f(-0.5f, -0.5f);

glVertex2f( 0.5f, -0.5f);

glVertex2f( 0.5f, 0.5f);

glVertex2f(-0.5f, 0.5f);

glEnd();

glFlush();

}

The Display

// Each set of 4 vertices form a quad

Page 22: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

void display() {

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex2f(-0.5f, -0.5f);

glVertex2f( 0.5f, -0.5f);

glVertex2f( 0.5f, 0.5f);

glVertex2f(-0.5f, 0.5f);

glEnd();

glFlush();

}

The Display

// Render

Page 23: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

OPENGL COMMAND SYNTAX

Page 24: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Command Syntax

OpenGL commands use the prefix gl and initial capital letters for each word making up the command name (recall glClearColor(), for example)

Page 25: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Command Syntax

OpenGL defined constants begin with GL_, use all capital letters, and use underscores to separate words (for example,GL_SINGLE).

Page 26: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Command Syntax

You might also have noticed some seemingly extraneous letters appended to some command names (forexample, the 3f in glColor3f()and 2f in glVertex2f()).

Page 27: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Command Syntax

glVertex2f()

Number of Component

2 – (x, y)

3 – (x, y, z)

4 – (x, y, z, w)

Data Typef - floati – integerd – doubleEtc.

Page 28: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Command Syntax

Page 29: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Command Syntax

Thus, the two commands are equivalent

glVertex2i(1, 3);

glVertex2f(1.0, 3.0);

Page 30: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Command Syntax

> When only x and y are

specified, z defaults to 0.0and w defaults to 1.0.

> When x, y, and z are

specified, w defaults to 1.0.

Page 31: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Command Syntax

Thus, the two commands are equivalent

glVertex2i(1, 3);

glVertex3f(1.0, 3.0, 0.0);

Page 32: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Command Syntax

Some OpenGL commands can take a final letter v, which indicates that the command takes a pointer to a vector (or array) of values, rather than a series of individual arguments.

Page 33: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Command Syntax

glColor3f(1.0, 0.0, 0.0);

GLfloat color_array[] = {1.0, 0.0, 0.0};

glColor3fv(color_array);

Page 34: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

OPENGL AS A STATE MACHINE

Page 35: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Command Syntax

OpenGL is a state machine, particularly if you’re using the fixed-function pipeline. You put it into various states (or modes) that then remain in effect until you change them.

Page 36: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

void display() {

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex2f(-0.5f, -0.5f);

glVertex2f( 0.5f, -0.5f);

glVertex2f( 0.5f, 0.5f);

glVertex2f(-0.5f, 0.5f);

glEnd();

glFlush();

}

The Display

// Red

Page 37: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

void display() {

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex2f(-0.5f, -0.5f);

glVertex2f( 0.5f, -0.5f);

glColor3f(0.0f, 1.0f, 0.0f);

glVertex2f( 0.5f, 0.5f);

glVertex2f(-0.5f, 0.5f);

glEnd();

glFlush();

}

The Display

// Green

Page 38: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

GLUT CALLBACK FUNCTIONS

Page 39: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Callback Func

> Your OpenGL program will be in infinite loop> Event-driven: Programs that use windows

~ Input/Output~ Wait until an event happens and then execute some pre-defined functions according to the user’s input

Page 40: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Callback Func

> Your OpenGL program will be in infinite loop> Event-driven: Programs that use windows

~ Input/Output~ Wait until an event happens and then execute some pre-defined functions according to the user’s input

Page 41: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Callback Func

Events – key press, mouse button press and release, window resize, etc.

Page 42: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Callback Func

Callback function : Routine to call when an event happens

~ Window resize or redraw~ User input (mouse, keyboard)~ Animation (render many frames)

Page 43: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Callback Func

“Register” callbacks with GLUT

glutDisplayFunc( my_display_func );

glutIdleFunc( my_idle_func );

glutKeyboardFunc(my_key_events_func);

glutMouseFunc (my_mouse_events_func);

Page 44: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutCreateWindow("OpenGL Setup Test");

glutInitWindowSize(320, 320);

glutInitWindowPosition(50, 50);

glutDisplayFunc(display);

glutMainLoop();

return 0;

}

Callback Func

// Register display callback handler for window re-paint

Page 45: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutCreateWindow("OpenGL Setup Test");

glutInitWindowSize(320, 320);

glutInitWindowPosition(50, 50);

glutDisplayFunc(display);

glutIdleFunc( my_idle_func );

glutKeyboardFunc(my_key_events_func);

glutMouseFunc (my_mouse_events_func);

glutMainLoop();

return 0;

}

Callback Func

Page 46: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Rendering Callbacks

> Callback function where all our drawing is done> Every GLUT program must have a display callback

glutDisplayFunc( my_display_func );

/* this part is in main.c */

Page 47: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Rendering Callbacks

glutDisplayFunc( my_display_func );

/* this part is in main.c */

void my_display_func (void ){glClear( GL_COLOR_BUFFER_BIT );glBegin( GL_TRIANGLE );glVertex3fv( v[0] );glVertex3fv( v[1] );glVertex3fv( v[2] );

glEnd();glFlush();

}

Page 48: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Idle Callbacks

> Use for animation and continuous update

~ Can use glutTimerFunc or timed callbacks for animations

glutIdleFunc( idle );

Page 49: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Idle Callbacks

glutIdleFunc( idle );

void idle( void ){

/* change something */t += dt;glutPostRedisplay();

}

Page 50: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

User Input Callbacks

> Process user input

glutKeyboardFunc(my_key_events);

Page 51: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

User Input Callbacks

glutKeyboardFunc(my_key_events);

void my_key_events(char key, int x, int y){switch ( key ) {case ‘q’ : case ‘Q’ :

exit ( EXIT_SUCCESS);break;

case ‘r’ : case ‘R’ :rotate = GL_TRUE;break;

}}

Page 52: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Mouse Callbacks

> Captures mouse press and release events

glutMouseFunc( my_mouse );

Page 53: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Mouse Callbacks

glutMouseFunc( my_mouse );

void myMouse(int button, int state, int x, int y)

{if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)

{…}

}

Page 54: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Events in OpenGLEvent Example OpenGL Callback Function

Keypress KeyDown

KeyUp

glutKeyboardFunc

Mouse leftButtonDown

leftButtonUp

glutMouseFunc

Motion With mouse press

Without

glutMotionFunc

glutPassiveMotionFunc

Window Moving

Resizing

glutReshapeFunc

System Idle

Timer

glutIdleFunc

glutTimerFunc

Software What to draw glutDisplayFunc

Page 55: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Event Queue

Event queue

Keyboard

Mouse

Window

….

Mouse_callback() {….{

Keypress_callback() {….{

window_callback() {….{

MainLoop()

Page 56: GRAFIKA KOMPUTER - malifauzi.lecture.ub.ac.id fileRecall OpenGL can’tperforming windowing tasks or obtaining user input, but GLUT

Cheers, Old Sport~ M. Ali [email protected]