Shader für verschiedene Grafik APIs

  • C#
  • .NET (FX) 4.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets.

    Shader für verschiedene Grafik APIs

    Hallo,

    mein eigentliches Ziel ist es verschiedene Grafik APIs zu vereinheitlichen, nun bin ich an den Punkt an dem ich Shader support für den Endnutzer einbauen will. Dafür gibt es ja verschiedene Ansätze:
    • Abstrahierte Shader Sprache die sich zu HLSL und GLSL umwandeln lässt
    • Der Benutzer muss Shader für jede API schreiben
    • Automatische Umwandlung von GLSL <-> HLSL

    Von der ersten Methode sehe ich allerdings ab, da der Aufwand viel zu hoch ist, und ich wahrscheinlich trotzdem nicht an die Vielfallt des nativen Shadercodes heran komme. Die zweite Methode spricht eigentlich gegen mein Konzept da so Redundanz ensteht und der Benutzer den Code an die spezifischen APIs anpassen muss. Allerdings habe ich mir dazu ein kleines Konzept ausgedacht:

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    2. <Shaders>
    3. <Shader Name="testshader" Type="Sharpex2D.Rendering.DirectX.DirectXGraphicsManager">
    4. <Techniques>
    5. <Technique Name="Test">
    6. <!-- HLSL code -->
    7. </Technique>
    8. </Techniques>
    9. </Shader>
    10. <Shader Name="testshader" Type="Sharpex2D.Rendering.OpenGL.OpenGLGraphicsManager">
    11. <Techniques>
    12. <Technique Name="Test">
    13. <!-- GLSL code -->
    14. </Technique>
    15. </Techniques>
    16. </Shader>
    17. </Shaders>


    Die dritte Möglichkeit ist wohl die Fehleranfälligste, und ich kenne keine 3rd Party Lib die alle HLSL Versionen unterstützt.

    Habt ihr Ideen wie man das noch anders umsetzen könnte?
    Nur die bereits aufgezählten, oder du wartest auf Vulkan, was womöglich zu einer Möglichkeit führt GLSL sowie HLSL zum selben Bytecode zu kompilieren. Ob MS sich an den Bytecode halten wird und das selbst implementiert ist jedoch fraglich.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Wie wäre es hiermit? github.com/aras-p/hlsl2glslfork
    Dann könntest du den Nutzer den Schaden in HLSL schreiben lassen und dann automatisch eine GLSL-Version generieren. Zusätzlich könnte man dem Nutzer dann natürlich auch anbieten, beide selber zu schreiben.