Tutorial 09. Lighting Visualisasi tentu saja tidak akan terjadi bila tidak ada cahaya. Pencahayaan merupakan esensi dari visualisasi dan merupakan topik yang sangat kompleks. Hingga tahap ini lingkungan diberi pencahayaan default/standar dengan cahaya lingkungan (ambient) yang sama pada setiap titik. Kondisi default/standar dapat dicapai kapan saja dengan mematikan status Lighting menjadi disabled dengan glDisable(GL_LIGHT0). Dalam pencahayaan, ada dua hal yang menentukan tampilan suatu obyek, yaitu: 1. Sumber cahaya dan pengaruh lingkungan terhadap cahaya •
Lokasi sumber cahaya
•
Arah pencahayaan dari sumber cahaya (omni, spot)
•
Komponen pengaruh lingkungan terhadap cahaya (ambient, diffuse, specular)
2. Material dari obyek, yang memodelkan bagaimana material bereaksi terhadap sumber cahaya, yaitu: •
Material reflektan terhadap komponen cahaya ambient
•
Material reflektan terhadap komponen cahaya diffuse
•
Material reflektan terhadap komponen cahaya specular
•
Material sebagai sumber cahaya (emitance)
Komponen ambient adalah cahaya yang arahnya tidak dapat ditentukan karena datang secara merata dari segala arah. Biasanya merupakan cahaya yang dihasilkan dari pemantulan berkali-kali sumber cahaya yang berarah. Poligon dalam openGL selalu diiluminasi secara seragam oleh komponen ambient tanpa memperdulikan orientasi dan posisinya. Komponen diffuse adalah cahaya yang bersumber dari satu arah dan mempengaruhi poligon secara uniform bergantung pada sudut datang terhadap permukaan poligon. Komponen specular adalah cahaya yang memantul dari obyek pada arah tertentu saja, yang bergantung pada derajat inklinasi dari poligon terhadap cahaya dan posisi observer. efek specular sering digunakan untuk memberikan kesan mengkilap (shininess).
/* * *
Lighting Program ini mendemonstrasikan penggunaan model Lighting pada
OpenGL *
Sebuah bola digambarkan dengan karakteristik material berwarna
abu-abu. *
Sebuah sumber cahaya aka menyinari objek tersebut.
*/ #include
#include <stdlib.h> int specularLightstatus = 1; bool ambientLightStatus = true; void init(void); void display(void); void keyboard(unsigned char key, int x, int y); void reshape(int w, int h); int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow ("Lighting"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0;
} /* *
Initialize material property, light source, lighting model, and depth buffer.
*/ void init(void) { GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat mat_shininess[] = { 50.0 }; GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_SMOOTH); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); } void display(void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutSolidSphere (1.0, 20, 16); glFlush (); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0); else glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; case 'O': case 'o': if(specularLightstatus == 1) { glDisable(GL_LIGHTING); glutPostRedisplay(); specularLightstatus = 0; } else { glEnable(GL_LIGHTING); glutPostRedisplay(); specularLightstatus = 1; }
break; case 'p': case
'P': if(ambientLightStatus == true)
{ glDisable(GL_LIGHT0); glutPostRedisplay(); ambientLightStatus = false; } else { glEnable(GL_LIGHT0); glutPostRedisplay(); ambientLightStatus = true; } break; } }