Sabtu, 07 Juni 2014

Tutorial OPENGL dengan GLUT Bagian - 1

Tutorial 01 :
Membuat Hello World dan gambar persegi dengan Opengl C++

Pada bagian pertama mempelajari tutorial OPENGL ini, kita akan membuat Hellow World dan Gambar Persegi Panjang 2 dalam bentuk Dimensi dengan menggunakan OPENGL dan C++ pada Visual Studio 2010. Untuk memulai Latihan ini kita harus memperhatikan kebutuhan yang harus sudah terinstall pada PC/Laptop kita, yang pertama sudah terinstal Visual Studio (2008/2010/2012), kemudian library yang dibutuhkan, dan Directx yang sudah terinstall.
Langkah pertama yang harus kita lakukan adalah :
Buat sebuah project baru, melalui menubar File, New, Project akan keluar dialog menu
Pilih Visual C++, pilih General, kemudian pilih Empty Project, Ketik pada Bagian File Name : Tutor01, Kemudian Klik OK. Kemudian akan tampil Project yang telah dibuat dan dapat dilihat pada project manager Project Tutor01. Klik kanan pada Project tersebut, kemudian Pilih Add, New Item, dan akan menampilkan dialog menu Add New Item, Pilih C++ File, kemudian beri nama filenya : Tutor01.cpp, terakhir tekan tombol ADD, dan akan menampilkan workspace untuk mengetikan code program berikut ini :
Berikut ini Source code untuk menampilkan latihan pertama kita :
//Memanggil Library

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>

Penjelasan :
·         Kode program di atas berfungsi untuk import library yang akan digunakan
·         <stdui> merupakan library yang digunakan untuk operasi input output
·         <stdlib> digunakan untuk membersihkan layar fungsinya sama dengan <windows.h>
·         <string> library yang menyimpan fungsi-fungsi dalam penanganan string atau substring
·         <stdarg> library yang mengijinkan pendefinisian angka
·         <GL/glut> library grafik dari opengl

//Prosedur untuk menampilkan Gambar Kotak
void mydisplay(){
glClear(GL_COLOR_BUFFER_BIT); // Menghapus layar
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();
}
Penjelasan :

·         void mydisplay() merupakan method yang digunakan untuk membuat sebuah persegi
·         glClear() merupakan sintaks yang digunakan untuk membersihkan semua pixel
·         glBegin(GL_POLYGON) merupakan sintaks untuk memulai membuat gambar Poligon / segi empat
·         glVertex2f(x,y) merupakan sintaks untuk memberikan titik pada gambar 2 dimensi dengan koordinat x dan y
·         glEnd() merupakan sintaks penutup
·         glFlush() merupakan sintaks untuk memastikan gambar bisa di eksekusi

//Program Utama
int main(int argc, char** argv)
{
printf("Hello World… this is 2D Rectangle");
glutCreateWindow("simple");
glutDisplayFunc(mydisplay);
glutMainLoop();
}

Penjelasan :
·         main() merupakan method utama untuk mengeksekusi keseluruhan program
·         printf() merupakan sintaks untuk menampilkan teks di console
·         glutCreateWindow() merupakan sintaks untuk membuat dan menampilkan window
·         glutDisplayFunc(mydisplay) merupakan sintaks untuk memanggil method mydisplay
·         glutMainLoop() merupakan sintaks untuk me-looping atau mengulang fungsi/method main

Dan apabila source code tersebut kita running maka Output yang ditampilkan dari perintah prinf() yang terdapat pada main program adalah seperti gambar dibawah ini :


Sementara untuk output dari Hasil fungsi glutCreateWindow() dan glutDisplayFunc().




Tutorial 02 :
Membuat Segitiga


Dalam latihan ke 2 ini kita akan membuat sebuah object segitiga, sama dengan langkah sebelumnya (Pada Tutorial ke 1) buat sebuah Project dengan nama Tutor02 dan File : Tutor02.cpp, yang kita butuhkan kemudian anda ketikan Source Code dibawah ini.
//Memanggil Library
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>

//Membuat Method
void mydisplay()
{
       glClear(GL_COLOR_BUFFER_BIT);
       glBegin(GL_TRIANGLES);
       glVertex2f(-0.5, -0.5);
       glVertex2f(-0.5, 0.5);
       glVertex2f(0.5, 0.5);
       glEnd();
       glFlush();
}

//Main Program
int main(int argc, char** argv){
       glutCreateWindow("simple");
       glutDisplayFunc(mydisplay);
       glutMainLoop();
}


PENJELASAN :
Yang membedakan dengan tutorial sebelumnya adalah adanya pemanggilan GL_TRIANGLES, dimana GL_TRIANGLES merupakan perintah atau sintaks untuk menggambar objek segitiga. Karena akan membuat segitiga titik / vertek yang dibutuhkan hanya 3.
Dan jika kita running source code tersebut akan menghasilkan output berupa bentuk segitiga yang dihasilkan dari method mydisplay(). Seperti Tampilan dibawah ini :




Tutorial 03 :
Membuat Polygon Segi Delapan

Dalam latihan ke 3 ini kita akan membuat sebuah object Poligon persegi Delapan, sama dengan langkah sebelumnya (Pada Tutorial ke 1) buat sebuah Project dengan nama Tutor03 dan File : Tutor03.cpp, yang kita butuhkan kemudian anda ketikan Source Code dibawah ini.
//Memanggil Library
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>

//Membuat Method
void mydisplay(){
       glClear(GL_COLOR_BUFFER_BIT);
       glBegin(GL_POLYGON);
       glColor3f(0, 1, 0);
       glVertex2f(-0.5, -0.5);
       glVertex2f(-0.75, 0);
       glVertex2f(-0.5, 0.5);
       glVertex2f(0, 0.75);
       glVertex2f(0.5, 0.5);
       glVertex2f(0.75, 0);
       glVertex2f(0.5, -0.5);
       glVertex2f(0,-0.75);
       glEnd();
       glFlush();
}

//Main Program
int main(int argc, char** argv){
glutCreateWindow("simple");
glutDisplayFunc(mydisplay);
glutMainLoop();
}

PENJELASAN :
Hampir sama dengan 2 contoh program sebelumnya yang terdapat pemanggilan Library dan membuat sebuah Method MyDisplay, tetapi terdapat penggunaan GL_POLYGON yang merupakan perintah atau sintaks untuk membuat objek dalam poligon. Dan ditambah dengan glColor3f() merupakan fungsi untuk menentukan warna yang mengacu pada warna RGB. Nilai pada glColor3f(0,1,0) akan menghasilkan warna hijau.
Dari contoh tersebut dihasilkan Penggambaran objek segidelapan dimana cara yang dipergunakan adalah cara yang hampir sama dengan penggambaran objek kotak segiempat. Pada objek persegidelapan menggunakan sintaks GL_POLYGON. Hanya perbedaan diantara kedua buah objek segiempat dengan object segidelapan terletak pada jumlah pendefinisian titik dengan menggunakana glvertex2f. Pada objek segidelapan menggunakan 8 titik. Untuk menghasilkan warna pada objek tersebut, menggunakan sintaks glcolor3f. Untuk proses penggunaan warnadengan menggunakan model warna RGB (Red, Green, Blue).



TUGAS OPENGL GEOMETRIC PRIMITIVE
Perhatikan Source Code dibawah ini :
//Memanggil Library
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>

