OpenGL
OpenGL: Bentuk primitif
Posted on .Dalam artikel ke-empat dalam siri OpenGL ini, kita akan melihat bagaimana untuk “melukis” bentuk-bentuk primitif seperti petak, poligon, dan segitiga.
Terdapat beberapa betuk primitif dalam OpenGL tetapi dalam artikel ini saya hanya akan menunjukkan cara untuk melukis bentuk petak.
Bentuk-bentuk primitif:
- GL_LINES
- GL_LINE_STRIP
- GL_LINE_LOOP
- GL_POINTS
- GL_POLYGON
- GL_QUADS
- GL_QUAD_STRIP
- GL_TRIANGLES
- GL_TRIANGLE_FAN
- GL_TRIANGLE_STRIP
Untuk menyenangkan pemahaman, kita akan membina satu fungsi baru yang akan kita namakan binaPrimitif()
void binaPrimitif(void){
}
Dan kita akan memanggil fungsi ini di dalam fungsi papar supaya setiap kali fungsi papar dipanggil untuk lukisan semula, fungsi binaPrimitif ini juga akan turut dipanggil.
void papar(void){
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Tukar background kepada warna merah
glClear(GL_COLOR_BUFFER_BIT); // Kosongkan buffer warna
glLoadIdentity(); //
glTranslatef(0.0f, 0.0f, -5.0f); // alihkan scene 5 unit pada paksi z
binaPrimitif(); // Bina bentuk primitif
glFlush(); // Hantar buffer ke tetingkap
}
Ok, sekarang kita mempunyai fungsi untuk melukis bentuk primitif. Langkah seterusnya adalah untuk melukis bentuk primitif (dalam kes ini bentuk petak). Untuk melukis sesuatu bentuk geometri, kita akan menggunakan dua fungsi OpenGL iaitu glBegin dan glEnd.
void binaPrimitif(void){
glBegin(GL_QUADS);
glEnd();
}
Langkah seterusnya adalah untuk membekalkan data vertex untuk setiap bucu bentuk yang dilukis kepada OpenGL. Dalam kes bentuk petak, kita mempunyai empat bucu, jadi kita akan membina empat vertex.
void binaPrimitif(void){
glBegin(GL_QUADS);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();
}
Kompil kod ini, dan anda sepatutnya dapat melihat bentuk petak anda di dalam tetingkap OpenGL.
main.cpp
#include
#include
void binaPrimitif(void){
glBegin(GL_QUADS);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
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){
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Tukar background kepada warna merah
glClear(GL_COLOR_BUFFER_BIT); // Kosongkan buffer warna
glLoadIdentity(); //
glTranslatef(0.0f, 0.0f, -5.0f); // alihkan kamera menjauhi paksi z
binaPrimitif(); // Bina bentuk primitif
glFlush(); // Hantar buffer ke tetingkap
}
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_SINGLE);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow ("Tetingkap pertama saya");
// Now, we define callbacks and functions for various tasks.
glutDisplayFunc(papar);
glutReshapeFunc(reshape);
glutKeyboardFunc(tekanKekunci);
glutKeyboardUpFunc(lepasKekunci);
glutMainLoop(); // Start the main code
return 0; /* ANSI C requires main to return int. */
}
Fairuz
http://www.tutorialmelayu.comSystem Engineer (Texas Instruments France), Masters in Electronics , Embedded System Engineering,
There are no comments.