Ejemplo n.º 1
0
 public FrameBuffer(EngineRenderer.RenderPass myRenderPass, uint width, uint height, uint layer = 1)
 {
     myAttachments                = new Dictionary <string, FrameBufferAttachment>();
     Initialized                  = false;
     myFramebufferInfo.Width      = width;
     myFramebufferInfo.RenderPass = myRenderPass;
     myFramebufferInfo.Height     = height;
     myFramebufferInfo.Layers     = layer;
     Initialize();
 }
Ejemplo n.º 2
0
        public GeometryPass(GeometryBuffer myBuffer, RenderPass OffscreenRenderPass, SecondaryCommandBufferPool mySecondaryCommandPool, ShaderManager myShaderManager) : base(mySecondaryCommandPool, "GeometryPass")
        {
            this.myShaderManager  = myShaderManager;
            myRenderpassBeginInfo = new RenderPassBeginInfo
            {
                ClearValueCount = 4,
                ClearValues     = new ClearValue[]
                {
                    new ClearValue {
                        Color = new ClearColorValue(Color.AliceBlue)
                    },                                                               //TODO: Always remember to match these!
                    new ClearValue {
                        Color = new ClearColorValue(Color.AliceBlue)
                    },                                                               //TODO: Always remember to match these!
                    new ClearValue {
                        Color = new ClearColorValue(Color.AliceBlue)
                    },                                                               //TODO: Always remember to match these!
                    new ClearValue {
                        DepthStencil = new ClearDepthStencilValue()
                        {
                            Depth = 1.0f, Stencil = 0
                        }
                    }
                },
                RenderPass = OffscreenRenderPass,
                RenderArea = new Rect2D {
                    Extent = new Extent2D {
                        Width = VulkanRenderer.Surface.SurfaceCapabilities.CurrentExtent.Width, Height = VulkanRenderer.Surface.SurfaceCapabilities.CurrentExtent.Height
                    }, Offset = new Offset2D {
                        X = 0, Y = 0
                    }
                },
            };
            myBackbuffer = myBuffer;
            myRenderpassBeginInfo.Framebuffer = myBackbuffer;
            String[] ShaderNames = { "GBufferPassVertex", "GBufferPassFragment" };
            Tuple <PipelineLayout, Pipeline> myPipelineDefault = myShaderManager.CreatePipeline(OffscreenRenderPass, ShaderNames, out ExpectedModelSet);

            myActivePipelines.Add("Default", myPipelineDefault);
            this.OffscreenRenderPass = OffscreenRenderPass;
        }
        internal Tuple <PipelineLayout, Pipeline> CreatePipeline(EngineRenderer.RenderPass aPass, string[] shaderNames, out Descriptor_Sets.ResourceSet myDeferredRendererDescriptorSet)
        {
            PipelineVertexInputStateCreateInfo   myState  = null;
            List <PipelineShaderStageCreateInfo> myStages = new List <PipelineShaderStageCreateInfo>();

            myDeferredRendererDescriptorSet = new Descriptor_Sets.ResourceSet();
            foreach (String A in shaderNames)
            {
                Shader Val = myShaders[A];
                myDeferredRendererDescriptorSet.MergeFrom(Val.Descriptor);
                myStages.Add(new PipelineShaderStageCreateInfo()
                {
                    Stage  = Val.ShaderStage,
                    Module = VulkanRenderer.SelectedLogicalDevice.CreateShaderModule(Val.ShaderBytecode),
                    Name   = Val.EntryName,
                });;
                if (Val.ShaderStage == ShaderStageFlags.Vertex)
                {
                    if (Val.VertexState != null)
                    {
                        myState = Val.VertexState.GetStateCreateInfo();
                    }
                    else
                    {
                        myState = new VertexBuilder().GetDefaultStateCreateInfo();
                    }
                }
            }
#if DEBUG
            if (!ValidateShaderStages(myStages))
            {
                throw new Exception("Shader stages either had duplicates or nothing at all!");
            }
#endif
            var myLayout = CreatePipelineLayout(myDeferredRendererDescriptorSet.GetDescriptorSetLayout());

            return(new Tuple <PipelineLayout, Pipeline>(myLayout, CreatePipelineFromData(aPass, myState, myLayout, myStages)));
        }
        private Pipeline CreatePipelineFromData(EngineRenderer.RenderPass aPass, PipelineVertexInputStateCreateInfo myState, PipelineLayout myLayout, List <PipelineShaderStageCreateInfo> myStages)
        {
            var scissor = new Rect2D {
                Extent = VulkanRenderer.Surface.SurfaceCapabilities.CurrentExtent
            };
            var viewportCreateInfo = new PipelineViewportStateCreateInfo
            {
                Viewports = new Viewport[] { VulkanRenderer.Viewport },
                Scissors  = new Rect2D[] { scissor }
            };

            var multisampleCreateInfo = new PipelineMultisampleStateCreateInfo
            {
                RasterizationSamples = SampleCountFlags.Count1
            };
            var colorBlendAttachmentState = new PipelineColorBlendAttachmentState
            {
                ColorWriteMask = ColorComponentFlags.R | ColorComponentFlags.G | ColorComponentFlags.B | ColorComponentFlags.A
            };

            var colorBlendStateCreatInfo = new PipelineColorBlendStateCreateInfo
            {
                LogicOp     = LogicOp.Copy,
                Attachments = new PipelineColorBlendAttachmentState[] { colorBlendAttachmentState }
            };

            var rasterizationStateCreateInfo = new PipelineRasterizationStateCreateInfo
            {
                PolygonMode = PolygonMode.Fill,
                CullMode    = CullModeFlags.None,
                FrontFace   = FrontFace.Clockwise, //Todo: flip?
                LineWidth   = 1.0f
            };

            var inputAssemblyStateCreateInfo = new PipelineInputAssemblyStateCreateInfo
            {
                Topology = PrimitiveTopology.TriangleList
            };


            var pipelineCreateInfo = new GraphicsPipelineCreateInfo
            {
                Layout             = myLayout,
                ViewportState      = viewportCreateInfo,
                Stages             = myStages.ToArray(),
                MultisampleState   = multisampleCreateInfo,
                ColorBlendState    = colorBlendStateCreatInfo,
                RasterizationState = rasterizationStateCreateInfo,
                InputAssemblyState = inputAssemblyStateCreateInfo,
                VertexInputState   = myState,// myBuilder.GetDefaultStateCreateInfo(),
                RenderPass         = aPass,
                DepthStencilState  = new PipelineDepthStencilStateCreateInfo()
                {
                }
            };


            Debug.Assert(pipelineCreateInfo.Stages[0].Module.m == myStages[0].Module.m);
            var Result = VulkanRenderer.SelectedLogicalDevice.CreateGraphicsPipelines(myPipelineCache, new GraphicsPipelineCreateInfo[] { pipelineCreateInfo });

            pipelineCreateInfo.Dispose();
            inputAssemblyStateCreateInfo.Dispose();
            rasterizationStateCreateInfo.Dispose();
            colorBlendStateCreatInfo.Dispose();
            Debug.Assert(Result.Length == 1);
            return(Result[0]);
        }
Ejemplo n.º 5
0
 internal void SetRenderPass(EngineRenderer.RenderPass renderPass)
 {
     myFramebufferInfo.RenderPass = renderPass;
     Initialize();
 }