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