//Membuat Method          
void mydisplaytugas(){
glClear(GL_COLOR_BUFFER_BIT);
       glBegin(GL_QUAD_STRIP);
       glColor3f(1, 0, 0);
       glVertex2f(0.0f, 0.0f);
       glVertex2f(-0.25f, 0.5f);
       glVertex2f(-0.5f, 0.75f);
       glVertex2f(0.0f, 0.25f);
      
       glColor3f(0, 1, 0);
       glVertex2f(0.0f, 0.0f);
       glVertex2f(-0.25f, -0.75f);
       glVertex2f(-0.75f, 0.0f);
        glVertex2f(0.0f, -0.25f);

       glColor3f(0, 0, 1);
       glVertex2f(0.0f, 0.0f);
       glVertex2f(0.5f, 0.75f);         
glVertex2f(0.25f, 0.25f);
    glVertex2f(0.5f, -0.75f); // vertex 4
          
  glEnd();
  glFlush();
}

//Program Utama
int main(int argc, char** argv){
glutCreateWindow("simple");
glutDisplayFunc(mydisplaytugas);
glutMainLoop();
}

Berdasarkan Source Code diatas Output yang dihasilkan dapat dilihat pada gambar dibawah ini.


Objek primitive tersebut menggunakan fungsi GL_QUAD_STRIP yang merupakan fungsi untuk membuat objek dari 3 kelompok verteks yang terhubung menjadi segmen garis dari titik pertama sampai terakhir. Hasil diperoleh dari method mydisplaytugas(), yang terdiri dari beberapa sintaks-sintaks opengl.


Tutorial 04 :
Membuat Polygon Segi Delapan dengan warna

Dalam latihan ke 4 ini kita akan membuat sebuah object segi delapan yang dilengkapi dengan warna, sama dengan langkah sebelumnya (Pada Tutorial ke 1) buat sebuah Project dengan nama Tutor04 dan File : Tutor04.cpp, yang kita butuhkan kemudian anda ketikan Source Code dibawah ini
//Memanggil Library
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>

//Membuat Method
void mydisplay(){
       glClear(GL_COLOR_BUFFER_BIT);
       glBegin(GL_POLYGON);
       glColor3f(0, 1, 0);
       glVertex2f(-0.5, -0.5);
       glColor3f(0, 0, 1);
       glVertex2f(-0.75, 0);
       glColor3f(1, 0, 0);
       glVertex2f(-0.5, 0.5);
       glColor3f(0, 1, 0);
       glVertex2f(0, 0.75);
       glColor3f(0, 0, 1);
       glVertex2f(0.5, 0.5);
       glColor3f(1, 0, 0);
       glVertex2f(0.75, 0);
       glColor3f(0, 1, 0);
       glVertex2f(0.5, -0.5);
       glColor3f(0, 0, 1);
       glVertex2f(0,-0.75);
       glEnd();
       glFlush();
}

//Program Utama
int main(int argc, char** argv){
glutCreateWindow("simple");
glutDisplayFunc(mydisplay);
glutMainLoop();
}

PENJELASAN :
Dari Source Code diatas yang membedakan dengan latihan pada Contoh Nomor 3 adalah pendeklarasian glColor3f yang dilakukan sebanyak 8 dengan diberi nilai yang berbeda beda, sehingga menghasilkan warna yang berbeda.
Maka akan menghasilkan object segidelapan dengan warna yang berbeda-beda pada setiap titiknya. Pendefinisian dilakukan dengan memberikan sintaks warna (glcolor3f) terlebih dahulu sebelum sintaks titik (glvertex2f). Gambar hasil running dari code diatas adalah sebagai berikut ini :





Tutorial 05 :
Membuat Objek 3 Dimensi


Dalam latihan ke 5 ini kita akan membuat sebuah object segi delapan yang terlihat seperti 3 dimensi yang dilengkapi dengan warna, sama dengan langkah sebelumnya (Pada Tutorial ke 1) buat sebuah Project dengan nama Tutor05 dan File : Tutor05.cpp, yang kita butuhkan kemudian anda ketikan Source Code dibawah ini
//Memanggil Library
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>

//membuat Method
void mydisplay(){
       glClear(GL_COLOR_BUFFER_BIT);
       glBegin(GL_POLYGON);
       glColor3f(0, 1, 0);
       glVertex3f(-0.5, -0.5, 1);
       glColor3f(0, 0, 1);
       glVertex3f(-0.75, 0, 1);
       glColor3f(1, 0, 0);
       glVertex3f(-0.5, 0.5, 1);
       glColor3f(0, 1, 0);
       glVertex3f(0, 0.75, 1);
       glColor3f(0, 0, 1);
       glVertex3f(0.5, 0.5, -1);
       glColor3f(1, 0, 0);
       glVertex3f(0.75, 0, -1);
       glColor3f(0, 1, 0);
       glVertex3f(0.5, -0.5, -1);
       glColor3f(0, 0, 1);
       glVertex3f(0,-0.75, -1);
       glEnd();
       glFlush();
}

//Program Utama
int main(int argc, char** argv){
glutCreateWindow("simple");
glutDisplayFunc(mydisplay);
glutMainLoop();
}

Penjelasan :
Fungsi dari glVertex3f () adalah sebuah sintaks yang dipergunakan untuk menggambarkan object 3 dimensi dengan koordinat (x,y,z), seperti yang dapat kita lihat pada source code diatas, berbeda dengan latihan 4, pada latihan 4 menggunakan glVertex2d(). Dan jika di running kode program tersebut akan menghasilkan object berupa objek 3 dimensi segidelapan dengan warna disetiap titik. Objek tersebut dihasilkan melalui method mydisplay(), dimana pada method tersebut terdapat sintaks  glvertex3f() untuk pemberian titik dengan 3 komponen nilai. Selain terdapat sintaks pendefinisian titik, pada method tersebut juga terdapat sintaks pendefinisan warna glcolor3f() untuk setiap titik.





Tutorial 06 :
Reshape Callback Function

Dalam latihan ke 6 ini kita akan membuat sebuah object yang dapat di Reshape bentuknya sehingga menyesuaikan dengan frame yang dirubah, sama dengan langkah sebelumnya (Pada Tutorial ke 1) buat sebuah Project dengan nama Tutor06 dan File : Tutor06.cpp, yang kita butuhkan kemudian anda ketikan Source Code dibawah ini
//Memanggil Library
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>

//Membuat Method
       void mydisplay(){
              glClear(GL_COLOR_BUFFER_BIT); // Menghapus layar
              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();
              }
//Membuat Method Resize berparameter
       void resize( int w, int h )
              {
              if (w >= h)
                     glViewport(0, 0, (GLsizei)h, (GLsizei)h) ;
              else
                     glViewport(0, 0, (GLsizei)w, (GLsizei)w) ;
       }

//Program Utama
int main(int argc, char** argv)
{
       printf("Hello World… this is 2D Rectangle");   
       glutCreateWindow("simple");
       glutDisplayFunc(mydisplay);
       glutReshapeFunc(resize);
       glutMainLoop();
}

Penjelasan :
·         Function glViewport() adalah sebagai fungsi yang dipergunakan untuk melakukan setting pada viewport dari suatu window
·         Function glutReshapeFunc() adalah sebuah fungsi yang dipergunakan untuk memanggil fungsi reshape

Dari Source Code diatas, jika program dijalankan maka akan menghasilkan gambar seperti dibawah ini dimana dengan menggunakan fungsi reshape kotak yang terdapat pada Frame tidak ikut berubah walaupun dilakukan pembesaran ke arah kanan.



