⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawglscene.cpp

📁 environment_mapped_bump_mapping using opengl
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_BUMP_ENVMAP_ATI);
	glTexEnvi(GL_TEXTURE_ENV, GL_BUMP_TARGET_ATI, GL_TEXTURE1_ARB);

Ja to vyuzivam takto:
	Sphere map obsahuje farbu pre kazdy smer odrazu luca.
	Pre odrazeny luc r sa vypocitavaju texturove koordinacie:
	m = 2*sqrt( r.x^2 + r.y^2 + (1 + r.z)^2 )
	s = r.x/m + 0.5
	t = r.y/m + 0.5
	ak bude r=0,0,1 tak s=0.5, t=0.5
	ak bude r=1,0,0 tak s>0.5, t=0.5
	ak bude r=0,1,0 tak s=0.5, t>0.5
	
	My potrebujeme zo sphere mapy citat tak aby tam kde je povrch hrbolaty,
	sme precitaly spravny bod. Potrebujeme sa pri citani posunut.
	Ak oznacime texturove koordinacie s1,t1, ktore vyjadruju texel pre gulu.
	s2,t2 koordinacie, ktore vyjadruju texel pre hrbolatu gulu.
	mozeme vypocitat posun:
	ds = s2-s1;
	dt = s2-s1;
	ds a dt mozme zhruba aproximovat:
	ds ~ n.x
	dt ~ n.y
	kde n je normalovy vektor hrbolateho povrchu
	potom pre texturove koordinacie sphere map:
	u = u + ds;
	v = v + dt;
	Dalej:
	u' = u - 0.5 + du;
	v' = v - 0.5 + dv;
	Kde du a dv su hodnoty n.x a n.y ulozene v texture
*/
	static faza=8;
	if(keys[VK_SPACE]){	faza++;	if(faza>11)faza=1;	keys[VK_SPACE]=0;}
	if(keys[VK_BACK]){faza--;	if(faza<1)faza=11;	keys[VK_BACK]=0;}

	float rot[4]={1.f, 0.f, 0.f, 1.f};
	if(faza>3 && faza!=6 && faza!=9)
	{
		SetCombineARB( 0);
		zem.glBindTexture2D();
		if(faza==5||faza==8||faza==11)SetCombineARB(1, GL_ADD);
		else SetCombineARB(1, GL_REPLACE, GL_TEXTURE);
		spheremap.glBindTexture2D();
		glActiveTextureARB(GL_TEXTURE2_ARB);
		glEnable(GL_TEXTURE_2D);
		dudv.glBindTexture2D();
		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
		glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,  GL_BUMP_ENVMAP_ATI);
		glTexEnvi(GL_TEXTURE_ENV, GL_BUMP_TARGET_ATI, GL_TEXTURE1_ARB);
		glTexBumpParameterfvATI( GL_BUMP_ROT_MATRIX_ATI, rot);
		
		if(faza==4||faza==5)DrawSphereBaseSphereMapping(40,40);
		if(faza==7||faza==8)DrawPlaneBaseSphereMapping(4,4);
		if(faza==10||faza==11)DrawCubeBaseSphereMapping();

		SetCombineARB(1);
		glDisable(GL_TEXTURE_GEN_S);
		glDisable(GL_TEXTURE_GEN_T);
		DisableAllUnits();
	}

	if(faza==3 || faza==6 || faza==9)
	{
		// povolime generovanie texturovych suradnic, suradnice sa generuju podla normalovych vektorov
		glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
		glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
		glEnable(GL_TEXTURE_GEN_S);
		glEnable(GL_TEXTURE_GEN_T);
		spheremap.glBindTexture2D();
		if(faza==3)DrawSphereBase(40,40);
		if(faza==6)DrawPlaneBaseSphereMapping(4,4);
		if(faza==9)DrawCubeBaseSphereMapping();
		// vypneme generovanie tex. suradnic
		glDisable(GL_TEXTURE_GEN_S);
		glDisable(GL_TEXTURE_GEN_T);
	}

	if(faza>2)DrawSkyBox(skybox,10);

	this->Prepni_do_2D();
	CVector p,s,t;
	if(faza==1)
	{
		p.set((screen_x-screen_y)/2.f,0,0);
		s.set((float)screen_y,0,0);
		t.set(0,(float)screen_y,0);
		spheremap.glBindTexture2D();
		this->DrawQuad( p, CVector(0,0,1),s,t);
	}
	if(faza==2)
	{
		glColor3f(1,1,0);
		p.set(0,0,0);
		s.set((float)screen_x,0,0);
		t.set(0,(float)screen_y,0);
		dudv.glBindTexture2D();
		this->DrawQuad( p, CVector(0,0,1),s,t);
		glColor3f(1,1,1);
	}
	static int show_spheremap=0;
	if(keys['G']){	show_spheremap=!show_spheremap;	keys['G']=0;}
	if(show_spheremap)
	{
		p.set(0,0,0);
		s.set((float)256,0,0);
		t.set(0,(float)256,0);
		spheremap.glBindTexture2D();
		this->DrawQuad( p, CVector(0,0,1),s,t);
	}
	static float bump=1.f;
	
	if(keys['M'])
	{
		bump*=1.3f;
		dudv.MakeDOT3( "data/bump.jpg", 1, 1, 0, bump, NULL); //"data/dudv.bmp");
		keys['M']=0;
	}
	if(keys['N'])
	{
		bump/=1.3f;
		dudv.MakeDOT3( "data/bump.jpg", 1, 1, 0, bump, NULL); //"data/dudv.bmp");
		keys['N']=0;
	}

