예제 #1
0
void Terrain::Draw(ID3D11DeviceContext* dc, const Camera& cam, DirectionalLight lights[3])
{
	dc->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST);
	dc->IASetInputLayout(InputLayouts::Terrain);

	UINT stride = sizeof(Vertex::Terrain);
    UINT offset = 0;
    dc->IASetVertexBuffers(0, 1, &mQuadPatchVB, &stride, &offset);
	dc->IASetIndexBuffer(mQuadPatchIB, DXGI_FORMAT_R16_UINT, 0);

	XMMATRIX viewProj = cam.ViewProj();
	XMMATRIX world  = XMLoadFloat4x4(&mWorld);
	XMMATRIX worldInvTranspose = MathHelper::InverseTranspose(world);
	XMMATRIX worldViewProj = world*viewProj;
	XMMATRIX ShadowTransform = world * XMLoadFloat4x4(&d3d->m_ShadowTransform);

	XMFLOAT4 worldPlanes[6];
	ExtractFrustumPlanes(worldPlanes, viewProj);

	// Set per frame constants.
	Effects::TerrainFX->SetViewProj(viewProj);
	Effects::TerrainFX->SetEyePosW(cam.GetPosition());
	Effects::TerrainFX->SetDirLights(lights);
	Effects::TerrainFX->SetFogColor(Colors::Silver);
	Effects::TerrainFX->SetFogStart(15.0f);
	Effects::TerrainFX->SetFogRange(175.0f);
	Effects::TerrainFX->SetMinDist(20.0f);
	Effects::TerrainFX->SetMaxDist(400.0f);
	Effects::TerrainFX->SetMinTess(0.0f);
	Effects::TerrainFX->SetMaxTess(6.0f);
	Effects::TerrainFX->SetTexelCellSpaceU(1.0f / mInfo.HeightmapWidth);
	Effects::TerrainFX->SetTexelCellSpaceV(1.0f / mInfo.HeightmapHeight);
	Effects::TerrainFX->SetWorldCellSpace(mInfo.CellSpacing);
	Effects::TerrainFX->SetWorldFrustumPlanes(worldPlanes);
	
	Effects::TerrainFX->SetLayerMapArray(mLayerMapArraySRV);
	Effects::TerrainFX->SetBlendMap(mBlendMapSRV);
	Effects::TerrainFX->SetHeightMap(mHeightMapSRV);
	Effects::TerrainFX->SetShadowMap(d3d->GetShadowMap());
	Effects::TerrainFX->SetShadowTransform(ShadowTransform);

	Effects::TerrainFX->SetMaterial(mMat);

	ID3DX11EffectTechnique* tech = Effects::TerrainFX->Light1Tech;
    D3DX11_TECHNIQUE_DESC techDesc;
    tech->GetDesc( &techDesc );

    for(UINT i = 0; i < techDesc.Passes; ++i)
    {
        ID3DX11EffectPass* pass = tech->GetPassByIndex(i);
		pass->Apply(0, dc);

		dc->DrawIndexed(mNumPatchQuadFaces*4, 0, 0);
	}	

	dc->HSSetShader(0, 0, 0);
	dc->DSSetShader(0, 0, 0);
}
예제 #2
0
void CRender::ViewSetup3D( const CViewSetup *pView, Frustum frustumPlanes )
{
	VPROF("CRender::ViewSetup3D");
	m_view = *pView;
	m_yFOV = CalcFov( m_view.fov, ( float )m_view.width, ( float )m_view.height );

	if( g_nFrameBuffersToClear > 0 )
	{
		SetViewport( m_view.x, m_view.y, m_view.width, m_view.height );
		materialSystemInterface->ClearBuffers( true, m_view.clearDepth );
		g_nFrameBuffersToClear--;
	}

	SetViewport( m_view.x, m_view.y + m_view.height * ( 1.0f - g_ViewportScale ), 
		m_view.width * g_ViewportScale, m_view.height * g_ViewportScale );
	if( m_view.clearColor || m_view.clearDepth )
	{
		materialSystemInterface->ClearBuffers( m_view.clearColor, m_view.clearDepth );
	}
	materialSystemInterface->DepthRange( 0, 1 );

	// build the transformation matrix for the given view angles
	VectorCopy( m_view.origin, r_origin );

	AngleVectors( m_view.angles, &vpn, &vright, &vup );

//	vup = -vup;

	// Copy for VectorTransform
	VectorCopy( &vpn.x, asmvpn );
	VectorCopy( &vright.x, asmvright );
	VectorCopy( &vup.x, asmvup );

	if ( pView->m_bOrtho )
	{
		SetProjectionMatrixOrtho(pView->m_OrthoLeft, pView->m_OrthoTop, pView->m_OrthoRight, pView->m_OrthoBottom, pView->zNear, pView->zFar);
	}
	else
	{
		SetProjectionMatrix( m_view.fov, m_view.zNear, m_view.zFar, m_view.m_bForceAspectRatio1To1 );
	}

	SetViewMatrix( m_view.origin, m_view.angles );

	ExtractMatrices();

	if ( pView->m_bOrtho )
	{
		OrthoExtractFrustumPlanes( frustumPlanes );
	}
	else
	{
		ExtractFrustumPlanes(frustumPlanes);
	}

	OcclusionSystem()->SetView( m_view.origin, m_view.fov, m_matrixView, m_matrixProjection, frustumPlanes[ FRUSTUM_NEARZ ] );

	R_SceneBegin();

	// debug, build leaf volume
	LeafVisBuild( Vector(r_origin) );
}