public static void RenderCells(GraphicsDevice graphics, Frustum frustum, TerrainGeometryCellsComponent geo, D3DTerrainRenderComponent render, TransformComponent transform) { var context = graphics.ImmediateContext; if (render.TransformWorldBuffer.HasValue) { context.VertexShader.SetConstantBuffer(TransforStructBuffer.RegisterResourceSlot, render.TransformWorldBuffer.Get()); } context.InputAssembler.InputLayout = render.Layout.Get(); context.InputAssembler.PrimitiveTopology = render.PrimitiveTopology; graphics.UpdateRasterizerState(render.RasterizerState.GetDescription()); context.OutputMerger.SetDepthStencilState(render.DepthStencilState.Get(), 0); var blendFactor = new SharpDX.Mathematics.Interop.RawColor4(0, 0, 0, 0); context.OutputMerger.SetBlendState(render.BlendingState.Get(), blendFactor, -1); for (var index = 0; index < geo.Cells.Length; ++index) { var cell = geo.Cells[index]; var box = cell.Tree.GetBounds().Transform(transform.MatrixWorld); if (cell.Tree.IsBuilt && frustum.Contains(ref box) != Frustum.ContainmentType.Disjoint) { context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(render.VertexBuffers.Get()[index], TerrainVertex.Size, 0)); context.InputAssembler.SetIndexBuffer(render.IndexBuffers.Get()[index], SharpDX.DXGI.Format.R32_UInt, 0); graphics.ImmediateContext.DrawIndexed(cell.IndexCount, 0, 0); } } }
void UpdateCellBuffers(GraphicsDevice graphics, TerrainGeometryCellsComponent geo, D3DTerrainRenderComponent render) { var vbuff = new SharpDX.Direct3D11.Buffer[geo.Cells.Length]; var ibuff = new SharpDX.Direct3D11.Buffer[geo.Cells.Length]; for (var cellIndex = 0; cellIndex < geo.Cells.Length; cellIndex++) { var cell = geo.Cells[cellIndex]; var pool = ArrayPool <TerrainClipmapsVertex> .Shared; TerrainClipmapsVertex[] vertex = null; try { //vertex = new TerrainVertex[pos.Length]; vertex = pool.Rent(cell.VertexCount);// for (var i = 0; i < cell.VertexCount; i++) { vertex[i] = new TerrainClipmapsVertex { texcoor = cell.TextureCoordinates[i], }; } vbuff[cellIndex] = graphics.CreateBuffer(BindFlags.VertexBuffer, vertex); ibuff[cellIndex] = graphics.CreateBuffer(BindFlags.IndexBuffer, cell.Indices); } finally { pool.Return(vertex); } } render.VertexBuffers.Set(vbuff); render.IndexBuffers.Set(ibuff); }
public static void UpdateCellBuffers(GraphicsDevice graphics, TerrainGeometryCellsComponent geo, D3DTerrainRenderComponent render) { var vbuff = new SharpDX.Direct3D11.Buffer[geo.Cells.Length]; var ibuff = new SharpDX.Direct3D11.Buffer[geo.Cells.Length]; for (var cellIndex = 0; cellIndex < geo.Cells.Length; cellIndex++) { var cell = geo.Cells[cellIndex]; var pool = ArrayPool <TerrainVertex> .Shared; TerrainVertex[] vertex = null; try { //vertex = new TerrainVertex[pos.Length]; vertex = pool.Rent(cell.VertexCount);// for (var i = 0; i < cell.VertexCount; i++) { var weight = new Vector4( SharpDX.MathUtil.Clamp(1.0f - (float)Math.Abs(cell.Positions[i].Y - 0f) / 8.0f, 0f, 1f), SharpDX.MathUtil.Clamp(1.0f - (float)Math.Abs(cell.Positions[i].Y - 10) / 6.0f, 0f, 1f), SharpDX.MathUtil.Clamp(1.0f - (float)Math.Abs(cell.Positions[i].Y - 15) / 6.0f, 0f, 1f), SharpDX.MathUtil.Clamp(1.0f - (float)Math.Abs(cell.Positions[i].Y - geo.MaxHeight) / 4.0f, 0f, 1f) ); var total = weight.X + weight.Y + weight.Z + weight.W; weight.X /= total; weight.Y /= total; weight.Z /= total; weight.W /= total; vertex[i] = new TerrainVertex { position = cell.Positions[i], normal = cell.Normals[i], tangent = cell.Tangents[i], binormal = cell.Binormal[i], color = cell.Colors[i], texcoor = cell.TextureCoordinates[i], normapMapTexCoor = cell.NormalMapTexCoordinates[i], texWeights = weight, }; } vbuff[cellIndex] = graphics.CreateBuffer(BindFlags.VertexBuffer, vertex); ibuff[cellIndex] = graphics.CreateBuffer(BindFlags.IndexBuffer, cell.Indices); } finally { pool.Return(vertex); } } render.VertexBuffers.Set(vbuff); render.IndexBuffers.Set(ibuff); }