Beispiel #1
0
	int DX9RenderSystem::SetMaterial( Material* mat )
	{
		if( mat == 0 )
			return 1;

		int j = 0;
		for( std::vector< TextureStage >::iterator i = mat->mTStages.begin( ); i != mat->mTStages.end( ); i++, j++ )
		{
			if( SetTexture( j, (*i).texture ) == 2 )
				return 2;

			if( !(*i).uses_transform ) {
				SetTextureStageState( j, TextureState::TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
			} else {
				SetTextureStageState( j, TextureState::TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
				SetTextureMatrix( j, (*i).transform );
			}

			SetTextureStageState( j, TextureState::COLOROP, (*i).colormode.op );
			if( (*i).colormode.op != BlendOp::DISABLE ) {
				SetTextureStageState( j, TextureState::COLORARG1, (*i).colormode.arg1 );
				SetTextureStageState( j, TextureState::COLORARG2, (*i).colormode.arg2 );
			}
			SetTextureStageState( j, TextureState::ALPHAOP, (*i).alphamode.op );
			if( (*i).alphamode.op != BlendOp::DISABLE ) {
				SetTextureStageState( j, TextureState::ALPHAARG1, (*i).alphamode.arg1 );
				SetTextureStageState( j, TextureState::ALPHAARG2, (*i).alphamode.arg2 );
			}
		}
		SetTextureStageState( j, TextureState::COLOROP, D3DTOP_DISABLE );
		SetTextureStageState( j, TextureState::ALPHAOP, D3DTOP_DISABLE );

		SetAlphaBlendEnabled( mat->mAlphaBlend );
		SetAlphaTestEnabled( mat->mAlphaTest );
		SetDepthWriteEnabled( mat->mDepthWrite );
		SetDepthBufferEnabled( mat->mDepthBuffer );
		SetSpecularEnabled( mat->mSpecularEnabled );

		return 0;
	};
Beispiel #2
0
	void VrmlGame::Draw3D( const GLWindow2 &glWindow, Map &map, SE3<> se3CfromW, GLuint fboId, GLenum *buffers, ATANCamera &mCamera, int statusFlag)
	{
		if(!mbInitialised) {
			Init();
		}
		GetMatrixMP(map);
		GLfloat temp_trans[] = {mP(0,0), mP(0,1), mP(0,2), mP(0,3), mP(1,0), mP(1,1), mP(1,2), mP(1,3), mP(2,0), mP(2,1), mP(2,2), mP(2,3), mP(3,0), mP(3,1), mP(3,2), mP(3,3)};
		
		//add at 2.23
		//读取阴影明暗变量
		std::string filename = "variable.txt";
		std::ifstream variableFile;
		float shadowvariable;
		int light_count;
		variableFile.open(filename.c_str());
		if (!variableFile)
		{
			cout << "can't open the variable file" <<endl;
		}
		variableFile>>shadowvariable;
		variableFile>>light_count;

		if (statusFlag != 2 )
		{
			//shadow
			glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboShadowId);
			CheckFramebufferStatus();
			glUseProgramObjectARB(0);
			glViewport(0,0,RENDER_WIDTH*SHADOW_WAP_RATIO,RENDER_HEIGHT*SHADOW_WAP_RATIO);
			glClear(GL_DEPTH_BUFFER_BIT);
			glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
			//setup matrices
			glEnable(GL_DEPTH_TEST);
			glMatrixMode(GL_PROJECTION);
			glLoadIdentity();
			gluPerspective(45,RENDER_WIDTH/RENDER_HEIGHT,3,40000);

			glDisable(GL_BLEND);
			glEnable(GL_DEPTH_TEST);
			glDepthFunc(GL_LEQUAL);
			glEnable(GL_NORMALIZE);
			glEnable(GL_COLOR_MATERIAL);
			glMatrixMode(GL_MODELVIEW);
			glLoadIdentity();
			gluLookAt(0.0, 10.0, 0.0, -10.0, -100.0, 0.0, 0.0, 1.0, 0.0);
			//消除自我阴影
			glEnable(GL_CULL_FACE);  //之前没有加这句话,所以Front没有被剔除
			glCullFace(GL_FRONT);
			DrawMediatorAndObject(statusFlag);  //需要设置texture7
			SetTextureMatrix();  //设置texture7
		}
 		
		

		//add 12.8  draw virtual object
		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fboId);
		//ATTACHMENT0---TEX_BUFF1
		CheckFramebufferStatus();
		glViewport(0,0,RENDER_WIDTH,RENDER_HEIGHT);
		glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);  //
		glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		//glDisable(GL_CULL_FACE);
		//glCullFace(GL_BACK);
		glEnable(GL_DEPTH_TEST);
		// Set up 3D projection
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		glMultMatrix(mCamera.MakeUFBLinearFrustumMatrix(0.005, 100));
		glMultMatrix(se3CfromW);
		
	    //opengl staff
		glDisable(GL_BLEND);
		glEnable(GL_DEPTH_TEST);
		glDepthFunc(GL_LEQUAL);
 		glEnable(GL_NORMALIZE);
 		glEnable(GL_COLOR_MATERIAL);
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
 		glMultMatrix(SE3<>());
 		glMultMatrixf(temp_trans);


		
		phongShadow.UseShader(true);
		glEnable(GL_TEXTURE_2D);
		//if (statusFlag != 2 )
		//{
			//phongShadow.SetUniVar("xPixelOffset", 1.0f/ (640.0f* 2));
			//phongShadow.SetUniVar("yPixelOffset", 1.0f/ (480.0f* 2));
			phongShadow.SetSampler("ShadowMap",7);
			glActiveTexture(GL_TEXTURE7);
			glBindTexture(GL_TEXTURE_2D, depthTextureId);
		//}
		glEnable(GL_CULL_FACE);
		glCullFace(GL_BACK);
		DrawMediatorAndObject(statusFlag);
		//if (statusFlag != 2 )
		//{
			glActiveTexture(GL_TEXTURE7);
			glBindTexture(GL_TEXTURE_2D, 0);
		//}
		glDisable(GL_TEXTURE_2D);
		glDisable(GL_CULL_FACE);
		phongShadow.UseShader(false);

		////test shadow mapping
		//貌似这段程序没法画出深度图,不过印象中之前可以的啊  ---2.23
		/*glUseProgramObjectARB(0);
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		glOrtho(-RENDER_WIDTH/2,RENDER_WIDTH/2,-RENDER_HEIGHT/2,RENDER_HEIGHT/2,1,20);
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
		glColor4f(1,1,1,1);
		glActiveTextureARB(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D,depthTextureId);
		glEnable(GL_TEXTURE_2D);
		glTranslated(0,0,-1);
		glBegin(GL_QUADS);
		glTexCoord2d(0,0);glVertex3f(0,0,0);
		glTexCoord2d(1,0);glVertex3f(RENDER_WIDTH/2,0,0);
		glTexCoord2d(1,1);glVertex3f(RENDER_WIDTH/2,RENDER_HEIGHT/2,0);
		glTexCoord2d(0,1);glVertex3f(0,RENDER_HEIGHT/2,0);
		glEnd();
		glDisable(GL_TEXTURE_2D);*/

		glDisable(GL_LIGHTING);
		glDisable(GL_DEPTH_TEST);
	}