/// <summary> /// Constructs a new ImGuiRenderer. /// </summary> /// <param name="gd">The GraphicsDevice used to create and update resources.</param> /// <param name="outputDescription">The output format.</param> /// <param name="width">The initial width of the rendering target. Can be resized.</param> /// <param name="height">The initial height of the rendering target. Can be resized.</param> /// <param name="colorSpaceHandling">Identifies how the renderer should treat vertex colors.</param> public ImGuiRenderer(GraphicsDevice gd, OutputDescription outputDescription, int width, int height, ColorSpaceHandling colorSpaceHandling) { _gd = gd; _assembly = typeof(ImGuiRenderer).GetTypeInfo().Assembly; _colorSpaceHandling = colorSpaceHandling; _windowWidth = width; _windowHeight = height; _fontTexture = Renderer.GlobalTexturePool.AllocateTextureDescriptor(); IntPtr context = ImGui.CreateContext(); ImGui.SetCurrentContext(context); var io = ImGui.GetIO(); io.ConfigFlags |= ImGuiConfigFlags.DockingEnable; ImGui.GetIO().Fonts.AddFontDefault(); CreateDeviceResources(gd, outputDescription); SetOpenTKKeyMappings(); SetPerFrameImGuiData(1f / 60f); }
public void CreateDeviceResources(GraphicsDevice gd, OutputDescription outputDescription, ColorSpaceHandling colorSpaceHandling) { _gd = gd; _colorSpaceHandling = colorSpaceHandling; ResourceFactory factory = gd.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"; RecreateFontDeviceTexture(gd); _projMatrixBuffer = factory.CreateBuffer(new BufferDescription(64, BufferUsage.UniformBuffer | BufferUsage.Dynamic)); _projMatrixBuffer.Name = "ImGui.NET Projection Buffer"; byte[] vertexShaderBytes = LoadEmbeddedShaderCode(gd.ResourceFactory, "imgui-vertex", ShaderStages.Vertex, _colorSpaceHandling); byte[] fragmentShaderBytes = LoadEmbeddedShaderCode(gd.ResourceFactory, "imgui-frag", ShaderStages.Fragment, _colorSpaceHandling); _vertexShader = factory.CreateShader(new ShaderDescription(ShaderStages.Vertex, vertexShaderBytes, "VS")); _fragmentShader = factory.CreateShader(new ShaderDescription(ShaderStages.Fragment, fragmentShaderBytes, "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, gd.IsClipSpaceYInverted), new SpecializationConstant(1, _colorSpaceHandling == ColorSpaceHandling.Legacy), }), new ResourceLayout[] { _layout, _textureLayout }, outputDescription, ResourceBindingModel.Default); _pipeline = factory.CreateGraphicsPipeline(ref pd); _mainResourceSet = factory.CreateResourceSet(new ResourceSetDescription(_layout, _projMatrixBuffer, gd.PointSampler)); _fontTextureResourceSet = factory.CreateResourceSet(new ResourceSetDescription(_textureLayout, _fontTextureView)); }
/// <summary> /// Constructs a new ImGuiRenderer. /// </summary> /// <param name="gd">The GraphicsDevice used to create and update resources.</param> /// <param name="outputDescription">The output format.</param> /// <param name="width">The initial width of the rendering target. Can be resized.</param> /// <param name="height">The initial height of the rendering target. Can be resized.</param> /// <param name="colorSpaceHandling">Identifies how the renderer should treat vertex colors.</param> public ImGuiRenderer(GraphicsDevice gd, OutputDescription outputDescription, int width, int height, ColorSpaceHandling colorSpaceHandling) { _gd = gd; _assembly = typeof(ImGuiRenderer).GetTypeInfo().Assembly; _colorSpaceHandling = colorSpaceHandling; _windowWidth = width; _windowHeight = height; ResetContext(gd, outputDescription); }
private byte[] LoadEmbeddedShaderCode( ResourceFactory factory, string name, ShaderStages stage, ColorSpaceHandling colorSpaceHandling) { switch (factory.BackendType) { case GraphicsBackend.Direct3D11: { if (stage == ShaderStages.Vertex && colorSpaceHandling == ColorSpaceHandling.Legacy) { name += "-legacy"; } string resourceName = name + ".hlsl.bytes"; return(GetEmbeddedResourceBytes(resourceName)); } case GraphicsBackend.OpenGL: { if (stage == ShaderStages.Vertex && colorSpaceHandling == ColorSpaceHandling.Legacy) { name += "-legacy"; } string resourceName = name + ".glsl"; return(GetEmbeddedResourceBytes(resourceName)); } case GraphicsBackend.OpenGLES: { if (stage == ShaderStages.Vertex && colorSpaceHandling == ColorSpaceHandling.Legacy) { name += "-legacy"; } string resourceName = name + ".glsles"; return(GetEmbeddedResourceBytes(resourceName)); } case GraphicsBackend.Vulkan: { string resourceName = name + ".spv"; return(GetEmbeddedResourceBytes(resourceName)); } case GraphicsBackend.Metal: { string resourceName = name + ".metallib"; return(GetEmbeddedResourceBytes(resourceName)); } default: throw new NotImplementedException(); } }
/// <summary> /// Constructs a new ImGuiRenderer. /// </summary> /// <param name="gd">The GraphicsDevice used to create and update resources.</param> /// <param name="outputDescription">The output format.</param> /// <param name="width">The initial width of the rendering target. Can be resized.</param> /// <param name="height">The initial height of the rendering target. Can be resized.</param> /// <param name="colorSpaceHandling">Identifies how the renderer should treat vertex colors.</param> public ImGuiRenderer(GraphicsDevice gd, OutputDescription outputDescription, int width, int height, ColorSpaceHandling colorSpaceHandling) { _gd = gd; _assembly = typeof(ImGuiRenderer).GetTypeInfo().Assembly; _colorSpaceHandling = colorSpaceHandling; _windowWidth = width; _windowHeight = height; IntPtr context = ImGui.CreateContext(); ImGui.SetCurrentContext(context); ImGui.GetIO().Fonts.AddFontDefault(); CreateDeviceResources(gd, outputDescription); SetOpenTKKeyMappings(); SetPerFrameImGuiData(1f / 60f); ImGui.NewFrame(); _frameBegun = true; }