gambar diatas merupakan objek primitive segiempat yang dihasilkan melalui method mydisplay(), dimana melalui method tersebut terdapat funtion GL_POLYGON yang merupakan fungsi untuk membuat objek primitive poligon dan memiliki 4 definisi titik dengan menggunakan glvertex().
Method resize(w,h) merupakan sebuah method yang dipergunakan untuk mendefinisikan fungsi callback reshape. Callback Reshape berfungsi agar gambar tetap berada  pada proporsi yang tepat dengan kata lain apabila window / frame di drag ke kanan,kiri, atas, atau bawah posisi gambar tidak mengalami perubahan. Sintaks yang digunakan untuk membuat fungsi callback reshape adalah glviewport() untuk menetapkan viewport. Untuk memanggil fungsi reshape, menggunakan fungsi glutReshapeFunc(resize).
Jika gambar yang di olah tanpa menggunakan fungsi reshape, maka akan ditampilkan seperti tampilan dibawah ini :



Kedua buah Gambar diatas adalah objek yang tidak menggunakan fungsi callback reshape, dimana ketika frame di perbesar posisinya ke sebelah kanan gambar berubah sesuai dengan arah pembesaran.



Tutorial 07 :
Proyeksi Perspektif 2 Dimensi

Dalam latihan ke 7 ini kita akan membuat sebuah object poligon segidelapan yang dapat berputar dan ukurannya dapat diperbesar maupun diperkecil saat berputar, sama dengan langkah sebelumnya (Pada Tutorial ke 1) buat sebuah Project dengan nama Tutor07 dan File : Tutor07.cpp, yang kita butuhkan kemudian anda ketikan Source Code dibawah ini
//Memanggil Library
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>

//Deklarasi Variable
float z_pos=0.0f;
float rot=0.0f;

//Membuat Method
void mydisplay(){
       glClear(GL_COLOR_BUFFER_BIT);
       glLoadIdentity();
       glTranslatef(0.0,0.0f,z_pos);
       glRotatef(rot, 0, 0, 1);
       glBegin(GL_POLYGON);
       glColor3f(0, 1, 0);
       glVertex3f(-0.5, -0.5, -5);
       glColor3f(0, 0, 1);
       glVertex3f(-0.75, 0, -5);
       glColor3f(1, 0, 0);
       glVertex3f(-0.5, 0.5, -5);
       glColor3f(0, 1, 0);
       glVertex3f(0, 0.75, -5);
       glColor3f(0, 0, 1);
       glVertex3f(0.5, 0.5, -5);
       glColor3f(1, 0, 0);
       glVertex3f(0.75, 0, -5);
       glColor3f(0, 1, 0);
       glVertex3f(0.5, -0.5, -5);
       glColor3f(0, 0, 1);
       glVertex3f(0,-0.75, -5);
       glEnd();
       glFlush();
       glutSwapBuffers();
}

//Membuat Method init
       void init( void )
       {
              glClearColor( 1.0, 0.0, 0.0, 1.0 ); // A Background Clear Color
              glMatrixMode(GL_PROJECTION);
              glLoadIdentity();
              gluPerspective(45, (GLdouble)500.0/(GLdouble)500.0, 0, 100);
              glMatrixMode(GL_MODELVIEW);
       }
//Membuat Method resize
       void resize( int w, int h )
       {
              glViewport( 0, 0, (GLsizei) w, (GLsizei) h );
              glMatrixMode( GL_PROJECTION );
              glLoadIdentity();
              gluPerspective(45, (GLdouble)w/(GLdouble)h, 0, 100);
              glMatrixMode( GL_MODELVIEW );
       }
//Membuat Method timeout
       void myTimeOut(int id)    
       {
       // called if timer event
       // ...advance the state of animation incrementally...
              rot+=10;
              glutPostRedisplay(); // request redisplay
              glutTimerFunc(100, myTimeOut, 0); // request next timer event
       }
//Membuat Method keyboard
       void myKeyboard(unsigned char key,int x, int y)
       {
              if((key=='<')||(key==',')) z_pos-=0.1f;
              if((key=='>')||(key=='.')) z_pos+=0.1f;
       }

//Program Utama
int main(int argc, char** argv)
{
       glutInit(&argc,argv);
       //glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
       glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
       glutInitWindowSize(500,500);
       glutInitWindowPosition(0,0);
       glutCreateWindow("simple");
       // callbacks
       glutDisplayFunc(mydisplay);
       glutKeyboardFunc(myKeyboard);
       glutTimerFunc(100, myTimeOut, 0);
       glutReshapeFunc(resize);
       init();
       glutMainLoop();
}


Penjelasan :
·         Function glMatrixMode() digunakan untuk memberikan inisialisasi matriks. 
·         Function glLoadIdentity() digunakan untuk memanggil matriks identitas dan dijadikan status matriks (proyeksi) saat ini.
·         Function gluPerspective()digunakan untuk mengatur perspektif yaitu perubahan atau pergeseran dari proyeksi.
·         Function glutPostRedisplay() digunakan untuk mengirimkan perintah saat mengaktifkan display secara berkala (looping).
·         Function glutTimerFunc() digunakan untuk membuat animasi yang dapat dikontrol oleh waktu
·         Function glTranslatef() digunakan untuk memindahkah objek.
·         Function glRotatef() digunakan untuk memutar objek.
·         Function glutInitDisplayMode() digunakan untuk  untuk menentukan apakah object akan menggunakan model pewarnaan RGB atau indek warna.
·         Function glutInitWindowSize() digunakan untuk menentukan ukuran window.
·         Function glutInitWindowPosition() digunakan untuk menentukan letak posisi sebuah window
·         Function glutCreateWindow() digunakan untuk membuat window.
·         Function glutDisplayFunc() digunakan untuk memanggil fungsi display atau method untuk membuat objek primitive.
·         Function glutKeyboardFunc() digunakan untuk memanggil fungsi inputan dari keyboard.
·         Function glutTimerFunc() digunakan untuk memanggil fungsi animate.
·         Function glutMainLoop() adalah event yang menandakan pemrosesan glut terjadi.
Jika Source Code tersebut dijalankan maka akan menhasilkan objek primitif segidelapan yang dapat berputar dan dapat berinteraksi dengan inputan melalui sebuah keyboard yang sudah di setting pada kode program seperti contoh 2 buah gambar dibawah ini. Output objek primitif segidelapan dihasilkan melalui method mydisplay(). Dalam method tersebut terdapat fungsi untuk memindahkan objek primitif sesuai dengan sumbu z (glTranslatef(0.0,0.0f,z_pos)) dan fungsi untuk memutar objek primitif yang berputar searah dengan sumbu z. Pada objek tersebut tiap-tiap titik diberikan warna yang berbeda.
Method init() digunakan untuk menginisialisasi seperti warna background
Method myTimeOut() digunakan untuk mengatur waktu berputarnya object
Method myKeyboard dengan menggunakan simbol > dan < untuk memperbesar atau memperkecil, dan simbol koma dan titik.




Tutorial 08 :
Proyeksi Perspektif 3 Dimensi

Dalam latihan ke 8 ini kita akan membuat sebuah object kubus 3 dimensi yang dapat berputar, diberi warna dan ukurannya dapat diperbesar maupun diperkecil saat berputar, sama dengan langkah sebelumnya (Pada Tutorial ke 1) buat sebuah Project dengan nama Tutor08 dan File : Tutor08.cpp, yang kita butuhkan kemudian anda ketikan Source Code dibawah ini
//Memanggil Library
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>

//Deklarasi Variable
float z_pos=-10.0f;
float rot=0.0f;

