📄 shader_reflect_and_refract.cpp
字号:
0,
D3DFMT_UNKNOWN,
D3DPOOL_MANAGED,
D3DX_FILTER_LINEAR,
D3DX_FILTER_LINEAR,
0,
NULL,
NULL,
&m_pCubeTexture);
if (FAILED(hr))
{
m_strLastError = "Could not create sky_cube_mipmap.dds";
return hr;
}
m_pSphere->SetTexture(m_pCubeTexture);
m_pD3DDev->SetTexture(1,m_pCubeTexture );
// tex 1 used for environment cube map
m_pD3DDev->SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
m_pD3DDev->SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
// tex 0 used for rendering environment object (cube)
// That clamp mode is set elsewhere when box is drawn
m_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
m_pD3DDev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
m_pD3DDev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
m_pD3DDev->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
m_pD3DDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADD);
m_pD3DDev->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pD3DDev->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_ADD);
m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
m_pD3DDev->SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
m_pD3DDev->SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
m_pD3DDev->SetTextureStageState(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
m_pD3DDev->SetVertexShaderConstant(CV_ZERO, D3DXVECTOR4(0.0f,0.0f,0.0f,0.0f), 1);
m_pD3DDev->SetVertexShaderConstant(CV_ONE, D3DXVECTOR4(1.0f,1.0f,1.0f,1.0f), 1);
// m_pD3DDev->SetVertexShaderConstant(CV_HALF, D3DXVECTOR4(0.5f,0.5f,0.5f,0.5f), 1);
m_pSphere->RestoreDeviceObjects(m_pNVDevice);
return S_OK;
}
HRESULT CShaderReflectRefract::Free()
{
for (int i = 0; i < 6; i++)
{
SAFE_RELEASE(m_pWorldTextures[i]);
}
SAFE_DELETE(m_pSphere);
SAFE_RELEASE(m_pCubeTexture);
SAFE_DELETE(m_pNVDevice);
SAFE_RELEASE(m_pWorldBoxVertices);
SAFE_RELEASE(m_pWorldBoxIndices);
if (m_pD3DDev)
{
m_pD3DDev->DeleteVertexShader(m_dwCurrentShader);
SAFE_RELEASE(m_pD3DDev);
}
delete m_pUI, m_pUI = 0;
return S_OK;
}
HRESULT CShaderReflectRefract::Start()
{
return S_OK;
}
HRESULT CShaderReflectRefract::DrawWorldBox()
{
m_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_NONE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
m_pD3DDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pD3DDev->SetStreamSource(0, m_pWorldBoxVertices, sizeof(WorldBoxVertex));
m_pD3DDev->SetIndices(m_pWorldBoxIndices, 0);
m_pD3DDev->SetVertexShader(D3DFVF_XYZ | D3DFVF_TEX1);
m_pD3DDev->SetTexture(0, m_pWorldTextures[D3DCUBEMAP_FACE_NEGATIVE_Z]);
m_pD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, NUM_CUBE_VERTICES, 0, 2);
m_pD3DDev->SetTexture(0, m_pWorldTextures[D3DCUBEMAP_FACE_POSITIVE_Z]);
m_pD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, NUM_CUBE_VERTICES, 6, 2);
m_pD3DDev->SetTexture(0, m_pWorldTextures[D3DCUBEMAP_FACE_NEGATIVE_Y]);
m_pD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, NUM_CUBE_VERTICES, 12, 2);
m_pD3DDev->SetTexture(0, m_pWorldTextures[D3DCUBEMAP_FACE_POSITIVE_Y]);
m_pD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, NUM_CUBE_VERTICES, 18, 2);
m_pD3DDev->SetTexture(0, m_pWorldTextures[D3DCUBEMAP_FACE_NEGATIVE_X]);
m_pD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, NUM_CUBE_VERTICES, 24, 2);
m_pD3DDev->SetTexture(0, m_pWorldTextures[D3DCUBEMAP_FACE_POSITIVE_X]);
m_pD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, NUM_CUBE_VERTICES, 30, 2);
return S_OK;
}
HRESULT CShaderReflectRefract::Tick(EBTimer* pTimer)
{
HRESULT hr = S_OK;
D3DXMATRIX matWorld;
D3DXMATRIX matView;
D3DXMATRIX matViewInv;
D3DXMATRIX matProj;
D3DXMATRIX matTemp;
D3DXMATRIX matWorldView;
D3DXMATRIX matWorldViewIT;
D3DXMATRIX matWorldViewProj;
// Set refraction value
m_pD3DDev->SetVertexShaderConstant(CV_REFRACT, D3DXVECTOR4(m_fRefraction, m_fRefraction, m_fRefraction, m_fRefraction ), 1);
hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0x00, 0x00, 0x00 ), 1.0, 0);
if (m_bWireframe)
{
m_pD3DDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00BFBFBF, 1.0f, 0L);
}
else
{
m_pD3DDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
}
// Set View transform
D3DXVECTOR3 vEyePt = D3DXVECTOR3( 10.0f, 0.0f, -0.0f );
D3DXVECTOR3 vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUp = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
D3DXVECTOR4 vRotatedEyePt, newViewVec;
D3DXMATRIX compoundMouseMatrix;
D3DXVECTOR4 vTransEye, vTransLookat;
D3DXVec3Transform(&vTransEye, &vEyePt, &m_pUI->GetTranslationMatrix());
D3DXVec4Transform(&vRotatedEyePt, &vTransEye, &m_pUI->GetRotationMatrix());
m_pD3DDev->SetVertexShaderConstant(CV_WORLDEYEPOS, &vRotatedEyePt, 1);
D3DXMatrixLookAtLH(&matView, &((D3DXVECTOR3)vRotatedEyePt), &vLookatPt, &vUp);
m_pD3DDev->SetTransform(D3DTS_VIEW, &matView);
// Set Projection transform
D3DXMatrixPerspectiveFovLH(&matProj, D3DXToRadian(45.0f), 1.0f, 0.2f, 200.0f);
m_pD3DDev->SetTransform(D3DTS_PROJECTION, &matProj);
// Set World transform for sky box
D3DXVECTOR3 vecScale;
// Scale the sky box
vecScale.x = 100.0; vecScale.y = 100.0; vecScale.z = 100.0;
D3DXMatrixScaling(&matWorld, vecScale.x, vecScale.y, vecScale.z);
// Draw sky box
m_pD3DDev->SetTransform(D3DTS_WORLD, &matWorld);
m_pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
m_pD3DDev->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
m_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
DrawWorldBox();
m_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
m_pD3DDev->SetRenderState(D3DRS_ZENABLE, TRUE);
m_pD3DDev->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
// Set states for sphere render
// Using TFACTOR for blend between reflection and refraction
m_pD3DDev->SetRenderState( D3DRS_TEXTUREFACTOR, 0xd0ffffff );
// Set sphere render texture (stage 0), and stage 1 to cubemap
m_pSphere->SetTexture(m_pCubeTexture);
m_pD3DDev->SetTexture(1, m_pCubeTexture);
m_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
m_pD3DDev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
m_pD3DDev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
m_pD3DDev->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
m_pD3DDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_BLENDFACTORALPHA);
m_pD3DDev->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pD3DDev->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_BLENDFACTORALPHA);
m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
m_pD3DDev->SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
m_pD3DDev->SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
m_pD3DDev->SetTextureStageState(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
D3DXMatrixScaling(&matWorld, 1.0f,1.0f,1.0f);
// Generate matrices for vertex shader
// Projection to clip space
D3DXMatrixMultiply(&matWorldView, &matWorld, &matView);
D3DXMatrixMultiply(&matWorldViewProj, &matWorldView, &matProj);
D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);
// World transform
D3DXMatrixTranspose(&matWorld, &matWorld);
m_pD3DDev->SetVertexShaderConstant(CV_WORLD_0, &matWorld(0, 0), 4);
if (m_bMipMap)
{
m_pD3DDev->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
}
else
{
m_pD3DDev->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_NONE);
}
m_pSphere->Render(m_pNVDevice);
return hr;
}
void CShaderReflectRefract::MouseButton(HWND hWnd, eButtonID button, bool bDown, int x, int y)
{
if( (button == MOUSE_LEFTBUTTON) )
{
if(bDown)
{
m_pUI->OnLButtonDown(x, y);
}
else
{
m_pUI->OnLButtonUp(x, y);
}
}
return;
}
void CShaderReflectRefract::MouseMove(HWND hWnd, int x, int y)
{
m_pUI->OnMouseMove(x, y);
return;
}
void CShaderReflectRefract::Keyboard(DWORD dwKey, UINT nFlags, bool bDown)
{
if(bDown)
{
switch(dwKey)
{
case 'W':
case 'w':
m_bWireframe = !m_bWireframe;
m_dwEffectDirtyFlags |= EBEFFECT_DIRTY_PUBLICSTATE;
break;
case 'H' :
case VK_F1 :
{
::MessageBoxEx( NULL, " Help : F1 - Help \n\n Home - Reset To Defaults \n\n W - Wireframe Toggle \n\n Space\\Pause - Toggle Pause/Resume \n\n Left Button & Mouse - Rotate Object\n\n Shift Left Button & Mouse - Pan Camera \n\n Ctrl Left Button & Mouse - Move Camera In & Out\n\n + increase index of refraction\n\n - decrease index of refraction",
"Help", MB_ICONINFORMATION | MB_TASKMODAL, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ) );
break;
}
case VK_ADD:
case 0xBB:
case '+':
case '=':
{
m_fRefraction += 0.005f;
break;
}
case VK_SUBTRACT:
case 0xBD:
case '-':
case '_':
{
m_fRefraction -= 0.005f;
if(m_fRefraction < 0)
m_fRefraction = 0;
break;
}
case VK_HOME :
case VK_END :
case VK_NUMPAD7 :
case VK_NUMPAD1 :
case '7' :
case '1' :
m_pUI->Reset();
m_bWireframe = false;
m_dwEffectDirtyFlags |= EBEFFECT_DIRTY_PUBLICSTATE;
break;
case VK_UP :
case VK_NUMPAD8 :
case '8' :
m_pUI->Translate( -0.5f, 0.0f, 0.0f );
break;
case VK_DOWN :
case VK_NUMPAD2 :
case '2' :
m_pUI->Translate( 0.5f, 0.0f, 0.0f );
break;
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -