DragonNest/Common/EternityEngine/EtLightShaftFilter.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

85 lines
2.5 KiB
C++

#include "StdAfx.h"
#include "EtBackBufferMng.h"
#include "EtMRTMng.h"
#include "EtDrawQuad.h"
#include "EtLightShaftFilter.h"
CEtLightShaftFilter::CEtLightShaftFilter()
{
m_vSunPosition = EtVector2( 0.5f, 0.5f );
}
CEtLightShaftFilter::~CEtLightShaftFilter()
{
SAFE_RELEASE_SPTR( m_hLightShaftSour );
SAFE_RELEASE_SPTR( m_hLightShaftDest );
}
void CEtLightShaftFilter::Initialize()
{
Clear();
m_hMaterial = LoadResource( "LightShaftFilter.fx", RT_SHADER );
if( !m_hMaterial ) return;
m_hLightShaftSour = AddRenderTarget( -4, -4, "g_LightShaftSourBuffer" );
m_hLightShaftDest = AddRenderTarget( -4, -4, "g_LightShaftDestBuffer" );
int nTexIndex = GetEtBackBufferMng()->GetBackBufferIndex();
AddCustomParam( m_vecCustomParam, EPT_TEX, m_hMaterial, "g_BackBuffer", &nTexIndex );
nTexIndex = CEtMRTMng::GetInstance().GetDepthTarget()->GetMyIndex();
AddCustomParam( m_vecCustomParam, EPT_TEX, m_hMaterial, "g_DepthTex", &nTexIndex );
}
void CEtLightShaftFilter::Render( float fElapsedTime )
{
CEtPostProcessFilter::DrawFilter( m_hLightShaftSour, 2, EtVector2( 0.0f, 0.0f ), EtVector2( 1.0f, 1.0f ), true );
int i;
float fSize = 0.4f;
for( i = 0; i < 6; i++ )
{
EtVector2 vStart, vEnd, vOffset;
vStart.x = -fSize;
vStart.y = -fSize;
vEnd.x = fSize + 1.0f;
vEnd.y = fSize + 1.0f;
vOffset = EtVector2( 0.5f, 0.5f ) - m_vSunPosition;
vOffset *= fSize;
vStart += vOffset;
vEnd += vOffset;
fSize *= 0.5f;
CEtPostProcessFilter::DrawFilter( m_hLightShaftDest, 0 );
bool bEnableAlphaBlend = GetEtDevice()->EnableAlphaBlend( true );
DrawFilter( m_hLightShaftSour, 1, vStart, vEnd, EtVector2( 0.0f, 0.0f ), EtVector2( 1.0f, 1.0f ) );
GetEtDevice()->EnableAlphaBlend( bEnableAlphaBlend );
}
bool bEnableAlphaBlend = GetEtDevice()->EnableAlphaBlend( true );
CEtPostProcessFilter::DrawFilter( CEtTexture::Identity(), 3 );
GetEtDevice()->EnableAlphaBlend( bEnableAlphaBlend );
}
void CEtLightShaftFilter::DrawFilter( EtTextureHandle hTarget, int nTechnique, EtVector2 vStart, EtVector2 vEnd, EtVector2 vStartUV, EtVector2 vEndUV )
{
if( hTarget )
{
GetEtDevice()->SetRenderTarget( hTarget->GetSurfaceLevel() );
}
else
{
GetEtDevice()->RestoreRenderTarget();
}
int nPasses = 0;
if( !m_hMaterial )
return;
m_hMaterial->SetTechnique( nTechnique );
m_hMaterial->BeginEffect( nPasses );
m_hMaterial->BeginPass( 0 );
m_hMaterial->SetCustomParamList( m_vecCustomParam );
m_hMaterial->CommitChanges();
GetEtDevice()->SetVertexShader( NULL );
DrawQuad( &vStart, &vEnd, &vStartUV, &vEndUV );
m_hMaterial->EndPass();
m_hMaterial->EndEffect();
}