📄 ca_fire.cpp
字号:
D3DXMatrixScaling(&matWorld, 2.0f, 2.0f, 1.0f);
D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);
if( m_bReset == true )
{
m_bReset = false;
m_nFlipState = 0;
m_bSingleStep = true; // if animation stopped, render a single step
// after reseting
}
int tmp;
if( m_nFlipState == 0 )
{
m_nTarget1 = 0;
m_nTarget2 = 1;
// Need to set textures to null so that when SetRenderTarget is
// called, none of the render targets are bound as textures.
hr = m_pD3DDev->SetTexture(0, NULL );
ASSERT_IF_FAILED(hr);
hr = m_pD3DDev->SetTexture(1, NULL );
ASSERT_IF_FAILED(hr);
hr = m_pD3DDev->SetTexture(2, NULL );
ASSERT_IF_FAILED(hr);
hr = m_pD3DDev->SetTexture(3, NULL );
ASSERT_IF_FAILED(hr);
// Clear the textures
hr = m_pD3DDev->SetRenderTarget( mpFilterTarget[m_nTarget1], NULL);
ASSERT_IF_FAILED( hr );
hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0x0, 0x00, 0x00 ), 1.0, 0);
hr = m_pD3DDev->SetRenderTarget( mpFilterTarget[m_nTarget2], NULL);
ASSERT_IF_FAILED( hr );
hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0x0, 0x00, 0x00 ), 1.0, 0);
}
else if( m_bAnimate == true || m_bSingleStep == true )
{
switch( m_nFlipState )
{
case 1:
// flip-flop between source and dest
// textures
tmp = m_nTarget2;
m_nTarget2 = m_nTarget1;
m_nTarget1 = tmp;
break;
}
}
if( m_bAnimate == true )
{
// Update the textures for one step of the
// game or cellular automata
DoSingleTimeStep();
}
else if( m_bSingleStep == true )
{
DoSingleTimeStep();
m_bSingleStep = false;
}
else
{
// slow down the rendering and give any other apps a chance
Sleep(70);
}
if( m_bSlow && (m_nSlowDelay > 0) )
{
Sleep(m_nSlowDelay);
}
IDirect3DTexture8 * pSrcTex;
static int nSkip = 0;
if( nSkip >= m_nSkipInterval && (m_eRenderMode != DO_NOT_RENDER))
{
nSkip = 0;
// Switch back to normal rendering to display the results of
// the rendering to texture
m_pD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, false );
hr = m_pD3DDev->SetRenderTarget(mpBackbufferColor, mpBackbufferDepth);
ASSERT_IF_FAILED( hr );
// turn off pixel shading
SetPixelShader(0);
if( m_bWireframe )
{
m_pD3DDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME );
// chances are the texture will be all dark, so render in solid color
m_pD3DDev->SetRenderState( D3DRS_TEXTUREFACTOR, 0xFFFFFFFF );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TFACTOR );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
}
else
{
m_pD3DDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
}
switch( m_eRenderMode )
{
case FULLSCREEN_FINALOUT :
// Draw quad over full display
D3DXMatrixScaling(&matWorld, 2.0f, 2.0f, 1.0f);
D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);
// reset offsets to 0 (ie no offsets)
offset.x = 0.0f;
m_pD3DDev->SetVertexShaderConstant(CV_UV_OFFSET_TO_USE, &offset, 1);
m_pD3DDev->SetTexture(0, m_pOutputSrc );
hr = m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
break;
case FULLSCREEN_EMBER_TEXTURE:
// Draw quad over full display
D3DXMatrixScaling(&matWorld, 2.0f, 2.0f, 1.0f);
D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);
// reset offsets to 0 (ie no offsets)
offset.x = 0.0f;
m_pD3DDev->SetVertexShaderConstant(CV_UV_OFFSET_TO_USE, &offset, 1);
m_pD3DDev->SetTexture(0, m_pInputTexture );
hr = m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
break;
case ALL_TOGETHER :
// draw quad in upper left corner: original texture
D3DXMatrixTranslation(&matWorld, -1.0f, 1.0f, 0.0f);
D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);
// reset offsets to 0 (ie no offsets)
offset.x = 0.0f;
m_pD3DDev->SetVertexShaderConstant(CV_UV_OFFSET_TO_USE, &offset, 1);
m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0x0, 0x00, 0x00 ), 1.0, 0);
// draw quads in the other corners, use generated textures
for (int j = 0; j < 3; ++j)
{
D3DXMatrixTranslation(&matWorld, (j == 2) ? -1.0f : 1.0f,
(j == 0) ? 1.0f : -1.0,
0.0f);
D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);
pSrcTex = m_pInputTexture; // upper right corner image
if( m_bAnimate )
{
if( j==1 )
pSrcTex = mpTextureFiltered[m_nTarget1]; // low right corner
else if( j==2 )
pSrcTex = mpTextureFiltered[m_nTarget2]; // low left corner
}
else
{
assert( 1 < kMaxNumTargets );
if( j==1 )
pSrcTex = mpTextureFiltered[0]; // low right corner
else if( j==2 )
pSrcTex = mpTextureFiltered[1]; // low left corner
}
if( pSrcTex != 0 )
{
m_pD3DDev->SetTexture(0, pSrcTex );
hr = m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
}
}
break;
}; // switch for display config
}
else
{
// skip rendering this frame
// Set normal render target in case the app is doing more rendering
// to the window
hr = m_pD3DDev->SetRenderTarget(mpBackbufferColor, mpBackbufferDepth);
nSkip++;
}
return( hr );
}
HRESULT CA_Fire::DoSingleTimeStep()
{
HRESULT hr;
int i;
float pix_mult[4];
// variable for writing to constant memory which uv-offsets to use
D3DXVECTOR4 offset(0.0f, 1.0f, 0.0f, 0.0f);
m_pD3DDev->SetVertexShaderConstant( CV_ONOFF_1, &offset, 1);
DWORD wrapval;
//////////////////////////////////////////////////////////////////
// Need to set textures to null so that when SetRenderTarget is
// called, none of the render targets are bound as textures.
hr = m_pD3DDev->SetTexture(0, NULL );
ASSERT_IF_FAILED(hr);
hr = m_pD3DDev->SetTexture(1, NULL );
ASSERT_IF_FAILED(hr);
hr = m_pD3DDev->SetTexture(2, NULL );
ASSERT_IF_FAILED(hr);
hr = m_pD3DDev->SetTexture(3, NULL );
ASSERT_IF_FAILED(hr);
hr = m_pD3DDev->SetRenderTarget( mpFilterTarget[m_nTarget1], NULL );
ASSERT_IF_FAILED(hr);
D3DXMATRIX matWorld;
D3DXMATRIX matView;
D3DXMATRIX matProj;
D3DXMATRIX matTemp;
D3DXMATRIX matViewProj;
D3DXMATRIX matWorldViewProj;
// Render embers into newly cleared texture, blending old texture
// on top of the embers
if( m_pInputTexture != NULL )
{
//////////////////////////////////////////////////////
// Set matrix for rendering embers into texture
// on a quad viewed in perspective from various
// orientations controlled by mouse
float height = 0.45f;
D3DXVECTOR3 vNEWEyePt = D3DXVECTOR3( 0.0f, height, -2.5f );
D3DXVECTOR3 vNEWLookatPt = D3DXVECTOR3( 0.0f, height, 0.0f );
D3DXVECTOR3 vNEWUp = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
// Set World, View, Projection, and combination matrices.
D3DXMatrixLookAtLH(&matView, &vNEWEyePt, &vNEWLookatPt, &vNEWUp);
D3DXMatrixPerspectiveFovLH( &matProj, 3.1415f/5.0f, 1.0f, 0.5f, 300.0f );
D3DXMatrixRotationX( &matTemp, 3.14159f * 0.5f );
D3DXMatrixMultiply(&matViewProj, &matView, &matProj);
D3DXMatrixIdentity( &matWorld );
D3DXMatrixMultiply( &matWorld, &m_pUI->GetRotationMatrix(), &m_pUI->GetTranslationMatrix() );
// Apply mouse UI rotation after initial X axis rotation in matTemp
D3DXMatrixMultiply( &matWorld, &matTemp, &matWorld );
D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);
// Render 1st using offset set 1 - for nearest neighbor pixels
offset.x = 1.0f;
m_pD3DDev->SetVertexShaderConstant(CV_UV_OFFSET_TO_USE, &offset, 1);
m_pD3DDev->SetTexture(0, m_pInputTexture );
m_pD3DDev->SetTexture(1, m_pInputTexture );
m_pD3DDev->SetTexture(2, m_pInputTexture );
m_pD3DDev->SetTexture(3, m_pInputTexture );
pix_mult[0] = 0.45f; // red
pix_mult[1] = 0.15f; // green
pix_mult[2] = 0.05f; // blue
pix_mult[3] = 0.0f; // alpha
hr = m_pD3DDev->SetPixelShaderConstant( PCN_MULTFACTOR_1, &pix_mult, 1 );
ASSERT_IF_FAILED(hr);
pix_mult[0] = 0.45f; // red
pix_mult[1] = 0.15f; // green
pix_mult[2] = 0.05f; // blue
pix_mult[3] = 0.0f; // alpha
hr = m_pD3DDev->SetPixelShaderConstant( PCN_MULTFACTOR_2, &pix_mult, 1 );
ASSERT_IF_FAILED(hr);
hr = SetPixelShader( m_dwTwoWeight_PostMultShader );
ASSERT_IF_FAILED( hr );
offset.x = 1.0f;
m_pD3DDev->SetVertexShaderConstant(CV_UV_OFFSET_TO_USE, &offset, 1);
if( m_bWireframe )
{
// special consideration for showing wireframe object being
// rendered as the source embers
hr = m_pD3DDev->SetRenderTarget(mpBackbufferColor, mpBackbufferDepth);
ASSERT_IF_FAILED( hr );
hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0x0, 0x00, 0x00 ), 1.0, 0);
ASSERT_IF_FAILED(hr);
SetPixelShader( 0 );
m_pD3DDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME );
// chances are the texture will be all dark, so render in solid color
m_pD3DDev->SetRenderState( D3DRS_TEXTUREFACTOR, 0xFFFFFFFF );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TFACTOR );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
// Draw object on which embers would appear
// This version for wireframe mode
bool drawtorus = true;
if( drawtorus )
{
SetVertexShader( m_SHI_SimpleObjVShader );
m_pObj->Draw();
}
else // draw flat plane
{
hr = m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
ASSERT_IF_FAILED(hr);
}
return( S_OK );
}
else
{
hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0x0, 0x00, 0x00 ), 1.0, 0);
ASSERT_IF_FAILED(hr);
// Add result into the dest texture:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -