protected void PreDraw(SharpDX.Direct3D.PrimitiveTopology PTolology, bool isBlending = false, RawColor4?blendFactor = null) { //Установка шейдеров _dx11DeviceContext.VertexShader.Set(_vertexShader); _dx11DeviceContext.PixelShader.Set(_pixelShader); //Устанавливаем самплер текстуры для шейдера _dx11DeviceContext.PixelShader.SetSampler(0, _samplerState); //Задаем тип рисуемых примитивов _dx11DeviceContext.InputAssembler.PrimitiveTopology = PTolology; //Устанавливаем макет для входных данных видеокарты. В нем указано какие данные ожидает шейдер _dx11DeviceContext.InputAssembler.InputLayout = _inputLayout; //Перенос данных буферов в видеокарту _dx11DeviceContext.InputAssembler.SetVertexBuffers(0, _vertexBinging); _dx11DeviceContext.InputAssembler.SetIndexBuffer(_indexBuffer, SharpDX.DXGI.Format.R32_UInt, 0); _dx11DeviceContext.VertexShader.SetConstantBuffer(0, _constantBuffer); //Отправляем текстуру в шейдер _dx11DeviceContext.PixelShader.SetShaderResource(0, _textureResourse); _dx11DeviceContext.Rasterizer.State = _rasterizerState; _dx11DeviceContext.OutputMerger.DepthStencilState = _DState; _dx11DeviceContext.OutputMerger.SetBlendState(null, null); if (isBlending) { _dx11DeviceContext.OutputMerger.SetBlendState(_blendState, blendFactor); } }
public override void Render(DeviceContext context, SharpDX.Direct3D.PrimitiveTopology type, int size, uint offset) { context.InputAssembler.InputLayout = Layout; context.VertexShader.Set(VertexShader); context.PixelShader.Set(PixelShader); context.DrawIndexed(size, (int)offset, 0); }
// Note: no need to store RTV/DSV formats internal PipelineState(GraphicsDevice graphicsDevice, PipelineStateDescription pipelineStateDescription) : base(graphicsDevice) { // First time, build caches var pipelineStateCache = GetPipelineStateCache(); // Effect this.rootSignature = pipelineStateDescription.RootSignature; this.effectBytecode = pipelineStateDescription.EffectBytecode; CreateShaders(pipelineStateCache); if (rootSignature != null && effectBytecode != null) { ResourceBinder.Compile(graphicsDevice, rootSignature.EffectDescriptorSetReflection, this.effectBytecode); } // TODO: Cache over Effect|RootSignature to create binding operations // States blendState = pipelineStateCache.BlendStateCache.Instantiate(pipelineStateDescription.BlendState); this.sampleMask = pipelineStateDescription.SampleMask; rasterizerState = pipelineStateCache.RasterizerStateCache.Instantiate(pipelineStateDescription.RasterizerState); depthStencilState = pipelineStateCache.DepthStencilStateCache.Instantiate(pipelineStateDescription.DepthStencilState); CreateInputLayout(pipelineStateDescription.InputElements); primitiveTopology = (SharpDX.Direct3D.PrimitiveTopology)pipelineStateDescription.PrimitiveType; }
public virtual void Render(DeviceContext context, SharpDX.Direct3D.PrimitiveTopology type, int size, uint offset) { context.InputAssembler.InputLayout = Layout; // set shaders only if available if (OurVertexShader != null) { context.VertexShader.Set(OurVertexShader); } if (OurVertexShader != null) { context.PixelShader.Set(OurPixelShader); context.PixelShader.SetSampler(0, SamplerState); } if (OurVertexShader != null) { context.GeometryShader.Set(OurGeometryShader); } context.DrawIndexed(size, (int)offset, 0); Profiler.NumDrawCallsThisFrame++; }
public override void Render(DeviceContext deviceContext, SharpDX.Direct3D.PrimitiveTopology type, int numTriangles, uint offset) { deviceContext.InputAssembler.InputLayout = Layout; deviceContext.VertexShader.Set(VertexShader); deviceContext.PixelShader.Set(PixelShader); deviceContext.PixelShader.SetSampler(0, SamplerState); deviceContext.DrawIndexed(numTriangles, (int)offset, 0); }
protected void SetPrimitiveTopology(SharpDX.Direct3D.PrimitiveTopology topology) { if (CurrentPrimitiveTopology == topology) { return; } CurrentPrimitiveTopology = topology; GetContext.InputAssembler.PrimitiveTopology = topology; }
private void Create(SharpDX.Direct3D11.Device device, WorldVertex[] vertices, uint[] indices, SharpDX.Direct3D.PrimitiveTopology topology) { VertexBuffer = Buffer.Create(device, vertices, new BufferDescription(Utilities.SizeOf <WorldVertex>() * vertices.Length, BindFlags.VertexBuffer, ResourceUsage.Immutable)); IndexBuffer = Buffer.Create(device, indices, new BufferDescription(Utilities.SizeOf <uint>() * indices.Length, BindFlags.IndexBuffer, ResourceUsage.Immutable)); PrimitiveType = topology; IndexCount = indices.Length; }
private void ResetManagedState() { _numVertexBindings = 0; Util.ClearArray(_vertexBindings); _vertexStrides = null; Util.ClearArray(_vertexOffsets); _framebuffer = null; Util.ClearArray(_viewports); Util.ClearArray(_scissors); _viewportsChanged = false; _scissorRectsChanged = false; _ib = null; _graphicsPipeline = null; _blendState = null; _depthStencilState = null; _rasterizerState = null; _primitiveTopology = SharpDX.Direct3D.PrimitiveTopology.Undefined; _inputLayout = null; _vertexShader = null; _geometryShader = null; _hullShader = null; _domainShader = null; _pixelShader = null; Util.ClearArray(_graphicsResourceSets); Util.ClearArray(_vertexBoundUniformBuffers); Util.ClearArray(_vertexBoundTextureViews); Util.ClearArray(_vertexBoundSamplers); Util.ClearArray(_fragmentBoundUniformBuffers); Util.ClearArray(_fragmentBoundTextureViews); Util.ClearArray(_fragmentBoundSamplers); _computePipeline = null; Util.ClearArray(_computeResourceSets); foreach (KeyValuePair <Texture, List <BoundTextureInfo> > kvp in _boundSRVs) { List <BoundTextureInfo> list = kvp.Value; list.Clear(); PoolBoundTextureList(list); } _boundSRVs.Clear(); foreach (KeyValuePair <Texture, List <BoundTextureInfo> > kvp in _boundUAVs) { List <BoundTextureInfo> list = kvp.Value; list.Clear(); PoolBoundTextureList(list); } _boundUAVs.Clear(); }
public void Draw(Matrix world, Matrix view, Matrix proj, SharpDX.Direct3D.PrimitiveTopology pt = SharpDX.Direct3D.PrimitiveTopology.TriangleList) { cbuffer mvp = new cbuffer(this.World * world, view, proj); mvp.Transpose(); mvp.TF = tFactor; _dx11Context.UpdateSubresource(ref mvp, _constantBuffer); VM.ConstantBuffers = new[] { _constantBuffer }; foreach (var item in subsets) { item.FillVM(ref VM); dr.Draw(VM, pt); } }
int GetIndex(SharpDX.Direct3D.PrimitiveTopology topology) { var i = _positions.Count; if (i == 0) { _topology = topology; } else { if (_topology != topology) { throw new InvalidOperationException(); } } return(i); }
public override void Render(DeviceContext deviceContext, SharpDX.Direct3D.PrimitiveTopology type, int size, uint offset) { deviceContext.InputAssembler.InputLayout = Layout; deviceContext.VertexShader.Set(VertexShader); deviceContext.PixelShader.Set(PixelShader); switch (type) { case SharpDX.Direct3D.PrimitiveTopology.LineList: case SharpDX.Direct3D.PrimitiveTopology.TriangleList: deviceContext.DrawIndexed(size, (int)offset, 0); break; case SharpDX.Direct3D.PrimitiveTopology.LineStrip: deviceContext.Draw(size, 0); break; default: break; } }
private void ResetManagedState() { _numVertexBindings = 0; Util.ClearArray(_vertexBindings); _vertexStrides = null; Util.ClearArray(_vertexOffsets); _fb = null; Util.ClearArray(_viewports); Util.ClearArray(_scissors); _viewportsChanged = false; _scissorRectsChanged = false; _ib = null; _pipeline = null; _blendState = null; _depthStencilState = null; _rasterizerState = null; _primitiveTopology = SharpDX.Direct3D.PrimitiveTopology.Undefined; _inputLayout = null; _vertexShader = null; _geometryShader = null; _hullShader = null; _domainShader = null; _pixelShader = null; Util.ClearArray(_resourceSets); Util.ClearArray(_vertexBoundUniformBuffers); Util.ClearArray(_vertexBoundTextureViews); Util.ClearArray(_vertexBoundSamplers); Util.ClearArray(_fragmentBoundUniformBuffers); Util.ClearArray(_fragmentBoundTextureViews); Util.ClearArray(_fragmentBoundSamplers); }
public static void DrawForScreen(RenderContext11 renderContext, PositionColoredTextured[] points, int count, Texture11 texture, SharpDX.Direct3D.PrimitiveTopology primitiveType) { if (VertexBuffer == null) { VertexBuffer = new Buffer(renderContext.Device, System.Runtime.InteropServices.Marshal.SizeOf(points[0]) * 2500, ResourceUsage.Dynamic, BindFlags.VertexBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, System.Runtime.InteropServices.Marshal.SizeOf(points[0])); VertexBufferBinding = new VertexBufferBinding(VertexBuffer, System.Runtime.InteropServices.Marshal.SizeOf((points[0])), 0); } renderContext.devContext.InputAssembler.PrimitiveTopology = primitiveType; renderContext.BlendMode = BlendMode.Alpha; renderContext.setRasterizerState(TriangleCullMode.Off); SharpDX.Matrix mat = SharpDX.Matrix.Translation(-renderContext.ViewPort.Width / 2, -renderContext.ViewPort.Height / 2, 0) * SharpDX.Matrix.Scaling(1f, -1f, 1f) * SharpDX.Matrix.OrthoLH(renderContext.ViewPort.Width, renderContext.ViewPort.Height, 1, -1); mat.Transpose(); WarpOutputShader.MatWVP = mat; WarpOutputShader.Use(renderContext.devContext, texture != null); renderContext.SetVertexBuffer(VertexBufferBinding); DataBox box = renderContext.devContext.MapSubresource(VertexBuffer, 0, MapMode.WriteDiscard, MapFlags.None); Utilities.Write(box.DataPointer, points, 0, count); renderContext.devContext.UnmapSubresource(VertexBuffer, 0); if (texture != null) { renderContext.devContext.PixelShader.SetShaderResource(0, texture.ResourceView); } else { renderContext.devContext.PixelShader.SetShaderResource(0, null); } renderContext.devContext.Draw(count, 0); }
public abstract void Render(DeviceContext context, SharpDX.Direct3D.PrimitiveTopology type, int size, uint offset);
protected override void SetPipelineCore(Pipeline pipeline) { if (!pipeline.IsComputePipeline && _graphicsPipeline != pipeline) { D3D11Pipeline d3dPipeline = Util.AssertSubtype <Pipeline, D3D11Pipeline>(pipeline); _graphicsPipeline = d3dPipeline; Util.ClearArray(_graphicsResourceSets); // Invalidate resource set bindings -- they may be invalid. Util.ClearArray(_invalidatedGraphicsResourceSets); BlendState blendState = d3dPipeline.BlendState; if (_blendState != blendState) { _blendState = blendState; _context.OutputMerger.SetBlendState(blendState); } DepthStencilState depthStencilState = d3dPipeline.DepthStencilState; uint stencilReference = d3dPipeline.StencilReference; if (_depthStencilState != depthStencilState || _stencilReference != stencilReference) { _depthStencilState = depthStencilState; _stencilReference = stencilReference; _context.OutputMerger.SetDepthStencilState(depthStencilState, (int)stencilReference); } RasterizerState rasterizerState = d3dPipeline.RasterizerState; if (_rasterizerState != rasterizerState) { _rasterizerState = rasterizerState; _context.Rasterizer.State = rasterizerState; } SharpDX.Direct3D.PrimitiveTopology primitiveTopology = d3dPipeline.PrimitiveTopology; if (_primitiveTopology != primitiveTopology) { _primitiveTopology = primitiveTopology; _context.InputAssembler.PrimitiveTopology = primitiveTopology; } InputLayout inputLayout = d3dPipeline.InputLayout; if (_inputLayout != inputLayout) { _inputLayout = inputLayout; _context.InputAssembler.InputLayout = inputLayout; } VertexShader vertexShader = d3dPipeline.VertexShader; if (_vertexShader != vertexShader) { _vertexShader = vertexShader; _context.VertexShader.Set(vertexShader); } GeometryShader geometryShader = d3dPipeline.GeometryShader; if (_geometryShader != geometryShader) { _geometryShader = geometryShader; _context.GeometryShader.Set(geometryShader); } HullShader hullShader = d3dPipeline.HullShader; if (_hullShader != hullShader) { _hullShader = hullShader; _context.HullShader.Set(hullShader); } DomainShader domainShader = d3dPipeline.DomainShader; if (_domainShader != domainShader) { _domainShader = domainShader; _context.DomainShader.Set(domainShader); } PixelShader pixelShader = d3dPipeline.PixelShader; if (_pixelShader != pixelShader) { _pixelShader = pixelShader; _context.PixelShader.Set(pixelShader); } _vertexStrides = d3dPipeline.VertexStrides; if (_vertexStrides != null) { int vertexStridesCount = _vertexStrides.Length; Util.EnsureArrayMinimumSize(ref _vertexBindings, (uint)vertexStridesCount); Util.EnsureArrayMinimumSize(ref _vertexOffsets, (uint)vertexStridesCount); } Util.EnsureArrayMinimumSize(ref _graphicsResourceSets, (uint)d3dPipeline.ResourceLayouts.Length); Util.EnsureArrayMinimumSize(ref _invalidatedGraphicsResourceSets, (uint)d3dPipeline.ResourceLayouts.Length); } else if (pipeline.IsComputePipeline && _computePipeline != pipeline) { D3D11Pipeline d3dPipeline = Util.AssertSubtype <Pipeline, D3D11Pipeline>(pipeline); _computePipeline = d3dPipeline; Util.ClearArray(_computeResourceSets); // Invalidate resource set bindings -- they may be invalid. Util.ClearArray(_invalidatedComputeResourceSets); ComputeShader computeShader = d3dPipeline.ComputeShader; _context.ComputeShader.Set(computeShader); Util.EnsureArrayMinimumSize(ref _computeResourceSets, (uint)d3dPipeline.ResourceLayouts.Length); Util.EnsureArrayMinimumSize(ref _invalidatedComputeResourceSets, (uint)d3dPipeline.ResourceLayouts.Length); } }
public override void Render(DeviceContext context, SharpDX.Direct3D.PrimitiveTopology type, int size, uint offset) { base.Render(context, type, size, offset); }
public override void SetPipeline(Pipeline pipeline) { if (_pipeline != pipeline) { D3D11Pipeline d3dPipeline = Util.AssertSubtype <Pipeline, D3D11Pipeline>(pipeline); _pipeline = d3dPipeline; Util.ClearArray(_resourceSets); // Invalidate resource set bindings -- they may be invalid. BlendState blendState = d3dPipeline.BlendState; if (_blendState != blendState) { _blendState = blendState; _context.OutputMerger.SetBlendState(blendState); } DepthStencilState depthStencilState = d3dPipeline.DepthStencilState; if (_depthStencilState != depthStencilState) { _depthStencilState = depthStencilState; _context.OutputMerger.SetDepthStencilState(depthStencilState); } RasterizerState rasterizerState = d3dPipeline.RasterizerState; if (_rasterizerState != rasterizerState) { _rasterizerState = rasterizerState; _context.Rasterizer.State = rasterizerState; } SharpDX.Direct3D.PrimitiveTopology primitiveTopology = d3dPipeline.PrimitiveTopology; if (_primitiveTopology != primitiveTopology) { _primitiveTopology = primitiveTopology; _context.InputAssembler.PrimitiveTopology = primitiveTopology; } InputLayout inputLayout = d3dPipeline.InputLayout; if (_inputLayout != inputLayout) { _inputLayout = inputLayout; _context.InputAssembler.InputLayout = inputLayout; } VertexShader vertexShader = d3dPipeline.VertexShader; if (_vertexShader != vertexShader) { _vertexShader = vertexShader; _context.VertexShader.Set(vertexShader); } GeometryShader geometryShader = d3dPipeline.GeometryShader; if (_geometryShader != geometryShader) { _geometryShader = geometryShader; _context.GeometryShader.Set(geometryShader); } HullShader hullShader = d3dPipeline.HullShader; if (_hullShader != hullShader) { _hullShader = hullShader; _context.HullShader.Set(hullShader); } DomainShader domainShader = d3dPipeline.DomainShader; if (_domainShader != domainShader) { _domainShader = domainShader; _context.DomainShader.Set(domainShader); } PixelShader pixelShader = d3dPipeline.PixelShader; if (_pixelShader != pixelShader) { _pixelShader = pixelShader; _context.PixelShader.Set(pixelShader); } _vertexStrides = d3dPipeline.VertexStrides; int vertexStridesCount = _vertexStrides.Length; Util.EnsureArraySize(ref _vertexBindings, (uint)vertexStridesCount); Util.EnsureArraySize(ref _vertexOffsets, (uint)vertexStridesCount); Util.EnsureArraySize(ref _resourceSets, (uint)d3dPipeline.ResourceLayouts.Length); } }
public Mesh(SharpDX.Direct3D11.Device device, RenderGroup rg) { WorldVertex[] vertices = new WorldVertex[rg.VertexCount]; // Copy the vertex data into the render vertices for (int i = 0; i < vertices.Length; i++) { // Color if (rg.VertexBuffer.VertexComponents.HasFlag(VertexComponent.Color)) { vertices[i].Color = new Vector4(rg.VertexBuffer.VertexData[i * rg.VertexBuffer.VertexSize + rg.VertexBuffer.ColorOffset + 2] / 255.0f, rg.VertexBuffer.VertexData[i * rg.VertexBuffer.VertexSize + rg.VertexBuffer.ColorOffset + 1] / 255.0f, rg.VertexBuffer.VertexData[i * rg.VertexBuffer.VertexSize + rg.VertexBuffer.ColorOffset] / 255.0f, rg.VertexBuffer.VertexData[i * rg.VertexBuffer.VertexSize + rg.VertexBuffer.ColorOffset + 3] / 255.0f); } else { vertices[i].Color = Vector4.One; } // Normal if (rg.VertexBuffer.VertexComponents.HasFlag(VertexComponent.Normal)) { vertices[i].Normal = new Vector3(System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.NormalOffset), System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.NormalOffset + 4), System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.NormalOffset + 8)); } // Position if (rg.VertexBuffer.VertexComponents.HasFlag(VertexComponent.Normal)) { vertices[i].Position = new Vector3(System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.PositionOffset), System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.PositionOffset + 4), System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.PositionOffset + 8)); } // Texcoords if (rg.VertexBuffer.VertexComponents.HasFlag(VertexComponent.UV)) { vertices[i].UV0 = new Vector2(System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.UVOffset), System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.UVOffset + 4)); if (rg.VertexBuffer.UVCount > 1) { vertices[i].UV1 = new Vector2(System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.UVOffset + 8), System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.UVOffset + 12)); } if (rg.VertexBuffer.UVCount > 2) { vertices[i].UV2 = new Vector2(System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.UVOffset + 16), System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.UVOffset + 20)); } if (rg.VertexBuffer.UVCount > 3) { vertices[i].UV3 = new Vector2(System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.UVOffset + 24), System.BitConverter.ToSingle(rg.VertexBuffer.VertexData, i * (int)rg.VertexBuffer.VertexSize + (int)rg.VertexBuffer.UVOffset + 28)); } } } uint[] indices = new uint[rg.IndexBuffer.IndexCount]; for (int i = 0; i < indices.Length; i++) { indices[i] = System.BitConverter.ToUInt16(rg.IndexBuffer.IndexData, i * 2); } SharpDX.Direct3D.PrimitiveTopology topology = SharpDX.Direct3D.PrimitiveTopology.TriangleList; switch (rg.IndexBuffer.PrimitiveType) { case Drome.PrimitiveType.LineList: topology = SharpDX.Direct3D.PrimitiveTopology.LineList; break; case Drome.PrimitiveType.LineStrip: topology = SharpDX.Direct3D.PrimitiveTopology.LineStrip; break; case Drome.PrimitiveType.PointList: topology = SharpDX.Direct3D.PrimitiveTopology.PointList; break; case Drome.PrimitiveType.TriangleFan: throw new System.Exception(); case Drome.PrimitiveType.TriangleList: topology = SharpDX.Direct3D.PrimitiveTopology.TriangleList; break; case Drome.PrimitiveType.TriangleStrip: topology = SharpDX.Direct3D.PrimitiveTopology.TriangleStrip; break; } Create(device, vertices, indices, topology); }
protected void Draw(CB data, int indexCount, SharpDX.Direct3D.PrimitiveTopology pTopology, bool isBlend = false) { OnDraw?.Invoke(data, _indexBuffer, _constantBuffer, _vertexBinging, indexCount, pTopology, isBlend); }
public Mesh(SharpDX.Direct3D11.Device device, WorldVertex[] vertices, uint[] indices, SharpDX.Direct3D.PrimitiveTopology topology) { Create(device, vertices, indices, topology); }