//Membuat Method resize
void resize(int width, int height)
{
       glViewport(0, 0, width, height);
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       gluPerspective(45.0, (float)width/(float)height, 1.0, 300.0);
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
       }

//Membuat Method timeout
void myTimeOut(int id)
{
// called if timer event
// ...advance the state of animation incrementally...
       rot+=10;
       glutPostRedisplay(); // request redisplay
       glutTimerFunc(100, myTimeOut, 0); // request next timer event
}

//Membuat Method keyboard
void myKeyboard(unsigned char key,int x, int y)
{
       if((key=='<')||(key==',')) z_pos-=0.1f;
       if((key=='>')||(key=='.')) z_pos+=0.1f;
}

//Membuat Method display
void mydisplay(void)
{
//glClear(GL_COLOR_BUFFER_BIT );
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       glLoadIdentity();
       glTranslatef(0.0,0.0f,z_pos);
       glRotatef(rot, 0, 1, 0);
       glBegin(GL_QUADS);
// Front Face, red
       glColor3f(1.0,0.0,0.0);
       glVertex3f(-1.0f, -1.0f, 1.0f);
       glVertex3f( 1.0f, -1.0f, 1.0f);
       glVertex3f( 1.0f, 1.0f, 1.0f);
       glVertex3f(-1.0f, 1.0f, 1.0f);
       // Back Face, green
       glColor3f(0.0,1.0,0.0);
       glVertex3f( 1.0f, -1.0f, -1.0f);
       glVertex3f( 1.0f, 1.0f, -1.0f);
       glVertex3f(-1.0f, 1.0f, -1.0f);
       glVertex3f(-1.0f, -1.0f, -1.0f);
       // Top Face, blue
       glColor3f(0.0,0.0,1.0);
       glVertex3f(-1.0f, 1.0f, -1.0f);
       glVertex3f(-1.0f, 1.0f, 1.0f);
       glVertex3f( 1.0f, 1.0f, 1.0f);
       glVertex3f( 1.0f, 1.0f, -1.0f);
       // Bottom Face, yellow
       glColor3f(1.0,1.0,0.0);
       glVertex3f(-1.0f, -1.0f, -1.0f);
       glVertex3f( 1.0f, -1.0f, -1.0f);
       glVertex3f( 1.0f, -1.0f, 1.0f);
       glVertex3f(-1.0f, -1.0f, 1.0f);
       // Right face, cyan
       glColor3f(0.0,1.0,1.0);
       glVertex3f( 1.0f, -1.0f, -1.0f);
       glVertex3f( 1.0f, 1.0f, -1.0f);
       glVertex3f( 1.0f, 1.0f, 1.0f);
       glVertex3f( 1.0f, -1.0f, 1.0f);
       // Left Face, magenta
       glColor3f(1.0,0.0,1.0);
       glVertex3f(-1.0f, -1.0f, -1.0f);
       glVertex3f(-1.0f, -1.0f, 1.0f);
       glVertex3f(-1.0f, 1.0f, 1.0f);
       glVertex3f(-1.0f, 1.0f, -1.0f);
       glEnd();
       glFlush();
       glutSwapBuffers();
}

//Membuat Method inisialisasi
void init()
{
       glEnable(GL_DEPTH_TEST);
       glClearColor( 0.0, 0.0, 0.0, 1.0 ); // A Background Clear Color
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       gluPerspective(45, (GLdouble)500.0/(GLdouble)500.0, 0, 100);
       glMatrixMode(GL_MODELVIEW);
       return;
}

//Program Utama
int main(int argc, char** argv)
{
       glutInit(&argc,argv);
       //glutInitDisplayMode( GLUT_DOUBLE /*| GLUT_DEPTH*/ );
       glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
       glutInitWindowSize(500,500);
       glutInitWindowPosition(0,0);
       glutCreateWindow("simple");
       // callbacks
       glutDisplayFunc(mydisplay);
       glutKeyboardFunc(myKeyboard);
       glutTimerFunc(100, myTimeOut, 0);
       glutReshapeFunc(resize);
       init();
       glutMainLoop();
       return 0;
}

Penjelasan :
·         Function glMatrixMode() digunakan untuk memberikan nilai matriks atau inisialisasi matriks. 
·         Function glLoadIdentity() digunakan untuk memanggil matriks identitas dan dijadikan status matriks (proyeksi) saat ini.
·         Function gluPerspective() digunakan untuk mengatur perspektif yaitu perubahan atau pergeseran dari proyeksi.
·         Function glutPostRedisplay() digunakan untuk mengirimkan perintah untuk mengaktifkan display secara berkala (looping).
·         Function glutTimerFunc() digunakan untuk membuat sebuah animasi yang dapat dikontrol oleh waktu
·         Function glTranslatef() digunakan untuk memindahkah objek.
·         Function glRotatef() digunakan untuk memutar objek.
·         Function glutInitDisplayMode() digunakan untuk menentukan apakah akan menggunakan model pewarnaan RGB atau indek warna.
·         Function glutInitWindowSize() digunakan untuk menentukan ukuran window.
·         Function glutInitWindowPosition() digunakan untuk menentukan letak posisi suatu window
·         Function glutCreateWindow() digunakan untuk membuat window.
·         Function glutDisplayFunc() digunakan untuk memanggil fungsi display atau untuk membuat objek primitif.
·         Function glutKeyboardFunc() digunakan untuk memanggil fungsi inputan dari keyboard.
·         Function glutTimerFunc() digunakan untuk memanggil fungsi animate.
·         Function glutMainLoop() merupakan event yang menandakan pemrosesan glut terjadi.
·         Function glutReshapeFunc() digunakan untuk memanggil fungsi callback.

Saat kode program tersebut dijalankan maka akan menghasilkan 3 contoh gambar sebagai object primitif kubus yang berputar yang dapat diperbesar dan diperkecil seperti pada latihan nomor 7.






Tutorial 09 :
Tekstur Mapping dan Blending

Dalam latihan ke 9 ini kita akan membuat sebuah object kubus 3 dimensi yang dapat berputar, diberi warna dan ukurannya dapat diperbesar maupun diperkecil saat berputar dan disetiap bagian diberi gambar texture, sama dengan langkah sebelumnya (Pada Tutorial ke 1) buat sebuah Project dengan nama Tutor09 dan di tambah dengan 1 buah file header : Bmp.h, File : Bmp.cpp untuk memanggil Gambar berextention BMP, dan File : Tutor09.cpp, yang kita butuhkan kemudian anda ketikan Source Code dibawah ini

File : Bmp.h
#include <GL/glaux.h>
AUX_RGBImageRec *LoadBMP(char *Filename);

File : Bmp.cpp
#include <windows.h>
#include <stdio.h> // Header File For Standard Input/Output
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The Glaux Library
#include "bmp.h"

AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image
{
       FILE *File=NULL; // File Handle
       if (!Filename)
       // Make Sure A Filename Was Given
       {
       return NULL;
       // If Not Return NULL
       }
       File=fopen(Filename,"r"); // Check To See If The File Exists
       if (File)
       // Does The File Exist?
       {
       fclose(File);
       // Close The Handle
       return auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer
       }
       return NULL;
       // If Load Failed Return NULL
}

File : Tutor09.cpp
// OpenGL
// - Function to load bitmap
// filter=0 --> Nearest Filtered Texture
// filter=1 --> Linear Interpolation Texture
// filter=2 --> Mipmapped Texture
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>
#include "bmp.h"

