Pipeline states

  • rasterizer state
  • depth and stencil state
  • blend state
  • effects
  • input layout
  • output descriptionState is compiled into immutable objects, which describe the whole pipeline. They are then bound using a CommandList.

Code: Create state objects

The class let you set states independently, while caching the underlying pipeline states.

Code: Mutable pipeline state

  1. var mutablePipelineState = new MutablePipelineState();
  2. // Setting values and rebuilding
  3. mutablePipelineState.State.BlendState = BlendStates.AlphaBlend
  4. mutablePipelineState.Update
  5. CommandList.SetPipelineState(mutablePipelineState.CurrentState);

Rasterizer state

The rasterizer can be set using the RasterizerState property. A set of predefined descriptions is held by the class. They deal with the cull mode, and should be enough for most use cases:

  • CullNone: no culling
  • : front-face culling
  • CullBack: back-face cullingCode: Set the cull mode
  1. pipelineStateDescription.RasterizerState = RasterizerStates.CullNone;
  2. pipelineStateDescription.RasterizerState = RasterizerStates.CullFront;
  3. pipelineStateDescription.RasterizerState = RasterizerStates.CullBack;

You can create your own custom state. For the list of options and default values, see the API documentation.

Code: Custom rasterizer states

  1. rasterizerStateDescription.ScissorTestEnable = true; // enables the scissor test
  2. pipelineStateDescription.RasterizerState = rasterizerStateDescription;

Depth and stencil states

The DepthStencilState property contains the depth and stencil states. A set of commonly used states is defined by the class:

  • Default: depth read and write with a less-than comparison
  • : read and write with a greater-or-equals comparison
  • DepthRead: read only with a less-than comparison
  • : neither read nor writeCode: Setting the depth state

You can also set custom depth and stencil states. For the list of options and default values, see the DepthStencilStateDescription API documentation.

  1. // depth test is enabled but it doesn't write
  2. var depthStencilStateDescription = new DepthStencilStateDescription(true, false);
  3. pipelineStateDescription.DepthStencilState = depthStencilStateDescription;

The stencil reference isn't part of the . It's set using SetStencilReference(Int32).

Code: Set the stencil reference

  1. CommandList.SetStencilReference(2);

Blend state

The and SampleMask properties control blending. The class defines a set of commonly used blend states:

  • Additive: sums the colors
  • : sums using the alpha of the source on both colors
  • Opaque: replaces the colorCode: Set the blend state
  1. // Set common blend states
  2. pipelineStateDescription.BlendState = BlendStates.Additive;
  3. pipelineStateDescription.BlendState = BlendStates.AlphaBlend;
  4. pipelineStateDescription.BlendState = BlendStates.NonPremultiplied;
  5. pipelineStateDescription.BlendState = BlendStates.Opaque;
  6. // Set the sample mask
  7. pipelineStateDescription.SampleMask = 0xFFFFFFFF;

You can set custom depth and blend states. For a list of options and default values, see the API documentation.

Code: Custom blend state

The blend factor isn't part of the PipelineState. It's set using .

Code: Set the blend factor

  1. CommandList.SetBlendFactor(Color4.White);

The pipeline state also includes the shaders you want to use for drawing.To bind an Effect to the pipeline, set the and RootSignature properties of the to the matching values of the effect.

The RootSignature describes the number and kind of resources expected by the effect. The next chapter covers how to to the pipeline.

Code: Bind an effect

  1. var effectInstance = new EffectInstance(EffectSystem.LoadEffect("MyEffect").WaitForResult());
  2. pipelineStateDescription.EffectBytecode = effectInstance.Effect.Bytecode;
  3. pipelineStateDescription.RootSignature = effectInstance.RootSignature;

The pipeline state describes the layout in which vertices are sent to the device through the InputElements and properties.

The Draw vertices page describes how to create custom vertex buffers and their in more detail.

Code: Set an input layout

  1. VertexDeclaration vertexDeclaration = ...
  2. pipelineStateDescription.InputElements = vertexDeclaration.CreateInputElements();
  3. pipelineStateDescription.PrimitiveType = PrimitiveType.TriangleStrip;

The Output property of the defines the number and PixelFormat of all bound render textures.

For information on how to bind render textures to the pipeline, see .

Code: Create an output description

Code: Capture output description

  1. mutablePipelineState.State.Output.CaptureState(CommandList);
  2. mutablePipelineState.Update();