{"id":13663945,"url":"https://github.com/mellinoe/ShaderGen","last_synced_at":"2025-04-25T20:31:48.126Z","repository":{"id":41579896,"uuid":"102559301","full_name":"mellinoe/ShaderGen","owner":"mellinoe","description":"Proof-of-concept library for generating HLSL, GLSL, and Metal shader code from C#,","archived":false,"fork":false,"pushed_at":"2020-08-11T06:00:55.000Z","size":859,"stargazers_count":508,"open_issues_count":38,"forks_count":56,"subscribers_count":33,"default_branch":"master","last_synced_at":"2025-04-05T11:11:12.274Z","etag":null,"topics":["direct3d","games","glsl","graphics","hlsl","opengl","shaders","vulkan"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mellinoe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-09-06T03:40:54.000Z","updated_at":"2025-04-02T18:45:14.000Z","dependencies_parsed_at":"2022-07-15T00:45:58.456Z","dependency_job_id":null,"html_url":"https://github.com/mellinoe/ShaderGen","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mellinoe%2FShaderGen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mellinoe%2FShaderGen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mellinoe%2FShaderGen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mellinoe%2FShaderGen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mellinoe","download_url":"https://codeload.github.com/mellinoe/ShaderGen/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250890563,"owners_count":21503516,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["direct3d","games","glsl","graphics","hlsl","opengl","shaders","vulkan"],"created_at":"2024-08-02T05:02:41.669Z","updated_at":"2025-04-25T20:31:47.486Z","avatar_url":"https://github.com/mellinoe.png","language":"C#","funding_links":[],"categories":["C\\#","C#"],"sub_categories":[],"readme":"# ShaderGen\n\n[![Gitter Chat](https://badges.gitter.im/ShaderGen/Lobby.svg)](https://gitter.im/ShaderGen/Lobby?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\nA proof-of-concept library which generates shader code from C#. Currently, the project can generate HLSL (D3D11), GLSL-330 (core-GL-compatible), GLSLES-300 (OpenGL ES-compatible), GLSL-450 (Vulkan-compatible), and Metal shader code from a single shader source specified in C#.\n\n## Shaders in C#\n\nWriting shader code in C# could have quite a few benefits:\n\n* Easily share type definitions between graphics code in C# and shaders.\n  * For example, one could re-use the same structure to describe the input to a vertex shader, as well as to store the actual vertex data in your C# program.\n  * Shader uniforms (\"constant buffers\") can be shared as well.\n* Analysis done at code-generation time can be used to build extra metadata about the shaders, enabling reflection-like capabilities.\n  * The full vertex input specification can be generated when doing the C# analysis for code generation.\n  * The layouts and order for all global shader resources can be captured.\n  * Validation can be performed to ensure, for example, uniforms are multiples of 16-bytes in size, etc.\n* C# refactoring tools can be used.\n* C# niceties like inheritance, composition, partial declarations, etc. can be leveraged for easier shader writing (speculative).\n\n## Example Shader\n\nHere is an example vertex and fragment shader, written in C# with ShaderGen:\n\n```C#\npublic class MinExample\n{\n    public Matrix4x4 Projection;\n    public Matrix4x4 View;\n    public Matrix4x4 World;\n    public Texture2DResource SurfaceTexture;\n    public SamplerResource Sampler;\n\n    public struct VertexInput\n    {\n        [PositionSemantic] public Vector3 Position;\n        [TextureCoordinateSemantic] public Vector2 TextureCoord;\n    }\n\n    public struct FragmentInput\n    {\n        [SystemPositionSemanticAttribute] public Vector4 Position;\n        [TextureCoordinateSemantic] public Vector2 TextureCoord;\n    }\n\n    [VertexShader]\n    public FragmentInput VertexShaderFunc(VertexInput input)\n    {\n        FragmentInput output;\n        Vector4 worldPosition = Mul(World, new Vector4(input.Position, 1));\n        Vector4 viewPosition = Mul(View, worldPosition);\n        output.Position = Mul(Projection, viewPosition);\n        output.TextureCoord = input.TextureCoord;\n        return output;\n    }\n\n    [FragmentShader]\n    public Vector4 FragmentShaderFunc(FragmentInput input)\n    {\n        return Sample(SurfaceTexture, Sampler, input.TextureCoord);\n    }\n}\n```\n\nHere is some representative output from the library (subject to change, etc.):\n\nHLSL Vertex Shader\n```HLSL\nstruct MinExample_VertexInput\n{\n    float3 Position : POSITION0;\n    float2 TextureCoord : TEXCOORD0;\n};\n\nstruct MinExample_FragmentInput\n{\n    float4 Position : SV_Position;\n    float2 TextureCoord : TEXCOORD0;\n};\n\ncbuffer ProjectionBuffer : register(b0)\n{\n    float4x4 Projection;\n}\n\ncbuffer ViewBuffer : register(b1)\n{\n    float4x4 View;\n}\n\ncbuffer WorldBuffer : register(b2)\n{\n    float4x4 World;\n}\n\nMinExample_FragmentInput VertexShaderFunc( MinExample_VertexInput input)\n{\n    MinExample_FragmentInput output;\n    float4 worldPosition = mul(World, float4(input.Position, 1));\n    float4 viewPosition = mul(View, worldPosition);\n    output.Position = mul(Projection, viewPosition);\n    output.TextureCoord = input.TextureCoord;\n    return output;\n}\n```\n\nHLSL Fragment Shader\n```HLSL\nstruct MinExample_VertexInput\n{\n    float3 Position : POSITION0;\n    float2 TextureCoord : TEXCOORD0;\n};\n\nstruct MinExample_FragmentInput\n{\n    float4 Position : SV_Position;\n    float2 TextureCoord : TEXCOORD0;\n};\n\nTexture2D SurfaceTexture : register(t0);\n\nSamplerState Sampler : register(s0);\n\nfloat4 FragmentShaderFunc( MinExample_FragmentInput input) : SV_Target\n{\n    return SurfaceTexture.Sample(Sampler, input.TextureCoord);\n}\n```\n\nGLSL (450) Vertex Shader\n```GLSL\n#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\nstruct MinExample_VertexInput\n{\n    vec3 Position;\n    vec2 TextureCoord;\n};\n\nstruct MinExample_FragmentInput\n{\n    vec4 Position;\n    vec2 TextureCoord;\n};\n\nlayout(set = 0, binding = 0) uniform Projection\n{\n    mat4 field_Projection;\n};\n\nlayout(set = 0, binding = 1) uniform View\n{\n    mat4 field_View;\n};\n\nlayout(set = 0, binding = 2) uniform World\n{\n    mat4 field_World;\n};\n\nlayout(set = 0, binding = 3) uniform texture2D SurfaceTexture;\nlayout(set = 0, binding = 4) uniform sampler Sampler;\nMinExample_FragmentInput VertexShaderFunc( MinExample_VertexInput input_)\n{\n    MinExample_FragmentInput output_;\n    vec4 worldPosition = field_World * vec4(input_.Position, 1);\n    vec4 viewPosition = field_View * worldPosition;\n    output_.Position = field_Projection * viewPosition;\n    output_.TextureCoord = input_.TextureCoord;\n    return output_;\n}\n\n\nlayout(location = 0) in vec3 Position;\nlayout(location = 1) in vec2 TextureCoord;\nlayout(location = 0) out vec2 fsin_0;\n\nvoid main()\n{\n    MinExample_VertexInput input_;\n    input_.Position = Position;\n    input_.TextureCoord = TextureCoord;\n    MinExample_FragmentInput output_ = VertexShaderFunc(input_);\n    fsin_0 = output_.TextureCoord;\n    gl_Position = output_.Position;\n        gl_Position.y = -gl_Position.y; // Correct for Vulkan clip coordinates\n}\n```\n\nGLSL (450) Fragment Shader\n```GLSL\n#version 450\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\nstruct MinExample_VertexInput\n{\n    vec3 Position;\n    vec2 TextureCoord;\n};\n\nstruct MinExample_FragmentInput\n{\n    vec4 Position;\n    vec2 TextureCoord;\n};\n\nlayout(set = 0, binding = 0) uniform Projection\n{\n    mat4 field_Projection;\n};\n\nlayout(set = 0, binding = 1) uniform View\n{\n    mat4 field_View;\n};\n\nlayout(set = 0, binding = 2) uniform World\n{\n    mat4 field_World;\n};\n\nlayout(set = 0, binding = 3) uniform texture2D SurfaceTexture;\nlayout(set = 0, binding = 4) uniform sampler Sampler;\nvec4 FragmentShaderFunc( MinExample_FragmentInput input_)\n{\n    return texture(sampler2D(SurfaceTexture, Sampler), input_.TextureCoord);\n}\n\n\nlayout(location = 0) in vec2 fsin_0;\nlayout(location = 0) out vec4 _outputColor_;\n\nvoid main()\n{\n    MinExample_FragmentInput input_;\n    input_.Position = gl_FragCoord;\n    input_.TextureCoord = fsin_0;\n    vec4 output_ = FragmentShaderFunc(input_);\n    _outputColor_ = output_;\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmellinoe%2FShaderGen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmellinoe%2FShaderGen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmellinoe%2FShaderGen/lists"}