Tutorial Melayu

OpenGL: Blending

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: Blending

Posted on .

Untuk kali ini kita akan melihat bagaimana untuk melakukan blending dengan melukis satu sfera kecil di dalam sebuah lagi sfera yang lebih besar dan melakukan blending pada sfera besar supaya sfera kecil boleh dilihat.

Untuk itu, kita memerlukan buffer untuk blending.

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

Dan kita perlu mengaktifkan fungsi alpha blending dalam fungsi papar.

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

Kemudian kita boleh terus melukis dua sfera yang berlainan saiz tadi. Untuk nota, sfera kecil mempunyai saiz ukur sebanayak 1 unit dan berwarna hitam manakala sfera besar bersaiz ukur 2 unit dan berwarna hijau.

glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
glutSolidSphere(1.0f, 8.0f, 8.0f);
glColor4f(0.0f, 1.0f, 0.0f, 0.3f);
glutSolidSphere(2.0f, 8.0f, 8.0f);

Ini merupakan kod penuh bagi artikel kali ini. Cuba untuk menukar nilai alpha sfera yang besar kepada legap sepenuhnya, dan anda sepatutnya tidak akan nampak lagi sfera kecil yang berada di dalamnya. 0.0 merujuk kepada transparen penuh manakala 1.0 adalah legap.

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

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
	glEnable(GL_BLEND);
	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
	
	//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);
	glutSolidSphere(1.0f, 8.0f, 8.0f);
	glColor4f(0.0f, 1.0f, 0.0f, 0.3f);
	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);
 
	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,

Comments
user

Author haris

Posted at 4:17 pm September 17, 2013.

salam saudara fairuz….saya ingin memohon jasa baik fairuz untuk menerangkan dan membantu saya dalam c++ dan matlab….saya student utm…harap fairuz dapat menolong saya….0133893272. .haris..tolonglah fairuz…saya nak lulus subjek ni..thanks…salam

Reply

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 (1) ...
Navigation