void RenderSquareShadow(LPDIRECT3DDEVICE7 lpDevice,float x,float y,float z,float w,float h) { WORD wIndices[] = { 0,1,2, 3,2,1, 1,5,3, 3,5,7, 0,4,1, 1,4,5, 0,2,4, 4,2,6, 2,3,6, 6,3,7, }; D3DLIGHT7 light; lpDevice->GetLight(0,&light); D3DVECTOR length=Normalize(light.dvDirection)*(-100); D3DVERTEX v[8]; v[0] = D3DVERTEX( D3DVECTOR( x-w/2, y, z-h/2 ),D3DVECTOR(0,1,0), 0, 1 ); v[1] = D3DVERTEX( D3DVECTOR( x-w/2, y, z+h/2 ),D3DVECTOR(0,1,0), 0, 0 ); v[2] = D3DVERTEX( D3DVECTOR( x+w/2, y, z-h/2 ),D3DVECTOR(0,1,0), 1, 1 ); v[3] = D3DVERTEX( D3DVECTOR( x+w/2, y, z+h/2 ),D3DVECTOR(0,1,0), 1, 0 ); v[4] = D3DVERTEX( D3DVECTOR( x-w/2, y, z-h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); v[5] = D3DVERTEX( D3DVECTOR( x-w/2, y, z+h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); v[6] = D3DVERTEX( D3DVECTOR( x+w/2, y, z-h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); v[7] = D3DVERTEX( D3DVECTOR( x+w/2, y, z+h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); RenderShadow(lpDevice,v,8,wIndices,sizeof(wIndices)/sizeof(wIndices[0])); }
bool Display(float timeDelta) { if( Device ) { // // Update the scene: // static float radius = 20.0f; if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f ) TeapotPosition.x -= 3.0f * timeDelta; if( ::GetAsyncKeyState(VK_RIGHT) & 0x8000f ) TeapotPosition.x += 3.0f * timeDelta; if( ::GetAsyncKeyState(VK_UP) & 0x8000f ) radius -= 2.0f * timeDelta; if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f ) radius += 2.0f * timeDelta; static float angle = (3.0f * D3DX_PI) / 2.0f; if( ::GetAsyncKeyState('A') & 0x8000f ) angle -= 0.5f * timeDelta; if( ::GetAsyncKeyState('S') & 0x8000f ) angle += 0.5f * timeDelta; D3DXVECTOR3 position( cosf(angle) * radius, 3.0f, sinf(angle) * radius ); D3DXVECTOR3 target(0.0f, 0.0f, 0.0f); D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); D3DXMATRIX V; D3DXMatrixLookAtLH(&V, &position, &target, &up); Device->SetTransform(D3DTS_VIEW, &V); // // Draw the scene: // Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, 0xff000000, 1.0f, 0L); Device->BeginScene(); RenderScene(); RenderShadow(); Device->EndScene(); Device->Present(0, 0, 0, 0); } return true; }
Bucket * RenderLight( const Vid::Light::Obj &light, const GETHEIGHTPROCPTR getHeightProc, const FINDFLOORPROCPTR findFloorProc) // = 0xfffffff, = GetHeight, = FindFloor { Bucket * bucket = NULL; ShadowInfo si; if (BoundsTestLight( si, light, getHeightProc, findFloorProc)) { bucket = RenderShadow( si, getHeightProc); } return bucket; }
Bucket * RenderShadow( const Vid::Light::Obj & light, const Matrix & world, F32 radius, U32 shadowType, U32 translucency, const GETHEIGHTPROCPTR getHeightProc, const FINDFLOORPROCPTR findFloorProc) // = 0xfffffff, = GetHeight, = FindFloor { light; Bucket * bucket = NULL; ShadowInfo si; if (BoundsTestShadow( si, world, radius, shadowType, translucency, getHeightProc, findFloorProc)) { bucket = RenderShadow( si, getHeightProc); } return bucket; }
// Deferred void Deferred::Render() { // 最後の演算結果をシェーダー側へ送る shader->SetValue("LightTex", m_sLight); shader->SetValue("SpecTex", m_sSpecular); // シャドウサーフェイスの更新 if (m_bShadowFlag == true) { RenderShadow(); } // FinalPassSurfaceに今までのSurfaceの情報を全て合わせる m_sScreen->RenderTarget(); m_sBloomSeed->RenderTarget(1); // BloomSeed if (m_bShadowFlag == true) { m_mDiffuse->Render(0, 0, shader, "finalPut_Shadow"); //通常描画 } else { m_mDiffuse->Render(0, 0, shader, "finalPut"); //影なし描画 } // ここで描画 tdnSystem::GetDevice()->SetRenderTarget(0, backbuffer); // ディファードのスクリーン m_sScreen->Render(0, 0); // フォアード(エフェクト) m_sForward->Render(0, 0, shader, "ToneMap"); // フォアードの�@バックバッファ �Aブルーム という形にしました // 高輝度のサーフェイスを戻す tdnSystem::GetDevice()->SetRenderTarget(1, nullptr); ////ライトサーフェイス画面クリア //m_sLight->RenderTarget(); //m_sSpecular->RenderTarget(1); ////バックバッファサーフェイスの復元・MRTの終了処理 //tdnSystem::GetDevice()->SetRenderTarget(SURFACE_NAME::MRT_NORMAL, nullptr); //tdnSystem::GetDevice()->SetRenderTarget(SURFACE_NAME::MRT_SPECULAR, nullptr); // LOD m_sFog->Render(0, 0, RS::ADD);// フォグを重ねる tdnText::Draw(100, 600,0xff00ffff, "m_fExposure%.2f", m_fExposure); //m_sSpecular->Render(0, 0, shader, "ToneMap"); }
// RenderRecursive - recursively visit all sub-nodes in breadth-first mode //----------------------------------------------------------------------------- void CPUTRenderNode::RenderShadowRecursive(CPUTRenderParameters &renderParams) { RenderShadow(renderParams); if(mpChild) { mpChild->RenderShadowRecursive(renderParams); CPUTRenderNode *pNode = mpChild->GetSibling(); while(pNode) { pNode->RenderShadowRecursive(renderParams); pNode = pNode->GetSibling(); } } }
void GDynamicActor::RenderExtra( dword dwOption ) { if( !m_aOrnamentExtra.empty() ) GrpSuper::RenderOrnament( ORO_EXTRALOOP ); if( m_bVolatileRenderExtraFlag ) { m_bVolatileRenderExtraFlag = false; } // Render Children for( int iAtt=0; iAtt<m_aAttachedActor.Num(); iAtt++ ) { DActor *pActor = ActorPtr( m_aAttachedActor[iAtt] ); if( pActor ) pActor->Render( ARO_EXTRA ); } // Render Shadow RenderShadow(); }
// Runden Schatten malen void RenderRoundShadow(LPDIRECT3DDEVICE7 lpDevice,float x,float y,float z,float r) { #define EDGES 12 static D3DVERTEX v[(EDGES+1)*2]; D3DLIGHT7 light; lpDevice->GetLight(0,&light); D3DVECTOR length=Normalize(light.dvDirection)*(-100.0f); for (int i=0;i<=EDGES;i++) { v[i]=v[i+EDGES+1]=D3DVERTEX(D3DVECTOR(x+sinf(float(i)/float(EDGES)*g_PI*2.0f)*r,y,z+cosf(float(i)/float(EDGES)*g_PI*2.0f)*r),D3DVECTOR(0,1,0),0,0); v[i+EDGES+1].x-=length.x; v[i+EDGES+1].y-=length.y; v[i+EDGES+1].z-=length.z; } static WORD wIndices[(EDGES-2)*3+EDGES*6]; const PWORD Cap=&wIndices[0]; const PWORD Side=&wIndices[(EDGES-2)*3]; for (i=0;i<EDGES-2;i++) { Cap[i*3]=0; Cap[i*3+1]=i+1; Cap[i*3+2]=i+2; } for (i=0;i<EDGES;i++) { Side[i*6+0]=i; Side[i*6+1]=i+EDGES+2; Side[i*6+2]=i+1; Side[i*6+3]=i; Side[i*6+4]=i+EDGES+1; Side[i*6+5]=i+EDGES+2; } RenderShadow(lpDevice,v,EDGES*2+2,wIndices,sizeof(wIndices)/sizeof(wIndices[0])); // RenderShadow(lpDevice,v,8,wIndices,(EDGES-2)*3); }
void sceneRenderingTest::Render() { tdnView::Activate(); tdnView::Clear(); if (m_bShaderFlag) { // G_Bufferクリア DeferredManagerEx.ClearLightSurface(); DeferredManagerEx.ClearBloom(); DeferredManagerEx.ClearGpuPointLight(); // シェーダ更新 DeferredManagerEx.G_Update(m_camera.pos); // 影 RenderShadow(); // シェーダ DeferredManagerEx.G_Begin(); // ステージ描画 g_stage->Render(shaderM, "G_Buffer"); // シェーダ終わり DeferredManagerEx.G_End(); DeferredManagerEx.DirLight(m_dirLight, Vector3(0.8f, 0.72f, 0.72f)); DeferredManagerEx.HemiLight(Vector3(0.6f, 0.5f, 0.5f), Vector3(0.45f, 0.43f, 0.43f)); // ポイントライト描画 DeferredManagerEx.GpuPointLightRender(); // 最後の処理 { DeferredManagerEx.FinalBegin(); // ステージ描画 g_stage->Render(shaderM, "DefaultLighting"); g_sky->Render(); g_airou->Render(shaderM,"linecopy"); //m_pAIROU_EF->Render(); m_pAIROU_EF_IMP->Render(); m_pWave->Render(); m_pWind->Render(); m_pWind2->Render(); m_pGodHand->Render(); m_pLocus->Render(); m_pSpeedLine->Render(); m_pPanel->Render3D(); HeaveHoFinishUI->Render(); // パーティクル ParticleManager::Render(); DeferredManagerEx.FinalEnd(); } // ブルーム DeferredManagerEx.BloomRender(); DeferredManagerEx.GetTex(SURFACE_NAME_EX::POINT_LIGHT)->Render(0,0,1280/4, 720/4, 0, 0, 1280, 720); //DeferredManagerEx.GetTex(SURFACE_NAME_EX::ROUGHNESS)->Render(1280 / 4, 0, 1280 / 4, 720 / 4, 0, 0, 1280, 720); ///*******************************/ //// まずは今のサーフェイスを保存 ///*******************************/ //Surface* surface; //tdnSystem::GetDevice()->GetRenderTarget(0, &surface); // ////シャドウマップ用ステンシルバッファサーフェイスの作成! ////if (FAILED(tdnSystem::GetDevice()->CreateDepthStencilSurface(size, size, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, FALSE, &m_pShadowStencilSurface, NULL))) ////{ //// MessageBox(tdnSystem::GetWindow(), "深度バッファが作成できなかった", "ERROR", MB_OK); ////}; //D3DVIEWPORT9 viewPort; //// 現在のビューポートの一時保管 //tdnSystem::GetDevice()->GetViewport(&viewPort); //// ビューポートの作成 //D3DVIEWPORT9 vp = { 0, 0, 1024, 1024, 0, 1.0f }; //tdnSystem::GetDevice()->SetViewport(&vp); //// 現在のステンシルバッファを一時保管 //Surface* SaveStencilSurface; //tdnSystem::GetDevice()->GetDepthStencilSurface(&SaveStencilSurface); //// ステンシルバッファに切り替え //tdnSystem::GetDevice()->SetDepthStencilSurface(StencilSurface); //g_ScrennShot->RenderTarget(); //// 画面クリア //tdnSystem::GetDevice()->Clear(0, nullptr, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0); //DeferredManagerEx.GetTex(SURFACE_NAME_EX::SCREEN)->Render(0, 0); //SurfaceRender(); //tdnPolygon::Rect(128, 128, 512); //tdnSystem::GetDevice()->SetRenderTarget(0, surface);//レンダーターゲットの復元 //tdnSystem::GetDevice()->SetDepthStencilSurface(SaveStencilSurface); //ステンシルバッファの復元 //tdnSystem::GetDevice()->SetViewport(&viewPort);//ビューポートの復元 //if (KeyBoard(KB_J)) //{ // g_ScrennShot->Render(0, 200,1280/2,720/2,0,0,1280,720); //} //if (KeyBoard(KB_NUMPAD1) == 1) //{ // Effect2DMgr.OutputPng("Effect/b.png", 1); //} //if (KeyBoard(KB_NUMPAD2) == 1) //{ // Effect2DMgr.OutputPngLine("Effect/a.p", 2,4); //} //g_DamageEF->Render(300, 0); } else { } g_scoreUI->Render(); //if (KeyBoardTRG(KB_6)) //{ // // スクショ出力 // D3DXSaveTextureToFile("screenshot.png", D3DXIFF_PNG, DeferredManagerEx.GetTex(SURFACE_NAME_EX::BLOOM)->GetTexture() , NULL); // D3DXSaveTextureToFile("screenshot2.png", D3DXIFF_PNG, g_ScrennShot->GetTexture(), NULL); //} // tdnText::Draw(0, 30, 0xffffffff, "CameraPos : %.1f %.1f %.1f", m_camera.pos.x, m_camera.pos.y, m_camera.pos.z); tdnText::Draw(0, 60, 0xffffffff, "CameraTarget : %.1f %.1f %.1f", m_camera.target.x, m_camera.target.y, m_camera.target.z); //Effect2DMgr.Render(); }
bool iLight3D::BeginDraw(cRenderSettings *apRenderSettings,iLowLevelGraphics *apLowLevelGraphics) { // Clear Stencil Buffer /* apLowLevelGraphics->SetClearStencilActive(true); apLowLevelGraphics->SetClearDepthActive(false); apLowLevelGraphics->SetClearColorActive(false); apLowLevelGraphics->SetClearStencil(0); apLowLevelGraphics->ClearScreen(); apLowLevelGraphics->SetClearStencilActive(false); apLowLevelGraphics->SetClearDepthActive(true); apLowLevelGraphics->SetClearColorActive(true);*/ cRect2l ClipRect; bool bVisible = CreateClipRect(ClipRect, apRenderSettings,apLowLevelGraphics); if(bVisible) { apLowLevelGraphics->SetScissorActive(true); apLowLevelGraphics->SetScissorRect(ClipRect); if(apRenderSettings->mbLog) Log("Cliprect pos: (%d, %d) size: (%d, %d)\n",ClipRect.x, ClipRect.y, ClipRect.w, ClipRect.h); } else { if(apRenderSettings->mbLog) Log("Cliprect entire screen\n"); } ////////////////////////////////////////////////////////// // Cast shadows if(mbCastShadows && apRenderSettings->mShowShadows != eRendererShowShadows_None && apRenderSettings->mpVtxExtrudeProgram != NULL) { //Get temp index array. (Remove this when the index pool // is implemented.). mpIndexArray = apRenderSettings->mpTempIndexArray; //Setup for shadow drawing apLowLevelGraphics->SetStencilActive(true); //Do no set this when debugging. apLowLevelGraphics->SetColorWriteActive(false, false, false,false); /////////////////////////////////////////////////////////////////////////// //Clear stencil, since scissor is set this should be fast. apLowLevelGraphics->SetClearStencilActive(true); apLowLevelGraphics->SetClearDepthActive(false); apLowLevelGraphics->SetClearColorActive(false); apLowLevelGraphics->SetClearStencil(0); apLowLevelGraphics->ClearScreen(); apLowLevelGraphics->SetClearStencilActive(false); apLowLevelGraphics->SetClearDepthActive(true); apLowLevelGraphics->SetClearColorActive(true); if(apLowLevelGraphics->GetCaps(eGraphicCaps_TwoSideStencil)) { apLowLevelGraphics->SetCullActive(false); } apLowLevelGraphics->SetDepthWriteActive(false); //Setup the depth test so that shadow volume is not rendered in front //off the normal graphics. apLowLevelGraphics->SetDepthTestFunc(eDepthTestFunc_Less); //Resert the algo (zfail or zpass) used. apRenderSettings->mlLastShadowAlgo=0; //Reset this variable so it can be used when rendering shadows. apRenderSettings->mbMatrixWasNULL = false; //Set the fragment program. if(apRenderSettings->mpFragExtrudeProgram) { if(apRenderSettings->mbLog)Log("Setting fragment program: '%s'\n", apRenderSettings->mpFragExtrudeProgram->GetName().c_str()); apRenderSettings->mpFragExtrudeProgram->Bind(); apRenderSettings->mpFragmentProgram = apRenderSettings->mpFragExtrudeProgram; } //Set the vertex program. if(apRenderSettings->mbLog)Log("Setting vertex program: '%s'\n", apRenderSettings->mpVtxExtrudeProgram->GetName().c_str()); apRenderSettings->mpVtxExtrudeProgram->Bind(); apRenderSettings->mpVertexProgram = apRenderSettings->mpVtxExtrudeProgram; //Render shadows tCasterCacheSetIt it = m_setDynamicCasters.begin(); if(apRenderSettings->mShowShadows == eRendererShowShadows_All) { it = m_setDynamicCasters.begin(); for(; it!= m_setDynamicCasters.end(); ++it) { RenderShadow(*it,apRenderSettings,apLowLevelGraphics); } } it = m_setStaticCasters.begin(); for(; it!= m_setStaticCasters.end(); ++it) { RenderShadow(*it,apRenderSettings,apLowLevelGraphics); } //Make rendering ready for the objects. //apLowLevelGraphics->SetStencilTwoSideActive(false); apLowLevelGraphics->SetDepthTestFunc(eDepthTestFunc_Equal); apLowLevelGraphics->SetColorWriteActive(true, true, true,true); apLowLevelGraphics->SetCullActive(true); apLowLevelGraphics->SetStencil(eStencilFunc_Equal,0,0xFF, eStencilOp_Keep,eStencilOp_Keep, eStencilOp_Keep); } //Reset this var so that the new light properties are set. apRenderSettings->mbMatrixWasNULL = false; return true; }
void SoulDestroyer::Render( double _predictionTime ) { _predictionTime -= SERVER_ADVANCE_PERIOD; if( !m_dead ) { glDisable( GL_TEXTURE_2D ); Vector3 predictedPos = m_pos + m_vel * _predictionTime; Vector3 predictedFront = m_front; Vector3 predictedUp = m_up; Vector3 predictedRight = predictedUp ^ predictedFront; predictedFront = predictedRight ^ predictedUp; Matrix34 mat(predictedFront, predictedUp, predictedPos); // RenderSphere( m_targetPos, 5.0 ); // RenderSphere( predictedPos, 300.0 ); // RenderArrow( m_pos, m_pos+predictedFront * 200.0, 3.0, RGBAColour(0,255,0) ); // RenderArrow( m_pos, m_pos+predictedUp * 100.0, 2.0, RGBAColour(255,0,0) ); // RenderArrow( m_pos, m_pos+predictedRight * 100.0, 2.0, RGBAColour(0,0,255) ); RenderShapes( _predictionTime ); // // Render shadows BeginRenderShadow(); RenderShadow( predictedPos, 50.0 ); for( int i = 1; i < m_positionHistory.Size(); i+=1 ) { Vector3 pos1 = *m_positionHistory.GetPointer(i); Vector3 pos2 = *m_positionHistory.GetPointer(i-1); Vector3 pos = pos1 + (pos2 - pos1); Vector3 vel = (pos2 - pos1) / SERVER_ADVANCE_PERIOD; pos += vel * _predictionTime; double scale = 1.0 - ( (double) i / (double) m_positionHistory.Size() ); scale *= 1.5; if( i == m_positionHistory.Size()-1 ) scale = 0.8; scale = max( scale, 0.5 ); RenderShadow( pos, scale*20.0 ); } EndRenderShadow(); // // Render our spirits glDisable ( GL_DEPTH_TEST ); glDisable ( GL_CULL_FACE ); glBlendFunc ( GL_SRC_ALPHA, GL_ONE ); glEnable ( GL_BLEND ); glDepthMask ( false ); glBegin ( GL_QUADS ); double timeNow = GetHighResTime(); for( int i = 0; i < m_spirits.Size(); ++i ) { if( m_spirits.ValidIndex(i) ) { double birthTime = m_spirits[i]; if( timeNow >= birthTime + 60.0 ) { m_spirits.RemoveData(i); } else { double alpha = 1.0 - (timeNow - m_spirits[i]) / 60.0; alpha = min( alpha, 1.0 ); alpha = max( alpha, 0.0 ); Vector3 pos = m_pos + m_spiritPosition[i]; pos += m_vel * _predictionTime; RenderSpirit( pos, alpha ); } } } glEnd (); glDepthMask ( true ); glDisable ( GL_BLEND ); glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glEnable ( GL_CULL_FACE ); glEnable ( GL_DEPTH_TEST ); //glColor4f( 1.0, 1.0, 1.0, 1.0 ); //g_editorFont.DrawText3DCentre( predictedPos+Vector3(0,50,0), 20, "%2.2", m_panic ); } }
Bucket * RenderShadow( const Matrix & world, F32 radius, U32 shadowType, U32 translucency, const GETHEIGHTPROCPTR getHeightProc, const FINDFLOORPROCPTR findFloorProc) // = 0xfffffff, = GetHeight, = FindFloor { return RenderShadow( *Vid::Light::sun, world, radius, shadowType, translucency, getHeightProc, findFloorProc); }