/// <summary>
        /// Applies the material to the given render state.
        /// </summary>
        /// <param name="renderState">Current render state</param>
        /// <param name="instancingMode">The instancing mode for which to apply the material.</param>
        /// <param name="previousMaterial">The previously applied material.</param>
        /// <exception cref="SeeingSharpGraphicsException">Effect  + this.Effect +  not supported!</exception>
        internal override void Apply(RenderState renderState, MaterialApplyInstancingMode instancingMode, MaterialResource previousMaterial)
        {
            D3D11.DeviceContext deviceContext = renderState.Device.DeviceImmediateContextD3D11;
            bool isResourceSameType           =
                (previousMaterial != null) &&
                (previousMaterial.ResourceType == base.ResourceType);

            if (!isResourceSameType)
            {
                deviceContext.PixelShader.SetSampler(0, m_defaultResources.GetSamplerState(TextureSamplerQualityLevel.Low));
            }

            // Set texture resource (if set)
            if (m_textureResource != null)
            {
                deviceContext.PixelShader.SetShaderResource(0, m_textureResource.TextureView);
            }
            else
            {
                deviceContext.PixelShader.SetShaderResource(0, null);
            }

            // Set shader resources
            deviceContext.VertexShader.Set(m_vertexShader.VertexShader);
            deviceContext.PixelShader.Set(m_pixelShader.PixelShader);
        }
        /// <summary>
        /// Applies the material to the given render state.
        /// </summary>
        /// <param name="renderState">Current render state</param>
        /// <param name="instancingMode">The instancing mode for which to apply the material.</param>
        /// <param name="previousMaterial">The previously applied material.</param>
        internal override void Apply(RenderState renderState, MaterialApplyInstancingMode instancingMode, MaterialResource previousMaterial)
        {
            D3D11.DeviceContext deviceContext = renderState.Device.DeviceImmediateContextD3D11;
            bool isResourceSameType           =
                (previousMaterial != null) &&
                (previousMaterial.ResourceType == base.ResourceType);

            // Apply local shader configuration
            if (m_cbPerMaterialDataChanged)
            {
                m_cbPerMaterial.SetData(
                    deviceContext,
                    new CBPerMaterial()
                {
                    ClipFactor               = m_clipFactor,
                    MaxClipDistance          = m_maxClipDistance,
                    Texture0Factor           = m_textureResource != null ? 1f : 0f,
                    AdjustTextureCoordinates = m_adjustTextureCoordinates ? 1f : 0f,
                    AddToAlpha               = m_addToAlpha,
                    MaterialDiffuseColor     = m_materialDiffuseColor
                });
                m_cbPerMaterialDataChanged = false;
            }

            // Apply sampler and constants
            if (!isResourceSameType)
            {
                deviceContext.PixelShader.SetSampler(0, m_defaultResources.GetSamplerState(TextureSamplerQualityLevel.Low));
            }
            deviceContext.PixelShader.SetConstantBuffer(3, m_cbPerMaterial.ConstantBuffer);
            deviceContext.VertexShader.SetConstantBuffer(3, m_cbPerMaterial.ConstantBuffer);

            // Set texture resource (if set)
            if ((m_textureResource != null) &&
                (renderState.ViewInformation.ViewConfiguration.ShowTexturesInternal))
            {
                deviceContext.PixelShader.SetShaderResource(0, m_textureResource.TextureView);
            }
            else
            {
                deviceContext.PixelShader.SetShaderResource(0, null);
            }

            // Set shader resources
            if (!isResourceSameType)
            {
                deviceContext.VertexShader.Set(m_vertexShader.VertexShader);
                deviceContext.PixelShader.Set(m_pixelShader.PixelShader);
            }
        }