/*	this->Vypis_vektor( c->vr, 0, 5, "vr");
	this->Vypis_vektor( c->vu, 0, 6, "vu");
	this->Vypis_vektor( c->vd, 0, 7, "vd");
	this->Vypis_vektor( c->vp, 0, 8, "vp");
*/
	glColor4f(1,1,1,1);
	if(keys[VK_F12]){	SaveScreen_BMP(); keys[VK_F12] = 0;}

	// vypis FPS
	glEnable( GL_TEXTURE_2D);
	font0->Begin();
	fps = 1.0f / timer0.GetTime();
	timer0.Reset();
	fps_counter.GetAvgFps(1.f/fps,0.2f);
	gcvt( (double)fps_counter.avg_fps, 4, text);
	font0->Print(0,0,text,0);

	font0->Print(0,1,english ? "phase" : "faza",0);
	itoa( faza,text,10);
	font0->Print(english ? 6:5,1,text,0);
	font0->Print(english ? 8:7,1,english ? "to 11":"z 11:",0);
	
	if(english)
	{
		switch(faza)
		{
		case 1: font0->Print(14,1,"Sphere map",0); break;
		case 2: font0->Print(14,1,"DUDV texture, represent shift of texture coordinations",0); break;
		case 3: font0->Print(14,1,"Sphere with enviromental mapping",0); break;
		case 4: font0->Print(14,1,"Sphere with environment mapped bump mapping (EMBM)",0); break;
		case 5: font0->Print(14,1,"Sphere with EMBM + texture earth",0); break;
		case 6: font0->Print(14,1,"Plane with enviromental mapping",0); break;
		case 7: font0->Print(14,1,"Plane with environment mapped bump mapping (EMBM)",0); break;
		case 8: font0->Print(14,1,"Plane with EMBM + texture earth",0); break;
		case 9: font0->Print(14,1,"Cube with enviromental mapping",0); break;
		case 10: font0->Print(14,1,"Cube with environment mapped bump mapping (EMBM)",0); break;
		case 11: font0->Print(14,1,"Cube with EMBM + texture earth",0); break;
		}
	}
	else
	{
		switch(faza)
		{
		case 1: font0->Print(12,1,"Sphere mapa",0); break;
		case 2: font0->Print(12,1,"DUDV textura, vyjadruje posun texturovych koordinacii",0); break;
		case 3: font0->Print(12,1,"Gula s enviromental mapping",0); break;
		case 4: font0->Print(12,1,"Gula s environment mapped bump mapping (EMBM)",0); break;
		case 5: font0->Print(12,1,"Gula s EMBM + textura zeme",0); break;
		case 6: font0->Print(12,1,"Rovina s enviromental mapping",0); break;
		case 7: font0->Print(12,1,"Rovina s environment mapped bump mapping (EMBM)",0); break;
		case 8: font0->Print(12,1,"Rovina s EMBM + textura zeme",0); break;
		case 9: font0->Print(12,1,"Kocka s enviromental mapping",0); break;
		case 10: font0->Print(12,1,"Kocka s environment mapped bump mapping (EMBM)",0); break;
		case 11: font0->Print(12,1,"Kocka s EMBM + textura zeme",0); break;
		}
	}

	// vypis modu mysi
	static unsigned char q3mode=1;
	if(keys['C'])
	{
		if(q3mode)c->set_3ds_mouse_style();
		else c->set_q3_mouse_style();
		q3mode=!q3mode;
		keys['C']=0;
	}
	if(q3mode)font0->Print(72-20,0,"q3",0);
	else font0->Print(72-20,0,"3ds",0);

	switch(mode)
	{
	case ROTATE_WALK: font0->Print(72-4,0,"WALK",0); break;
	case ROTATE_FLY: font0->Print(72-3,0,"FLY",0); break;
	case ROTATE_WALK|ROTATE_ABOUT_POINT: font0->Print(72-12,0,"WALK & STRED",0); break;
	case ROTATE_WALK_2|ROTATE_ABOUT_POINT: font0->Print(72-14,0,"WALK 2 & STRED",0); break;
	case ROTATE_FLY|ROTATE_ABOUT_POINT: font0->Print(72-11,0,"FLY & STRED",0); break;
	default: font0->Print(0,0,"WALK",0);
	}

	if(keys['H'])							// zobrazenie helpu
	{
		int i=1;
		glDisable(GL_TEXTURE_2D);
		glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
		glColor4f(0,0,0,0.6f);
		glLoadIdentity();
		glBegin(GL_QUADS);
			glVertex2i(0,0);
			glVertex2i(800,0);
			glVertex2i(800,600-16);
			glVertex2i(0,600-16);
		glEnd();
		glColor4f(1,1,1,1);
		glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_COLOR);
		glEnable(GL_TEXTURE_2D);
		font0->Print(15,i++,"Program: DOT3 bump mapping",0);
		glColor3f(0.9f,0.9f,1.0f);
		if(english)
		{
			font0->Print(8,i++,"Programmer: Marek Mizanin - www.mizanin.szm.sk",0);
			glColor3f(1.0f,1.0f,1.0f);
			font0->Print(10,i++,"Controls:",0);
			font0->Print(2,i++,"space,backspace - change phase",1);
			font0->Print(2,i++,"G - on/off drawing sphere map",1);
			font0->Print(2,i++,"M,N - increase/decrease bumpiness of surface",1);
			font0->Print(2,i++,"F1 - switch to window",1);
			font0->Print(2,i++,"F12 - take screenshot",1);
			font0->Print(2,i++,"H - help",1);
			i++;
			font0->Print(2,i++,"Controls of camera:",0);
			font0->Print(2,i++,"V - change type of camera",1);
			font0->Print(2,i++,"C - change ot mode of mouse (q3, 3ds)",1);
			font0->Print_scale(2,i++,"W,S,arrow up,down,left and right button (q3 mode) - move forward and backward",1,0.94f,1);
			font0->Print(2,i++,"A,D,Delete,Insert - move left and right",1);
			font0->Print(2,i++,"Home,End - move up and down",1);
			font0->Print(2,i++,"arrow right,left and moving mouse <-> - rotation about y axis",1);
			font0->Print(2,i++,"Page Up, Page Down a moving mouse | - rotation about x axis",1);
			font0->Print(2,i++,"E,Q -rotation about z axis, only in FlyRotate",1);
			font0->Print_scale(2,i++,"+ and - on numeric. and button (q3 mode) - change distance to center, if rot. about center",1,0.75f,1);
			font0->Print(2,i++,"Shift - slow moving",1);
			font0->Print(2,i++,"R - reset camera",1);
			font0->Print(2,i++,"in 3ds mode mouse:",1);
			font0->Print(2,i++,"left button - rotation about x and y",1);
			font0->Print(2,i++,"right button - move horizontaly and vertikalny",1);
			font0->Print(2,i++,"both button - move forward and backward, raotation about z axis (FLY)",1);
			font0->Print(2,i++,"wheel - change distance to center",1);
		}
		else
		{
			font0->Print(8,i++,"Naprogramoval: Marek Mizanin - www.mizanin.szm.sk",0);
			glColor3f(1.0f,1.0f,1.0f);
			font0->Print(10,i++,"Pouzivane klavesy:",0);
			font0->Print(2,i++,"medzernik,backspace - meni fazu",1);
			font0->Print(2,i++,"G - zapne/vypne zobrazovanie sphere mapy",1);
			font0->Print(2,i++,"M,N - zvacsuje/zmensuje hrbolatost povrchu",1);
			font0->Print(2,i++,"F1 - prepne do okna",1);
			font0->Print(2,i++,"F12 - urobi screenshot",1);
			font0->Print(2,i++,"H - help",1);
			i++;
			font0->Print(2,i++,"Ovladanie kamery:",0);
			font0->Print(2,i++,"V - meni typ kamery",1);
			font0->Print(2,i++,"C - zmena rezimu mysi (q3, 3ds)",1);
			font0->Print_scale(2,i++,"W,S,sipka hore,dole,lave a prave tlacitko (q3 mod) - pohyb dopredu a dozadu",1,0.94f,1);
			font0->Print(2,i++,"A,D,Delete,Insert - pohyb do boka vlavo vpravo",1);
			font0->Print(2,i++,"Home,End - pohyb hore, dole",1);
			font0->Print(2,i++,"sipka vpravo,vlavo a pohyb mysov <->  - rotacia okolo osi y",1);
			font0->Print(2,i++,"Page Up, Page Down a pohyb mysov | - rotacia okolo osi x",1);
			font0->Print(2,i++,"E,Q - rotacia okolo osi z, iba pri FlyRotate",1);
			font0->Print_scale(2,i++,"+ a - na num. klav. a tlacitka (q3 mod) - zmena vzdialenosti k stredu, pri rot. okolo stredu",1,0.75f,1);
			font0->Print(2,i++,"Shift - pomalsi pohyb",1);
			font0->Print(2,i++,"R - reset kamery",1);
			font0->Print(2,i++,"V 3ds mode mysi:",1);
			font0->Print(2,i++,"lave tlacitko - rotacie okolo x a y",1);
			font0->Print(2,i++,"prave tlacitko - posun horizontaly a vertikalny",1);
			font0->Print(2,i++,"obidve tlacitka - posun do predu a dozadu, rotacia okolo osi z (FLY)",1);
			font0->Print(2,i++,"koliesko - priblizovanie a vzdialovanie od stredu",1);
		}
	}
	font0->End();
}

