public static GraphicsPipelineDescription GenerateOmniShadowMappingPreEffectPipeline <T>( ModelRuntimeDescriptor <T> modelRuntimeState, SceneRuntimeDescriptor sceneRuntimeState, RasterizerStateDescription rasterizerState, uint preEffectFlag, Framebuffer framebuffer) where T : struct, VertexLocateable { //TODO: Build resource layout outside and pass as parameter var shaderArrayIndex = RenderFlags.GetPreEffectArrayIndexForFlag(preEffectFlag); var shaderArray = new Shader[] { modelRuntimeState.VertexPreEffectShaders[shaderArrayIndex], modelRuntimeState.GeometryPreEffectShaders[shaderArrayIndex], modelRuntimeState.FragmentPreEffectShaders[shaderArrayIndex] }; return(new GraphicsPipelineDescription() { BlendState = BlendStateDescription.SingleOverrideBlend, DepthStencilState = DepthStencilStateDescription.DepthOnlyLessEqual, RasterizerState = rasterizerState, PrimitiveTopology = modelRuntimeState.PrimitiveTopology, ResourceLayouts = new ResourceLayout[] { sceneRuntimeState.CameraResourceLayout, sceneRuntimeState.OmniLightProvViewResourceLayout, sceneRuntimeState.CameraInfoResourceLayout }, ShaderSet = new ShaderSetDescription( vertexLayouts: modelRuntimeState.VertexPreEffectsLayouts, shaders: shaderArray ), Outputs = framebuffer.OutputDescription }); }
public static GraphicsPipelineDescription GeneratePipelinePNTTB <T>( ModelRuntimeDescriptor <T> modelRuntimeState, SceneRuntimeDescriptor sceneRuntimeState, RasterizerStateDescription rasterizerState, Framebuffer framebuffer, ResourceLayout[] effectLayouts) where T : struct, VertexLocateable { var resourceLayout = new ResourceLayout[] { sceneRuntimeState.CameraResourceLayout, sceneRuntimeState.LightResourceLayout, sceneRuntimeState.SpotLightResourceLayout, sceneRuntimeState.MaterialResourceLayout, modelRuntimeState.TextureResourceLayout }; var completeResourceLayout = new ResourceLayout[resourceLayout.Length + effectLayouts.Length]; resourceLayout.CopyTo(completeResourceLayout, 0); effectLayouts.CopyTo(completeResourceLayout, resourceLayout.Length); return(new GraphicsPipelineDescription() { BlendState = BlendStateDescription.SingleOverrideBlend, DepthStencilState = DepthStencilStateDescription.DepthOnlyLessEqual, RasterizerState = rasterizerState, PrimitiveTopology = modelRuntimeState.PrimitiveTopology, ResourceLayouts = completeResourceLayout, ShaderSet = new ShaderSetDescription( vertexLayouts: modelRuntimeState.VertexLayouts, shaders: new Shader[] { modelRuntimeState.VertexShader, modelRuntimeState.FragmentShader } ), Outputs = framebuffer.OutputDescription }); }
//TODO: Add color space handling override public void CreateResources(SceneRuntimeDescriptor sceneRuntimeDescriptor, ModelRuntimeDescriptor <VertexPositionNormalTextureTangentBitangent>[] modelPNTTBDescriptorArray, ModelRuntimeDescriptor <VertexPositionNormal>[] modelPNDescriptorArray, ModelRuntimeDescriptor <VertexPositionTexture>[] modelPTDescriptorArray, ModelRuntimeDescriptor <VertexPositionColor>[] modelPCDescriptorArray) { //ResourceFactory factory = GraphicsDevice.ResourceFactory; _vertexBuffer = _factory.CreateBuffer(new BufferDescription(10000, BufferUsage.VertexBuffer | BufferUsage.Dynamic)); _vertexBuffer.Name = "ImGui.NET Vertex Buffer"; _indexBuffer = _factory.CreateBuffer(new BufferDescription(2000, BufferUsage.IndexBuffer | BufferUsage.Dynamic)); _indexBuffer.Name = "ImGui.NET Index Buffer"; _projMatrixBuffer = _factory.CreateBuffer(new BufferDescription(64, BufferUsage.UniformBuffer | BufferUsage.Dynamic)); _projMatrixBuffer.Name = "ImGui.NET Projection Buffer"; byte[] vertexShaderBytes = LoadEmbeddedShaderCode(GraphicsDevice.ResourceFactory, "imgui-vertex"); byte[] fragmentShaderBytes = LoadEmbeddedShaderCode(GraphicsDevice.ResourceFactory, "imgui-frag"); _vertexShader = _factory.CreateShader(new ShaderDescription(ShaderStages.Vertex, vertexShaderBytes, GraphicsDevice.BackendType == GraphicsBackend.Vulkan ? "main" : "VS")); _fragmentShader = _factory.CreateShader(new ShaderDescription(ShaderStages.Fragment, fragmentShaderBytes, GraphicsDevice.BackendType == GraphicsBackend.Vulkan ? "main" : "FS")); VertexLayoutDescription[] vertexLayouts = new VertexLayoutDescription[] { new VertexLayoutDescription( new VertexElementDescription("in_position", VertexElementSemantic.Position, VertexElementFormat.Float2), new VertexElementDescription("in_texCoord", VertexElementSemantic.TextureCoordinate, VertexElementFormat.Float2), new VertexElementDescription("in_color", VertexElementSemantic.Color, VertexElementFormat.Byte4_Norm)) }; _layout = _factory.CreateResourceLayout(new ResourceLayoutDescription( new ResourceLayoutElementDescription("ProjectionMatrixBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex), new ResourceLayoutElementDescription("MainSampler", ResourceKind.Sampler, ShaderStages.Fragment))); _textureLayout = _factory.CreateResourceLayout(new ResourceLayoutDescription( new ResourceLayoutElementDescription("MainTexture", ResourceKind.TextureReadOnly, ShaderStages.Fragment))); GraphicsPipelineDescription pd = new GraphicsPipelineDescription( BlendStateDescription.SingleAlphaBlend, new DepthStencilStateDescription(false, false, ComparisonKind.Always), new RasterizerStateDescription(FaceCullMode.None, PolygonFillMode.Solid, FrontFace.Clockwise, true, true), PrimitiveTopology.TriangleList, new ShaderSetDescription( vertexLayouts, new[] { _vertexShader, _fragmentShader }, new[] { new SpecializationConstant(0, GraphicsDevice.IsClipSpaceYInverted), new SpecializationConstant(1, true), }), new ResourceLayout[] { _layout, _textureLayout }, _frameBuffer.OutputDescription, ResourceBindingModel.Improved); _pipeline = _factory.CreateGraphicsPipeline(ref pd); _mainResourceSet = _factory.CreateResourceSet(new ResourceSetDescription(_layout, _projMatrixBuffer, GraphicsDevice.PointSampler)); RecreateFontDeviceTexture(GraphicsDevice); }
public override void CreateResources(SceneRuntimeDescriptor mainSceneRuntimeDescriptor, ModelRuntimeDescriptor <VertexPositionNormalTextureTangentBitangent>[] modelPNTTBDescriptorArray, ModelRuntimeDescriptor <VertexPositionNormal>[] modelPNDescriptorArray, ModelRuntimeDescriptor <VertexPositionTexture>[] modelPTDescriptorArray, ModelRuntimeDescriptor <VertexPositionColor>[] modelPCDescriptorArray) { _modelPNTTBDescriptorArray = modelPNTTBDescriptorArray; _modelPNDescriptorArray = modelPNDescriptorArray; _modelPTDescriptorArray = modelPTDescriptorArray; _modelPCDescriptorArray = modelPCDescriptorArray; _sceneRuntimeDescriptor.Light = mainSceneRuntimeDescriptor.Light; }