Пример #1
0
            public PipelineKey(
                FaceCullMode cullMode,
                bool depthWriteEnabled,
                ComparisonKind depthComparison,
                bool blendEnabled,
                BlendFactor sourceFactor,
                BlendFactor destinationColorFactor,
                BlendFactor destinationAlphaFactor)
            {
                CullMode               = cullMode;
                DepthWriteEnabled      = depthWriteEnabled;
                DepthComparison        = depthComparison;
                BlendEnabled           = blendEnabled;
                SourceFactor           = sourceFactor;
                DestinationColorFactor = destinationColorFactor;
                DestinationAlphaFactor = destinationAlphaFactor;

                _hashCode = HashCode.Combine(
                    CullMode,
                    DepthWriteEnabled,
                    DepthComparison,
                    BlendEnabled,
                    SourceFactor,
                    DestinationColorFactor,
                    DestinationAlphaFactor);
            }
Пример #2
0
        public Pipeline CreateAPipeline(ResourceLayout[] resourceLayouts,
                                        ShaderSetDescription shaderSetDescription,
                                        OutputDescription outputDescription,
                                        BlendStateDescription blendStateDescription,
                                        bool depthTest,
                                        FaceCullMode faceCullMode       = FaceCullMode.None,
                                        PolygonFillMode polygonFillMode = PolygonFillMode.Solid,
                                        FrontFace frontFaceWindingOrder = FrontFace.Clockwise)
        {
            var pipelineDescription = new GraphicsPipelineDescription()
            {
                BlendState        = blendStateDescription,
                DepthStencilState = new DepthStencilStateDescription(
                    depthTestEnabled: depthTest,
                    depthWriteEnabled: depthTest,
                    comparisonKind: ComparisonKind.LessEqual),
                RasterizerState = new RasterizerStateDescription(
                    cullMode: faceCullMode,
                    fillMode: polygonFillMode,
                    frontFace: frontFaceWindingOrder,
                    depthClipEnabled: depthTest,
                    scissorTestEnabled: false
                    ),
                PrimitiveTopology = PrimitiveTopology.TriangleList,
                ResourceLayouts   = resourceLayouts,
                ShaderSet         = shaderSetDescription,
                Outputs           = outputDescription
            };

            return(_components.Factory.CreateGraphicsPipeline(pipelineDescription));
        }
Пример #3
0
 /// <summary>
 /// Constructs a new RasterizerStateDescription.
 /// </summary>
 /// <param name="cullMode">Controls which face will be culled.</param>
 /// <param name="fillMode">Controls how the rasterizer fills polygons.</param>
 /// <param name="frontFace">Controls the winding order used to determine the front face of primitives.</param>
 /// <param name="depthClipEnabled">Controls whether depth clipping is enabled.</param>
 /// <param name="scissorTestEnabled">Controls whether the scissor test is enabled.</param>
 public RasterizerStateDescription(
     FaceCullMode cullMode,
     PolygonFillMode fillMode,
     FrontFace frontFace,
     bool depthClipEnabled,
     bool scissorTestEnabled)
 {
     CullMode           = cullMode;
     FillMode           = fillMode;
     FrontFace          = frontFace;
     DepthClipEnabled   = depthClipEnabled;
     ScissorTestEnabled = scissorTestEnabled;
 }
Пример #4
0
        public Pipeline GetCachedPipeline(
            FaceCullMode cullMode,
            bool depthWriteEnabled,
            ComparisonKind depthComparison,
            bool blendEnabled,
            BlendFactor sourceFactor,
            BlendFactor destinationColorFactor,
            BlendFactor destinationAlphaFactor)
        {
            var key = new PipelineKey(
                cullMode,
                depthWriteEnabled,
                depthComparison,
                blendEnabled,
                sourceFactor,
                destinationColorFactor,
                destinationAlphaFactor);

            if (!_pipelines.TryGetValue(key, out var result))
            {
                var blendState = new BlendStateDescription(
                    RgbaFloat.White,
                    new BlendAttachmentDescription(
                        blendEnabled,
                        sourceFactor,
                        destinationColorFactor,
                        BlendFunction.Add,
                        sourceFactor,
                        destinationAlphaFactor,
                        BlendFunction.Add));

                var depthState = DepthStencilStateDescription.DepthOnlyLessEqual;
                depthState.DepthWriteEnabled = depthWriteEnabled;
                depthState.DepthComparison   = depthComparison;

                var rasterizerState = RasterizerStateDescriptionUtility.DefaultFrontIsCounterClockwise;
                rasterizerState.CullMode = cullMode;

                _pipelines.Add(key, result = AddDisposable(GraphicsDevice.ResourceFactory.CreateGraphicsPipeline(
                                                               new GraphicsPipelineDescription(
                                                                   blendState,
                                                                   depthState,
                                                                   rasterizerState,
                                                                   PrimitiveTopology.TriangleList,
                                                                   ShaderSet.Description,
                                                                   _resourceLayouts,
                                                                   RenderPipeline.GameOutputDescription))));
            }

            return(result);
        }
Пример #5
0
        internal static CullFaceMode VdToGLCullFaceMode(FaceCullMode cullMode)
        {
            switch (cullMode)
            {
            case FaceCullMode.Back:
                return(CullFaceMode.Back);

            case FaceCullMode.Front:
                return(CullFaceMode.Front);

            default:
                throw Illegal.Value <FaceCullMode>();
            }
        }
Пример #6
0
 internal static VkCullModeFlags VdToVkCullMode(FaceCullMode cullMode)
 {
     switch (cullMode)
     {
         case FaceCullMode.Back:
             return VkCullModeFlags.Back;
         case FaceCullMode.Front:
             return VkCullModeFlags.Front;
         case FaceCullMode.None:
             return VkCullModeFlags.None;
         default:
             throw Illegal.Value<FaceCullMode>();
     }
 }
Пример #7
0
        internal static CullMode ToD3D11CullMode(FaceCullMode cullingMode)
        {
            switch (cullingMode)
            {
            case FaceCullMode.Back:
                return(CullMode.Back);

            case FaceCullMode.Front:
                return(CullMode.Front);

            case FaceCullMode.None:
                return(CullMode.None);

            default:
                throw Illegal.Value <FaceCullMode>();
            }
        }
Пример #8
0
 internal void SetCullMode(FaceCullMode cullMode)
 {
     if (cullMode == FaceCullMode.Disable && faceCullEnable)
     {
         if (faceCullEnable)
         {
             faceCullEnable = false;
             GL.Disable(EnableCap.CullFace);
         }
     }
     else if (cullMode == FaceCullMode.Back)
     {
         if (faceCullFront)
         {
             GL.CullFace(CullFaceMode.Back);
             faceCullFront = false;
         }
         if (!faceCullEnable)
         {
             GL.Enable(EnableCap.CullFace);
             faceCullEnable = true;
         }
     }
     else if (cullMode == FaceCullMode.Front)
     {
         if (!faceCullFront)
         {
             GL.CullFace(CullFaceMode.Front);
             faceCullFront = true;
         }
         if (!faceCullEnable)
         {
             GL.Enable(EnableCap.CullFace);
             faceCullEnable = true;
         }
     }
 }
Пример #9
0
 static EtmPipeline BuildPipeline(string name, FaceCullMode cullMode, IFramebufferHolder framebuffer)
 => new()
Пример #10
0
 public IPipelineBuilder With(FaceCullMode faceCullMode)
 {
     rasterizer.CullMode = faceCullMode;
     return(this);
 }