Tutorial Melayu

OpenGL: Buffering berganda (double buffering)

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: Buffering berganda (double buffering)

Posted on .

Artikel kali ini hanya akan menerangkan tentang double buffering. Dalam artikel-artikel sebelum ini kita menggunakan single buffering. Buffer yang diperkatakan dalam artikel ini adalah ruang memori yang digunakan oleh OpenGL untuk “melukis”. Jadi dengan menggunakan dua ruang memori, OpenGL boleh melukis tanpa lebih dahulu memaparkannya ke atas skrin pengguna. Jadi sementara buffer pertama digunakan untuk mengemaskini dunia 3D, buffer kedua boleh digunakan untuk dipaparkan kepada pengguna (buffer ini mempunyai kanduangan dari frame terdahulu).

Untuk menggunakan buffering berganda ini anda hanya perlu menukar glFlush() menjadi glSwapBuffers() dan menukar glutInitDisplayMode(GLUT_SINGLE) menjadi glutInitDisplayMode(GLUT_DOUBLE).

main.cpp

#include 
#include 

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); // Kosongkan buffer warna
	glLoadIdentity(); // 
	glTranslatef(0.0f, 0.0f, -5.0f);  // alihkan kamera menjauhi paksi z 
 	//binaPrimitif();   // Bina bentuk primitif
	
	glTranslatef(0.0f, lokasi_y, 0.0f);   
	glRotatef(sudut_y, 0.0f, 1.0f, 0.0f);

	glutWireSphere(1.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);
 
	glutInitWindowSize (500, 500); 
	glutInitWindowPosition (100, 100);
	glutCreateWindow ("Tetingkap pertama saya");
 
	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