|
|
我最近在模仿DirectX例子HDRCubeMap做反射效果,但不知道哪里出了错误,反射效果出不来。步骤如下:
1、创建 IDirect3DCubeTexture9:
hr = pDev->CreateCubeTexture( ENVMAPSIZE,
1,
D3DUSAGE_RENDERTARGET,
D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,
& m_pReflectCubeTex,
NULL );
2、把环境渲染到IDirect3DCubeTexture9的六个表面:
LPDIRECT3DSURFACE9 pSufRTBackup; //RenderTarget 备份
LPDIRECT3DSURFACE9 pSufDSBackup; //DepthStencilSurface 备份
pDev->GetRenderTarget( 0, & pSufRTBackup);
if( SUCCEEDED( pDev->GetDepthStencilSurface( & pSufDSBackup) ) )
{
pDev->SetDepthStencilSurface( m_pSurfDepthCube);
}
//设置视口投影矩阵
LPDIRECT3DSURFACE9 pSurf;
D3DXMATRIXA16 mView, mProj;
D3DXMATRIXA16 mViewDir( * GCameraManager::GetInstance()->GetCamera()->GetViewMatrix() );
mViewDir._41 = mViewDir._42 = mViewDir._43 = 0.0f;
D3DXMatrixPerspectiveFovLH( &mProj, D3DX_PI * 0.5f, 1.0f, 0.01f, 10000.0f );
//渲染Cube 6个表面
for( int iFace = 0; iFace < 6; ++iFace)
{
V( m_pReflectCubeTex->GetCubeMapSurface( ( D3DCUBEMAP_FACES) iFace, 0, & pSurf));
V( pDev->SetRenderTarget( 0, pSurf));
mView = DXUTGetCubeMapViewMatrix( iFace);
D3DXMatrixMultiply( & mView, & mViewDir, & mView);
V( pDev->Clear( 0L, NULL, D3DCLEAR_ZBUFFER, 0x000000ff, 1.0f, 0L ));
//if( SUCCEEDED( pDev->BeginScene() ) )
//{
//渲染环境
// pDev->EndScene();
//}
SAFE_RELEASE( pSurf);
}
//恢复设置
if( pSufDSBackup)
{
pDev->SetDepthStencilSurface( pSufDSBackup);
SAFE_RELEASE( pSufDSBackup);
}
pDev->SetRenderTarget( 0, pSufRTBackup);
SAFE_RELEASE( pSufRTBackup);
3、把IDirect3DCubeTexture9贴图映射到反射物体上:
D3DXMATRIXA16 mWorld, mView, mProj, mWorldView;
CBaseCamera * pCamera = GCameraManager::GetInstance()->GetCamera();
: 3DXMatrixTranslation( & mWorld, 0.0f, 0.0f, 0.0f);
mView = * pCamera->GetViewMatrix();
mProj = * pCamera->GetProjMatrix();
::D3DXMatrixMultiply( & mWorldView, & mWorld, & mView);
GVector4 * pLightDirList = G3DSceneManager::GetInstance()->GetLightDirList();
UINT iLightCount = G3DSceneManager::GetInstance()->GetLightCount();
m_pEffect->SetMatrix("g_mWorldView", &mWorldView);
m_pEffect->SetMatrix("g_mWorld", &mWorld);
m_pEffect->SetMatrix("g_mProj", &mProj);
m_pEffect->SetMatrix("g_mView", &mView);
D3DXVECTOR4 vEyePos = D3DXVECTOR4(* GCameraManager::GetInstance()->GetCamera()->GetEyePt(), 0.0f);
m_pEffect->SetVector("g_vEyePos", &vEyePos);
m_pEffect->SetVectorArray( "g_vLightPosView", pLightDirList, iLightCount);
m_pEffect->SetInt( "g_iLightCount", iLightCount);
SAFE_DELETE_ARRAY( pLightDirList);
m_pEffect->SetTexture("g_texReflect", m_pReflectCubeTex);
m_pEffect->SetFloat("g_fReflectivity", m_fReflectivity);
4、fx文件是这样的:
#ifndef MAX_NUM_LIGHTS
#define MAX_NUM_LIGHTS 4
#endif
extern matrix g_mWorld;
extern matrix g_mView;
extern matrix g_mProj;
extern matrix g_mWorldView;
extern vector g_vEyePos;
extern vector g_vLightDir;
texture g_texReflect;
texture g_texRefract;
float4 g_vLightIntensity = { 15.0f, 15.0f, 15.0f, 1.0f};
float4 g_vLightPosView[ MAX_NUM_LIGHTS];
float g_fReflectivity = 0.9f;
samplerCUBE g_samReflect =
sampler_state
{
Texture = <g_texReflect>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
};
void VS_Reflect( float4 iPos : POSITION,
float3 iNor : NORMAL,
out float4 oPos : POSITION,
out float3 oEnvTex : TEXCOORD0 )
{
//matrix g_mWorldView = mul( g_mWorld, g_mView);
oPos = mul( iPos, g_mWorldView);
float3 vN = mul( iNor, g_mWorldView);
vN = normalize( vN);
float3 vEyeR = -normalize( oPos);
float3 vRef = 2 * dot( vEyeR, vN) * vN - vEyeR;
oEnvTex = vRef;
oPos = mul( oPos, g_mProj);
}
float4 PS_Reflect( float3 iTex : TEXCOORD0 ) : COLOR
{
return texCUBE( g_samReflect, iTex) * g_fReflectivity;
}
technique Tec_RenderMaterial
{
pass p0
{
vertexShader = compile vs_2_0 VS_Reflect();
pixelShader = compile ps_2_0 PS_Reflect();
}
}
哪位高手能指点一下,谢谢!
|
|