OpenGL/Contoh Asas Open GL
OpenGL adalah bahasa pengaturcaraan yang utama bagi membangunkan interaktif aplikasi grafik 2D dan 3D. Sejak diperkenalkan pada tahun 1992, OpenGL telah menjadi industri yang paling meluas digunakan dalam aplikasi antara muka (API) untuk pelbagai platform komputer. OpenGL memupuk inovasi dan mempercepatkan pembangunan aplikasi dengan menggabungkan satu set luas rendering, pemetaan tekstur, kesan khas, dan lain-lain fungsi visualisasi. Tinggi Kualiti Visual dan Prestasi
#include <stdlib.h>
#include <GLUT/glut.h> //file header ini mengandungi semua arahan bagi Open GL Utility Kit
#include <GL/glut.h>
int main(int argc, char **argv) {
// init GLUT and buat window
// register callbacks
// enter GLUT event processing cycle
}
Ini pula c++ code yang lebih sempurna tetapi apabila code ini di-run hanya akan mengeluarkan black console kerana tiada rendering function.
#include <stdlib.h><br />
#include <GLUT/glut.h><br />
int main(int argc, char **argv) {<br />
// init GLUT dan buat window<br />
glutInit(&argc, argv);<br />
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);<br />
glutInitWindowPosition(100,100);<br />
glutInitWindowSize(320,320);<br />
glutCreateWindow("Lighthouse3D- GLUT Tutorial");<br /><br />
return 1;
}
Pengawalan kod
suntingBagi mewujudkan rendering function supaya terdapat animasi, perlu letak fuction dan callback dalam main function. Code ini akan mengeluarkan segitiga berwarna putih.
#include <stdlib.h>
#include <GLUT/glut.h>
void renderScene(void) { // rendering function
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES); //glBegin(menerima 1 argument bagaimana vertices akan digunakan)
//GL_TRIANGLES menerima 3 vertices sebagai satu independent triangle.
glVertex3f(-0.5,-0.5,0.0); //void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
glVertex3f(0.5,0.0,0.0);
glVertex3f(0.0,0.5,0.0);
glEnd(); //must included for every void glBegin(GLenum mode);
glutSwapBuffers();
}
int main(int argc, char **argv) {
// init GLUT dan buat window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("Lighthouse3D- GLUT Tutorial");
// register callbacks
glutDisplayFunc(renderScene);
// enter GLUT event processing cycle
glutMainLoop();
return 1;
}
Bagi mengelakkan bentuk segitiga itu berubah apabila window diubah size nya, kita perlu letak void glutReshapeFunc(void (*func)(int width, int height));
void changeSize(int w, int h) {
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if(h == 0)
h = 1;
float ratio = 1.0* w / h;
// Use the Projection Matrix
glMatrixMode(GL_PROJECTION);
// Reset Matrix
glLoadIdentity();
// Set the viewport to be the entire window
glViewport(0, 0, w, h);
// Set the correct perspective.
gluPerspective(45,ratio,1,1000);
// Get Back to the Modelview
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char **argv) {
// register callbacks
glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);
Animasi
segi tiga tersebut boleh digerakkan dengan menggunakan beberapa callback function. Langkah pertama, Glut perlu diberitahu sekiranya applikasi di dalam keadaan sedia, render function perlu dipanggil. langkah ini akan menyebabkan renderfunction akan sentiasa dipanggil, seterusnya membenarkan animasi. fungsi tersebut ialah glutidlefunction. Fungsi ini telah tersedia di dalam GLUT. Fungsi ini akan membenarkan anda mendaftar callback function untuk dipanggil ketika aplikasi dalam keadaan sedia.
glutIdleFunc(renderScene); // perlu dimasukkan dalam main function
void changeSize(int w, int h) {
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if (h == 0)
h = 1;
float ratio = w * 1.0 / h;
// Use the Projection Matrix
glMatrixMode(GL_PROJECTION);
// Reset Matrix
glLoadIdentity();
// Set the viewport to be the entire window
glViewport(0, 0, w, h);
// Set the correct perspective.
gluPerspective(45.0f, ratio, 0.1f, 100.0f);
// Get Back to the Modelview
glMatrixMode(GL_MODELVIEW);
}
float angle = 0.0f;
void renderScene(void) {
// Clear Color and Depth Buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Reset transformations
glLoadIdentity();
// Set the camera
gluLookAt( 0.0f, 0.0f, 10.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
glRotatef(angle, 0.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex3f(-2.0f,-2.0f, 0.0f);
glVertex3f( 2.0f, 0.0f, 0.0);
glVertex3f( 0.0f, 2.0f, 0.0);
glEnd();
angle+=0.1f;
glutSwapBuffers();
}
int main(int argc, char **argv) {
// init GLUT and create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("Lighthouse3D- GLUT Tutorial");
// register callbacks
glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);
glutIdleFunc(renderScene);
// enter GLUT event processing cycle
glutMainLoop();
return 1;
}