⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shader_reflect_and_refract.cpp

📁 游戏编程精华02-含有几十个游戏编程例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -