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(); }
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]); }
internal void SetRenderPass(EngineRenderer.RenderPass renderPass) { myFramebufferInfo.RenderPass = renderPass; Initialize(); }