OpenGL/Contoh Asas Open GL

Daripada Wikibooks
Pergi ke navigasi Pergi ke carian

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[sunting]

Bagi 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;
}