void static DrawSphereBase(int del_uhol_x, int del_uhol_y)
{
	CVector a,b,ay,by;
	float dy=360.f/del_uhol_y;
	float dx=180.f*PI180/del_uhol_x;
	for(int x=0; x<del_uhol_x; x++)
	{
		float tx = (float)x/(float)del_uhol_x;
		float ang = tx*180.f*PI180-90.f*PI180;
		a.set( 0, (float)sin(ang) , (float)cos(ang));
		b.set( 0, (float)sin(ang+dx), (float)cos(ang+dx));
		
		glBegin( GL_TRIANGLE_STRIP);

		glTexCoord2f( 0, tx);
		glNormal3fv(a.v);
		glVertex3fv(a.v);
		glTexCoord2f( 0, tx+1.f/del_uhol_x);
		glNormal3fv(b.v);
		glVertex3fv(b.v);

		ay = a;	by = b;
		for(int y=1; y<del_uhol_y+1; y++)
		{
			float ty = (float)y/(float)del_uhol_y;
			ay = a;	ay.RotY( ty*360.f);
			by = b;	by.RotY( ty*360.f);
			glTexCoord2f( ty, tx);
			glNormal3fv(ay.v);
			glVertex3fv(ay.v);
			glTexCoord2f( ty, tx+1.f/del_uhol_x);
			glNormal3fv(by.v);
			glVertex3fv(by.v);
		}
		glEnd();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -