示例#1
0
void DXCenter::DXRender()
{
	m_pContext->IASetInputLayout(m_pInputLayout->GetIL(L"IL1"));
	m_pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
	m_pContext->VSSetShader(m_pVertexShader->GetVS(L"VS1"));
	m_pContext->PSSetShader(m_pPixelShader->GetPS(L"PS1"));
	m_pContext->PSSetSamplers(m_pSamplerState->GetSampler(L"SS1"));

	Scene* currentScene = LGCenter::Instance()->GetCurrentScene();
	CHECK_TO_RETURN(currentScene);

	//m_pContext->ClearRenderTargetView(m_pRenderTargetView->GetRTV(L"RTV1"));

	//将当前场景的游戏对象绘制
	vector<Object*> currentObjVec = currentScene->GetAllDirtyObject();
	for (vector<Object*>::const_iterator itrObj = currentObjVec.begin(); itrObj != currentObjVec.end(); ++itrObj)
	{
		std::vector<LGRect> RectVec = (*itrObj)->GetRectDirty();

		for (std::vector<LGRect>::const_iterator itrRect = RectVec.begin(); 
			itrRect != RectVec.end(); ++itrRect)
		{
			Sprite const& currentSprite = (*itrObj)->GetCurrentSprite();
			wstring currentPath = currentSprite.GetPicPath();

			//更新图片(本质是设置着色器资源视图)
			m_pContext->PSSetShaderResources(m_pShaderResourceView->GetSRV(currentPath));

			//更新精灵位置和动画(本质是更新顶点位置和UV坐标)
			m_pContext->FreshPic<VertexPos>(m_pVertexBuffer->GetVB(L"VB1"), 
				currentSprite.GetPicSizeWidth(), currentSprite.GetPicSizeHeight(),
				currentSprite.GetCurrentRow(), currentSprite.GetCurrentCol(), 
				(*itrObj)->GetSpriteRect(),(*itrRect));

			//设置顶点
			m_pContext->IASetVertexBuffers<VertexPos>(m_pVertexBuffer->GetVB(L"VB1"));

			//更新模型-世界-视图矩阵
			XMMATRIX mvp = m_pVPMatrix->CreateMVP(L"VP1",
				XMFLOAT2((*itrRect).GetX(),(*itrRect).GetY()));
			m_pContext->UpdateSubresource(m_pConstBuffer->GetCB(L"CB1") ,&mvp);
			m_pContext->VSSetConstantBuffers(m_pConstBuffer->GetCB(L"CB1"));

			//绘制当前对象
			m_pContext->Draw();
		}

	}
	g_pLGCenter->GetCurrentScene()->ClearDirty();

	m_pSwapChain->GetSRV(L"SC1")->Present(1,0);

}