Tutorial Melayu

OpenGL: Pencahayaan

Introduction

user

Fairuz

System Engineer (Texas Instruments France), Masters in Electronics , Embedded System Engineering,


LATEST POSTS

Nota: git alias yang biasa digunakan 05th December, 2013

Nota: Android .gitignore 23rd February, 2013

OpenGL

OpenGL: Pencahayaan

Posted on .

Salah satu subjek menarik dalam dunia grafik 3D adalah pencahayaan. Dengan pencahayaan yang baik, setiap objek 3D boleh kelihatan lebih realistik di atas skrin. Selain itu, secara umumnya, dengan pencahayaanlah kita boleh memberi efek bahawa objek yang dipaparkan pada skrin 2D kelihatan seperti objek 3D.

Untuk menggunakan pencahayaan dalam OpenGL, kita hanya perlu mengaktifkannya dengan beberapa panggilan fungsi OpenGL. Selain itu, kita juga perlu mengaktifkan buffer kedalaman yang akan digunakan OpenGL untuk pengiraan matrix untuk mengaplikasikan warna yang betul pada bentuk 3D ini.


glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

Ini boleh dilakukan dalam fungsi main.


glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Seperti mana kita mengosongkan buffer warna, kita juga perlu mengosongkan buffer kedalaman.

Kompil kod ini. Setakat ini anda hanya akan dapat melihat cahaya putih sahaja. Bentuk-bentuk 3D yang kita lukis juga akan kehilangan warna dan hanya dicerahi oleh cahaya berwarna putih. Untuk mendapatkan kembali warna bentuk anda, tambah kod di bawah di dalam fungsi main.


glEnable(GL_COLOR_MATERIAL);

Sekarang anda akan mendapat yang kita mendapat kesan cahaya pada sfera yang berwarna hijau.


#include <GL/glew.h>
#include <GL/glut.h>

bool naik = false; // arah
float lokasi_y = 0.0f; // lokasi pada paksi y
float sudut_y = 0.0f; // sudut pada paksi y

void binaPrimitif(void){
glBegin(GL_QUADS);
glColor3f(0.0f, 0.0f, 1.0f); // bucu berwarna biru
glVertex3f(-1.0f, -1.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f); // bucu berwarna merah
glVertex3f(-1.0f, 1.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f); // bucu berwarna hijau
glVertex3f(1.0f, 1.0f, 0.0f);
glColor3f(1.0f, 1.0f, 0.0f); // bucu berwarna kuning
glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();
}

void tekanKekunci(unsigned char key, int x, int y) {
switch (key) {
case 27: // Keluar dari program
exit(0) ;
break ;
default:
break ;
}
}

void lepasKekunci(unsigned char key, int x, int y) {

}

void papar(void){
if (naik) // arah ke atas
lokasi_y -= 0.1f; // gerak ke atas pada paksi y
else // arah ke bawah
lokasi_y += 0.1f; // gerak ke bawah pada paksi y

if (lokasi_y < -2.0f) // had atas
naik = false; // tukar arah
else if (lokasi_y > 2.0f) // had bawah
naik = true; // tukar arah

sudut_y += 1.0f; // putaran
if (sudut_y > 360.0f) // jika lebih 360 darjah, tolak 360
sudut_y -= 360.0f;

glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Tukar background kepada warna merah
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Kosongkan buffer warna
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glLoadIdentity(); //
glTranslatef(0.0f, 0.0f, -5.0f); // alihkan kamera menjauhi paksi z
//binaPrimitif(); // Bina bentuk primitif
//glScalef(1, 2.0, 1);
//glTranslatef(0.0f, lokasi_y, 0.0f);
glRotatef(sudut_y, 0.0f, 1.0f, 0.0f);

//glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
//glutWireSphere(1.0f, 8.0f, 8.0f);
glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
glutSolidSphere(2.0f, 8.0f, 8.0f);

glutSwapBuffers();
}

void reshape(int width, int height){
glViewport(0, 0, (GLsizei)width, (GLsizei)height); //
glMatrixMode(GL_PROJECTION); // Tukar kepada projection matrix
glLoadIdentity(); //
gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 100.0); // fov, aspect ratio, near and far plane
glMatrixMode(GL_MODELVIEW); // Tukar semula ke modelview matrix
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow ("Tetingkap pertama saya");

glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);

glutDisplayFunc(papar);
glutIdleFunc(papar);
glutReshapeFunc(reshape);
glutKeyboardFunc(tekanKekunci);
glutKeyboardUpFunc(lepasKekunci);

glutMainLoop();
return 0;
}
profile

Fairuz

http://www.tutorialmelayu.com

System Engineer (Texas Instruments France), Masters in Electronics , Embedded System Engineering,

There are no comments.

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

View Comments (0) ...
Navigation