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
mantap
BalasHapusi liked broo thanks for tutorial
BalasHapusjika buat 2D lingkaran berubah warna sendiri bagaimana ya gan...??
BalasHapussource code poligon 3 dimensi 8 titik dong bang plis
BalasHapusGan cara buat awan gimana ya
BalasHapus