float z_pos=-5.0f;
float rot=0.0f;

GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };
/* array to hold texture handles */

GLuint filter; // Which Filter To Use
GLuint texture[3]; // Storage For 3 Textures

int LoadGLTextures() //Load Bitmaps And Convert To Textures
{
       int Status=FALSE; //Status Indicator
       AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Texture
       memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
       // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
       if (TextureImage[0]=LoadBMP("Crate.bmp"))
       {
       Status=TRUE;
       // Set The Status To TRUE
       glGenTextures(3, &texture[0]); //Create Three Textures
       // Create Nearest Filtered Texture
       glBindTexture(GL_TEXTURE_2D, texture[0]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
       glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       // Create Linear Filtered Texture
       glBindTexture(GL_TEXTURE_2D, texture[1]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
       glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       // Create MipMapped Texture
       glBindTexture(GL_TEXTURE_2D, texture[2]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
       gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       }
       if (TextureImage[0]) //If Texture Exists
       {
       if (TextureImage[0]->data) //If Texture Image Exists
       {
       free(TextureImage[0]->data); // Free The Texture Image Memory
       }
       free(TextureImage[0]); //Free The Image Structure
       }
       return Status;
       // Return The Status
}

void resize(int width, int height)
{
       glViewport(0, 0, width, height);
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       gluPerspective(45.0, (float)width/(float)height, 1.0, 300.0);
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
}

void myTimeOut(int id)
{
       // called if timer event
       // ...advance the state of animation incrementally...
       rot+=10;
       glutPostRedisplay(); // request redisplay
       glutTimerFunc(100, myTimeOut, 0); // request next timer event
}

void myKeyboard(unsigned char key,int x, int y)
{
       if((key=='<')||(key==',')) z_pos-=0.1f;
       else if((key=='>')||(key=='.')) z_pos+=0.1f;
       else if((key=='F')||(key='f'))
       {
              filter+=1;
              if (filter>2)
              {
                     filter=0;
              }
              printf("filter: %i",filter);
       }
}

void mydisplay(void)
{
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
       glLoadIdentity();
       glTranslatef(0.0,0.0f,z_pos);
       glRotatef(rot, 0, 1, 0);
       glBindTexture(GL_TEXTURE_2D, texture[filter]);
       glBegin(GL_QUADS);
       // Front Face
       glColor3f(1.0,0.0,0.0);
       glNormal3f( 0.0f, 0.0f, 1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       // Back Face
       glNormal3f( 0.0f, 0.0f,-1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       // Top Face
       glNormal3f( 0.0f, 1.0f, 0.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       // Bottom Face
       glNormal3f( 0.0f,-1.0f, 0.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       // Right face
       glNormal3f( 1.0f, 0.0f, 0.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       // Left Face
       glNormal3f(-1.0f, 0.0f, 0.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glEnd();
       glFlush();
       glutSwapBuffers();
}

void init()
{
       if (!LoadGLTextures()) //Jump To Texture Loading Routine
       {
       return; //If Texture Didn't Load Return FALSE
       }
       glEnable(GL_TEXTURE_2D); //Enable Texture Mapping
       glShadeModel(GL_SMOOTH); //Enable Smooth Shading
       glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // BlackBackground
       glClearDepth(1.0f);
       // Depth Buffer Setup
       glEnable(GL_DEPTH_TEST); //Enables Depth Testing
       glDepthFunc(GL_LEQUAL); //The Type Of Depth Testing To Do
       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really NicePerspective Calculations
       glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Setup The Ambient Light
       glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // Setup The Diffuse Light
       glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // Position The Light
       glEnable(GL_LIGHT1);
       return;
}

int main(int argc, char** argv)
{
       glutInit(&argc,argv);
       glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
       glutInitWindowSize(500,500);
       glutInitWindowPosition(0,0);
       glutCreateWindow("simple");
       // callbacks
       glutDisplayFunc(mydisplay);
       glutKeyboardFunc(myKeyboard);
       glutTimerFunc(100, myTimeOut, 0);
       glutReshapeFunc(resize);
       init();
       glutMainLoop();
       return 0;
}

PENJELASAN :
Saat file Tutor09.cpp di jalankan akan terjadi Error, untuk menghindari Error tersebut, tambahkan file glaux.lib pada bagian :
Klik kanan pada Project Tutor09 anda, kemudian pilih Properties di bagian bawah popup menu,kemudian tampil dialog menu. Kemudian pilih Linker, pilih Input, pada bagian Properties, additional dependencies, klik combobox, kemudian pilih <edit>, akan tampil dialog menu, ketikan glaux.lib, pada kotak isian, kemudian klik OK, dan OK untuk dialog terakhir.
Apabila source code tersebut di jalankan, akan ditampilkan 2 buah gambar berikut, dimana object kubus berputar, dan di masing masing bagian terdapat gambar yang dimasukan melalui function LOADBMP(“Crate.bmp”)






Tutorial 10 :
Texture dengan warna blending berbeda

Dalam latihan ke 10 ini kita akan membuat sebuah object kubus 3 dimensi yang dapat berputar, diberi warna yang berbeda di tiap bagian dan ukurannya dapat diperbesar maupun diperkecil saat berputar dan disetiap bagian diberi gambar texture, sama dengan langkah sebelumnya (Pada Tutorial ke 1) buat sebuah Project dengan nama Tutor10 dan di tambah dengan 1 buah file header : Bmp.h, File : Bmp.cpp untuk memanggil Gambar berextention BMP, dan File : Tutor10.cpp, yang kita butuhkan kemudian anda ketikan Source Code dibawah ini

File : Bmp.h
#include <GL/glaux.h>
AUX_RGBImageRec *LoadBMP(char *Filename);

File : Bmp.cpp
#include <windows.h>
#include <stdio.h> // Header File For Standard Input/Output
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The Glaux Library
#include "bmp.h"

AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image
{
       FILE *File=NULL; // File Handle
       if (!Filename)
       // Make Sure A Filename Was Given
       {
       return NULL;
       // If Not Return NULL
       }
       File=fopen(Filename,"r"); // Check To See If The File Exists
       if (File)
       // Does The File Exist?
       {
       fclose(File);
       // Close The Handle
       return auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer
       }
       return NULL;
       // If Load Failed Return NULL
}

File : Tutor10.cpp
// OpenGL
// - Function to load bitmap
// filter=0 --> Nearest Filtered Texture
// filter=1 --> Linear Interpolation Texture
// filter=2 --> Mipmapped Texture
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>
#include "bmp.h"

float z_pos=-5.0f;
float rot=0.0f;

GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };
/* array to hold texture handles */

GLuint filter; // Which Filter To Use
GLuint texture[3]; // Storage For 3 Textures

int LoadGLTextures() //Load Bitmaps And Convert To Textures
{
       int Status=FALSE; //Status Indicator
       AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Texture
       memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
       // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
       if (TextureImage[0]=LoadBMP("Crate.bmp"))
       {
       Status=TRUE;
       // Set The Status To TRUE
       glGenTextures(3, &texture[0]); //Create Three Textures
       // Create Nearest Filtered Texture
       glBindTexture(GL_TEXTURE_2D, texture[0]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
       glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       // Create Linear Filtered Texture
       glBindTexture(GL_TEXTURE_2D, texture[1]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
       glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       // Create MipMapped Texture
       glBindTexture(GL_TEXTURE_2D, texture[2]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
       gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       }
       if (TextureImage[0]) //If Texture Exists
       {
       if (TextureImage[0]->data) //If Texture Image Exists
       {
       free(TextureImage[0]->data); // Free The Texture Image Memory
       }
       free(TextureImage[0]); //Free The Image Structure
       }
       return Status;
       // Return The Status
}

void resize(int width, int height)
{
       glViewport(0, 0, width, height);
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       gluPerspective(45.0, (float)width/(float)height, 1.0, 300.0);
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
}

void myTimeOut(int id)
{
       // called if timer event
       // ...advance the state of animation incrementally...
       rot+=10;
       glutPostRedisplay(); // request redisplay
       glutTimerFunc(100, myTimeOut, 0); // request next timer event
}

void myKeyboard(unsigned char key,int x, int y)
{
       if((key=='<')||(key==',')) z_pos-=0.1f;
       else if((key=='>')||(key=='.')) z_pos+=0.1f;
       else if((key=='F')||(key='f'))
       {
              filter+=1;
              if (filter>2)
              {
                     filter=0;
              }
              printf("filter: %i",filter);
       }
}

void mydisplay(void)
{
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
       glLoadIdentity();
       glTranslatef(0.0,0.0f,z_pos);
       glRotatef(rot, 0, 1, 0);
       glEnable(GL_BLEND); // Turn Blending On
       glColor3f(1.0,6.0,1.0); // Blending Color
       glBindTexture(GL_TEXTURE_2D, texture[filter]);
       glBegin(GL_QUADS);
       // Front Face
       glNormal3f( 0.0f, 0.0f, 1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       // Back Face
       glColor3f(1.0,0.0,0.0); // Blending Color
       glNormal3f( 0.0f, 0.0f,-1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       // Top Face
       glColor3f(0.0,0.0,1.0); // Blending Color
       glNormal3f( 0.0f, 1.0f, 0.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       // Bottom Face
       glColor3f(0.0,1.0,0.0); // Blending Color
       glNormal3f( 0.0f,-1.0f, 0.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       // Right face
       glColor3f(5.0,0.0,0.0); // Blending Color
       glNormal3f( 1.0f, 0.0f, 0.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       // Left Face
       glColor3f(0.0,0.0,3.0); // Blending Color
       glNormal3f(-1.0f, 0.0f, 0.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glEnd();
       glFlush();
       glutSwapBuffers();
}

void init()
{
       if (!LoadGLTextures()) //Jump To Texture Loading Routine
       {
       return; //If Texture Didn't Load Return FALSE
       }
       glEnable(GL_TEXTURE_2D); //Enable Texture Mapping
       glShadeModel(GL_SMOOTH); //Enable Smooth Shading
       glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // BlackBackground
       glClearDepth(1.0f);
       // Depth Buffer Setup
       glEnable(GL_DEPTH_TEST); //Enables Depth Testing
       glDepthFunc(GL_LEQUAL); //The Type Of Depth Testing To Do
       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really NicePerspective Calculations
       glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Setup The Ambient Light
       glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // Setup The Diffuse Light
       glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // Position The Light
       glEnable(GL_LIGHT1);
       return;
}

int main(int argc, char** argv)
{
       glutInit(&argc,argv);
       glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
       glutInitWindowSize(500,500);
       glutInitWindowPosition(0,0);
       glutCreateWindow("simple");
       // callbacks
       glutDisplayFunc(mydisplay);
       glutKeyboardFunc(myKeyboard);
       glutTimerFunc(100, myTimeOut, 0);
       glutReshapeFunc(resize);
       init();
       glutMainLoop();
       return 0;
}

PENJELASAN :
Saat file Tutor10.cpp di jalankan akan terjadi Error, untuk menghindari Error tersebut, tambahkan file glaux.lib pada bagian :
Klik kanan pada Project Tutor10 anda, kemudian pilih Properties di bagian bawah popup menu,kemudian tampil dialog menu. Kemudian pilih Linker, pilih Input, pada bagian Properties, additional dependencies, klik combobox, kemudian pilih <edit>, akan tampil dialog menu, ketikan glaux.lib, pada kotak isian, kemudian klik OK, dan OK untuk dialog terakhir.
Apabila source code tersebut di jalankan, akan ditampilkan 2 buah gambar berikut, dimana object kubus berputar dan setiap bagian texture warnanya berbeda beda yang di setting pada mydisplay(), dan di masing masing bagian terdapat gambar yang dimasukan melalui function LOADBMP(“Crate.bmp”)





Tutorial 11 :
Transparansi (Blending Transparan)

Dalam latihan ke 11 ini kita akan membuat sebuah object kubus 3 dimensi yang dapat berputar, diberi warna dan ukurannya dapat diperbesar maupun diperkecil saat berputar dan disetiap bagian diberi gambar texture yang dapat terlihat secara transparan semuanya, sama dengan langkah sebelumnya (Pada Tutorial ke 1) buat sebuah Project dengan nama Tutor11 dan di tambah dengan 1 buah file header : Bmp.h, File : Bmp.cpp untuk memanggil Gambar berextention BMP, dan File : Tutor11.cpp, yang kita butuhkan kemudian anda ketikan Source Code dibawah ini

File : Bmp.h
#include <GL/glaux.h>
AUX_RGBImageRec *LoadBMP(char *Filename);

File : Bmp.cpp
#include <windows.h>
#include <stdio.h> // Header File For Standard Input/Output
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The Glaux Library
#include "bmp.h"

AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image
{
       FILE *File=NULL; // File Handle
       if (!Filename)
       // Make Sure A Filename Was Given
       {
       return NULL;
       // If Not Return NULL
       }
       File=fopen(Filename,"r"); // Check To See If The File Exists
       if (File)
       // Does The File Exist?
       {
       fclose(File);
       // Close The Handle
       return auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer
       }
       return NULL;
       // If Load Failed Return NULL
}

File : Tutor11.cpp
// OpenGL
// - Function to load bitmap
// filter=0 --> Nearest Filtered Texture
// filter=1 --> Linear Interpolation Texture
// filter=2 --> Mipmapped Texture
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>
#include "bmp.h"

float z_pos=-5.0f;
float rot=0.0f;

GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };
/* array to hold texture handles */

GLuint filter; // Which Filter To Use
GLuint texture[3]; // Storage For 3 Textures

int LoadGLTextures() //Load Bitmaps And Convert To Textures
{
       int Status=FALSE; //Status Indicator
       AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Texture
       memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
       // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
       if (TextureImage[0]=LoadBMP("Crate.bmp"))
       {
       Status=TRUE;
       // Set The Status To TRUE
       glGenTextures(3, &texture[0]); //Create Three Textures
       // Create Nearest Filtered Texture
       glBindTexture(GL_TEXTURE_2D, texture[0]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
       glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       // Create Linear Filtered Texture
       glBindTexture(GL_TEXTURE_2D, texture[1]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
       glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       // Create MipMapped Texture
       glBindTexture(GL_TEXTURE_2D, texture[2]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
       gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       }
       if (TextureImage[0]) //If Texture Exists
       {
       if (TextureImage[0]->data) //If Texture Image Exists
       {
       free(TextureImage[0]->data); // Free The Texture Image Memory
       }
       free(TextureImage[0]); //Free The Image Structure
       }
       return Status;
       // Return The Status
}

void resize(int width, int height)
{
       glViewport(0, 0, width, height);
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       gluPerspective(45.0, (float)width/(float)height, 1.0, 300.0);
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
}

void myTimeOut(int id)
{
       // called if timer event
       // ...advance the state of animation incrementally...
       rot+=10;
       glutPostRedisplay(); // request redisplay
       glutTimerFunc(100, myTimeOut, 0); // request next timer event
}

void myKeyboard(unsigned char key,int x, int y)
{
       if((key=='<')||(key==',')) z_pos-=0.1f;
       else if((key=='>')||(key=='.')) z_pos+=0.1f;
       else if((key=='F')||(key='f'))
       {
              filter+=1;
              if (filter>2)
              {
                     filter=0;
              }
              printf("filter: %i",filter);
       }
}

void mydisplay(void)
{
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
       glLoadIdentity();
       glTranslatef(0.0,0.0f,z_pos);
       glRotatef(rot, 0, 1, 0);
       glBindTexture(GL_TEXTURE_2D, texture[filter]);
       glEnable(GL_BLEND); // Turn Blending On
       glDisable(GL_DEPTH_TEST); // Turn Depth Testing Off
       glBegin(GL_QUADS);
       // Front Face
       glNormal3f( 0.0f, 0.0f, 1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       // Back Face
       glNormal3f( 0.0f, 0.0f,-1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       // Top Face
       glNormal3f( 0.0f, 1.0f, 0.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       // Bottom Face
       glNormal3f( 0.0f,-1.0f, 0.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       // Right face
       glNormal3f( 1.0f, 0.0f, 0.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       // Left Face
       glNormal3f(-1.0f, 0.0f, 0.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glEnd();
       glFlush();
       glutSwapBuffers();
}

void init()
{
       if (!LoadGLTextures())
       // Jump To Texture Loading Routine
       {
       return;
       // If Texture Didn't Load Return FALSE
       }
       glEnable(GL_TEXTURE_2D); //Enable Texture Mapping
       glShadeModel(GL_SMOOTH); //Enable Smooth Shading
       glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
       glClearDepth(1.0f);
       // Depth Buffer Setup
       glEnable(GL_DEPTH_TEST); //Enables Depth Testing
       glDepthFunc(GL_LEQUAL);
       // The Type Of Depth Testing To Do
       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
       glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Setup The Ambient Light
       glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // Setup The Diffuse Light
       glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // Position The Light
       glEnable(GL_LIGHT1);
       glColor4f(1.0f, 1.0f, 1.0f, 0.5); // Full Brightness. 50% Alpha
       glBlendFunc(GL_SRC_ALPHA,GL_ONE);
       return;
}

int main(int argc, char** argv)
{
       glutInit(&argc,argv);
       glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
       glutInitWindowSize(500,500);
       glutInitWindowPosition(0,0);
       glutCreateWindow("simple");
       // callbacks
       glutDisplayFunc(mydisplay);
       glutKeyboardFunc(myKeyboard);
       glutTimerFunc(100, myTimeOut, 0);
       glutReshapeFunc(resize);
       init();
       glutMainLoop();
       return 0;
}

PENJELASAN :
·         Function glColor4f(1.0f, 1.0f, 1.0f, 0.5) berguna
·         Function glBlendFunc(GL_SRC_ALPHA,GL_ONE) berguna
Saat file Tutor11.cpp di jalankan akan terjadi Error, untuk menghindari Error tersebut, tambahkan file glaux.lib pada bagian :
Klik kanan pada Project Tutor11 anda, kemudian pilih Properties di bagian bawah popup menu,kemudian tampil dialog menu. Kemudian pilih Linker, pilih Input, pada bagian Properties, additional dependencies, klik combobox, kemudian pilih <edit>, akan tampil dialog menu, ketikan glaux.lib, pada kotak isian, kemudian klik OK, dan OK untuk dialog terakhir.
Apabila source code tersebut di jalankan, akan ditampilkan gambar berikut, dimana object kubus berputar dan setiap bagian texture semuanya menjadi tranparant yang di setting pada mydisplay(), dan di masing masing bagian terdapat gambar yang dimasukan melalui function LOADBMP(“Crate.bmp”)


Dan jika dirubah pada bagian mydisplay(), beberapa kode program seperti berikut ini :

void mydisplay(void)
{
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
       glLoadIdentity();
       glTranslatef(0.0,0.0f,z_pos);
       glRotatef(rot, 0, 1, 0);
       glBindTexture(GL_TEXTURE_2D, texture[filter]);
       glEnable(GL_BLEND); // Turn Blending On
       glDisable(GL_DEPTH_TEST); // Turn Depth Testing Off
       glBegin(GL_QUADS);
       // Front Face
       glNormal3f( 0.0f, 0.0f, 1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       // Back Face
       glNormal3f( 0.0f, 0.0f,-1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       // Top Face
       glColor3f(0.0,0.0,1.0); // Blending Color
       glNormal3f( 0.0f, 1.0f, 0.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       // Bottom Face
       glColor3f(0.0,1.0,0.0); // Blending Color
       glNormal3f( 0.0f,-1.0f, 0.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       // Right face
       glColor3f(5.0,0.0,0.0); // Blending Color
       glNormal3f( 1.0f, 0.0f, 0.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);

       // Left Face
       glNormal3f(-1.0f, 0.0f, 0.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glEnd();
       glFlush();
       glutSwapBuffers();
}

Maka akan menghasilkan gambar transparant pada bagian tertentu saja, seperti gambar dibawah ini.



Tutorial 12 :
Fog atau kabut

Dalam latihan ke 12 ini kita akan membuat sebuah object kubus 3 dimensi yang dapat berputar, diberi tampilan awan berkabut, dan dapat berubah menjadi agak jelas jika di tekan tombol G dan ukurannya dapat diperbesar maupun diperkecil saat berputar dan disetiap bagian diberi gambar texture, sama dengan langkah sebelumnya (Pada Tutorial ke 1) buat sebuah Project dengan nama Tutor12 dan di tambah dengan 1 buah file header : Bmp.h, File : Bmp.cpp untuk memanggil Gambar berextention BMP, dan File : Tutor12.cpp, yang kita butuhkan kemudian anda ketikan Source Code dibawah ini

File : Bmp.h
#include <GL/glaux.h>
AUX_RGBImageRec *LoadBMP(char *Filename);

File : Bmp.cpp
#include <windows.h>
#include <stdio.h> // Header File For Standard Input/Output
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The Glaux Library
#include "bmp.h"

AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image
{
       FILE *File=NULL; // File Handle
       if (!Filename)
       // Make Sure A Filename Was Given
       {
       return NULL;
       // If Not Return NULL
       }
       File=fopen(Filename,"r"); // Check To See If The File Exists
       if (File)
       // Does The File Exist?
       {
       fclose(File);
       // Close The Handle
       return auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer
       }
       return NULL;
       // If Load Failed Return NULL
}

File : Tutor12.cpp
// OpenGL
// - Fog Filter
// fogfilter=0 --> Nearest Filtered Texture
// fogfilter=1 --> Linear Interpolation Texture
// fogfilter=2 --> Mipmapped Texture
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <GL/glut.h>
#include "bmp.h"

float z_pos=-5.0f;
float rot=0.0f;
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };
/* array to hold texture handles */
GLuint filter; // Which Filter To Use
GLuint texture[3]; // Storage For 3 Textures
// Fog
bool gp;
GLuint fogfilter;
GLuint fogMode[]={GL_EXP, GL_EXP2, GL_LINEAR};
GLfloat fogColor[4]={0.5f, 0.5f, 0.5f, 1.0f};

int LoadGLTextures() //Load Bitmaps And Convert To Textures
{
       int Status=FALSE; //Status Indicator

       AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Texture
       memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
       // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
       if (TextureImage[0]=LoadBMP("Crate.bmp"))
       {
       Status=TRUE;
       // Set The Status To TRUE
       glGenTextures(3, &texture[0]); //Create Three Textures
       // Create Nearest Filtered Texture
       glBindTexture(GL_TEXTURE_2D, texture[0]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
       glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       // Create Linear Filtered Texture
       glBindTexture(GL_TEXTURE_2D, texture[1]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
       glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       // Create MipMapped Texture
       glBindTexture(GL_TEXTURE_2D, texture[2]);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
       gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX,
       TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
       }
       if (TextureImage[0]) //If Texture Exists
       {
       if (TextureImage[0]->data) //If Texture Image Exists
       {
       free(TextureImage[0]->data); // Free The Texture Image Memory
       }
       free(TextureImage[0]); //Free The Image Structure
       }

       return Status;
       // Return The Status
}

void resize(int width, int height)
{
       glViewport(0, 0, width, height);
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       gluPerspective(45.0, (float)width/(float)height, 1.0, 300.0);
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
}

void myTimeOut(int id)
{
       // called if timer event
       // ...advance the state of animation incrementally...
       rot+=1;
       glutPostRedisplay(); // request redisplay
       glutTimerFunc(100, myTimeOut, 0); // request next timer event
}

void myKeyboard(unsigned char key,int x, int y)
{
       if((key=='<')||(key==',')) z_pos-=0.1f;
       else if((key=='>')||(key=='.')) z_pos+=0.1f;
       else if((key=='F')||(key='f'))
       {
              filter+=1;
              if (filter>2)
              {
                     filter=0;
              }
              printf("filter: %i \n",filter);
              }
       else if( (key=='G') || (key=='g'))
       {
              if(gp==FALSE)
              {
                     gp=TRUE;
                     fogfilter+=1;
              if (fogfilter>2) // Is fogfilter Greater Than 2?
              {
      
              }
              glFogi (GL_FOG_MODE, fogMode[fogfilter]); // Fog Mode
       } else
       {
              gp=FALSE;
       }
       printf("filter: %i \n",fogfilter);
       }
}

void mydisplay(void)
{
       glEnable(GL_DEPTH_TEST);
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
       glLoadIdentity();
       glTranslatef(0.0,0.0f,z_pos);
       glRotatef(rot, 0, 1, 0);
       glBindTexture(GL_TEXTURE_2D, texture[filter]);
       glBegin(GL_QUADS);
       // Front Face
       glNormal3f( 0.0f, 0.0f, 1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       // Back Face
       glNormal3f( 0.0f, 0.0f,-1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       // Top Face
       glNormal3f( 0.0f, 1.0f, 0.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       // Bottom Face
       glNormal3f( 0.0f,-1.0f, 0.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       // Right face
       glNormal3f( 1.0f, 0.0f, 0.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
       // Left Face
       glNormal3f(-1.0f, 0.0f, 0.0f);
       glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
       glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
       glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
       glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
       glEnd();
       glFlush();
       glutSwapBuffers();
}

void init()
{
       if (!LoadGLTextures()) //Jump To Texture Loading Routine
       {
       return; //If Texture Didn't Load Return FALSE
       }
       glEnable(GL_TEXTURE_2D); //Enable Texture Mapping
       glShadeModel(GL_SMOOTH); //Enable Smooth Shading
       // FOG
       glClearColor(0.5f,0.5f,0.5f,1.0f); // We'll Clear To The Color Of The Fog
       glFogi(GL_FOG_MODE, fogMode[fogfilter]); // Fog Mode
       glFogfv(GL_FOG_COLOR, fogColor); // Set Fog Color
       glFogf(GL_FOG_DENSITY, 0.35f); // How Dense Will The Fog Be
       glHint(GL_FOG_HINT, GL_DONT_CARE); // Fog Hint Value
       glFogf(GL_FOG_START, 100.0f); // Fog Start Depth
       glFogf(GL_FOG_END, 1000.0f); // Fog End Depth
       glEnable(GL_FOG);
       glClearDepth(1.0f);
       // Depth Buffer Setup
       glEnable(GL_DEPTH_TEST); //Enables Depth Testing
       glDepthFunc(GL_LEQUAL); //The Type Of Depth Testing To Do
       glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Setup The Ambient Light
       glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // Setup The Diffuse Light
       glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // Position The Light
       glEnable(GL_LIGHT1);
       return;
}
int main(int argc, char** argv)
{
       glutInit(&argc,argv);
       glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
       glutInitWindowSize(500,500);
       glutInitWindowPosition(0,0);
       glutCreateWindow("simple");
       // callbacks
       glutDisplayFunc(mydisplay);
       glutKeyboardFunc(myKeyboard);
       glutTimerFunc(100, myTimeOut, 0);

       glutReshapeFunc(resize);
       init();
       glutMainLoop();
       return 0;
}

PENJELASAN :
·         Functioan glFogi(GL_FOG_MODE, fogMode[fogfilter]) menentukan mode fog dengan variabel array fogMode. Variabel fogMode diinisialisasi dengan tiga nilai, yaitu GL_EXP, GL_EXP2, dan GL_LINEAR.
-      GL_EXP – fog standar yang dirender pada keseluruhan screen. Efek fognya tidak terlalu terlihat namun jenis yang paling cepat dirender.
-      GL_EXP2 – fog jenis ini juga mirip dengan GL_EXP, hanya akan memberikan kesan dalam pada scene.
-      GL_LINEAR – pada fog jenis ini, efek fog diinterpolasi secara linier bergantung jarak dengan kamera sehingga didapat efek yang lebih baik.
·         Functioan glFogfv(GL_FOG_COLOR, fogcolor) menentukan warna dari fog.
·         Functioan glFogf(GL_FOG_DENSITY, 0.35f) menentukan seberapa padat kabutnya. Semakin tinggi nilainy, semakin pekat kabut yang dihasilkan.
·         Functioan glHint (GL_FOG_HINT, GL_DONT_CARE) memberikan informasi kepada OpenGL tentang bagaimana proses rendering ingin dilakukan.
-      gl_dont_care – terserah openGL
-      gl_nicest – perhitungan fog dilakukan per-pixel.
-      gl_fastest – perhitungan fog dilakukan per-vertex yang berarti lebih cepat tapi lebih tidak akurat.
·         glFogf(GL_FOG_START, 1.0f); menentukan jarak dari kamera ketika fog mulai.
·         glFogf(GL_FOG_END, 5.0f); menentukan sejauh mana kabut masih berefek.

Saat file Tutor12.cpp di jalankan akan terjadi Error, untuk menghindari Error tersebut, tambahkan file glaux.lib pada bagian :
Klik kanan pada Project Tutor12 anda, kemudian pilih Properties di bagian bawah popup menu,kemudian tampil dialog menu. Kemudian pilih Linker, pilih Input, pada bagian Properties, additional dependencies, klik combobox, kemudian pilih <edit>, akan tampil dialog menu, ketikan glaux.lib, pada kotak isian, kemudian klik OK, dan OK untuk dialog terakhir.
Apabila source code tersebut di jalankan, akan ditampilkan gambar berikut, dimana object kubus berputar dan setiap bagian texture semuanya tertutup awan yang di setting pada mydisplay(), dan di masing masing bagian terdapat gambar yang dimasukan melalui function LOADBMP(“Crate.bmp”), dimana jika di tekan tombol G atau g gambar akan lebih jelas terlihat









5 komentar: