ShaderFile (ein PreCompiler für OpenGL Shader Code)



  • Hey Leute,

    ich habe einen PreCompiler für OpenGL shader code entwickelt. Das Projekt nennt sich: "ShaderFile". Mit ShaderFile kann man große und komplexe Shader verwalten und trotzdem relativ kleinen und einfachen ShaderCode generieren. Der generierte Code wird dann mit einem normalen OpenGL Shader Objekt interpretiert, kompiliert und gelinkt.

    Hier eine kurze Übersicht über die wichtigsten Features:
    - wie von einem normalen PreCompiler bekannt gibt es If-Anweisungen mit denen man einen weiteren Pfad für die Code-Generierung einfügen kann
    - mit der Include-Anweisung kann man andere Datein einbinden und so seinen Code übersichtlich über mehere Datein verteilen
    - mit der Class-Anweisung kann man eine klassenähnliche Struktur definieren; innerhalb einer solchen Klasse kann man dann Methoden der Elternklasse überschreiben
    - mit Hilfe einer Property-Anweisung kann man Eigenschaften im ShaderCode definieren, mit denen man die Code-Generierung steuern kann. Die Werte der Eigenschaften werden dann im Anwendungs-Code gesetzt
    - und vieles mehr...

    Das Projekt ist komplett in FPC geschrieben und kann ohne Probleme in andere Projekte eingebunden werden. Außerdem gibt es ShaderFile als dynamische Bibliothek für Windows und Linux als 32bit und 64bit Kompilat. Die Bibliothek enthält Header-Datein für C, C++, FPC und Delphi.

    Einfaches Beispiel für eine Shader-Klasse:

    {$CLASS Color}
        {$PROPERTY UseColorMap 'false'}
    {$END}
    
    {$CLASS ColorFrag $EXTENDS Color}
    
        /* you can also define code here. It will be added when the code for the class is generated */
    
        {$FUNC 'vec4' GetColor $INLINE}
            {$IF UseColorMap}
                {$VAR 'vec2' '_texCoord' 'gl_TexCoord[0].st'}
                {$UNIFORM 'sampler2D' 'uColorMap'}
                return texture2D(uColorMap, _texCoord);
            {$ELSE}
                return gl_Color;
            {$END}
        {$END}
    
        {$MAIN}
            gl_FragColor = {$CALL GetColor};
        {$END}
    {$END}
    
    {$CLASS ColorVert $EXTENDS Color}
        {$MAIN}
            gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
            {$IF UseColorMap}
                gl_TexCoord[0] = gl_MultiTexCoord0;
            {$ELSE}
                gl_FrontColor = gl_Color;
                gl_BackColor  = gl_Color;
            {$END}
        {$END}
    {$END}
    

    Ergebnis für ColorFrag mit UseColorMap = true:

    /* you can also define code here. It will be added when the code for the class is generated */
    
    uniform sampler2D uColorMap;
    
    vec2 _texCoord = gl_TexCoord[0].st;
    
    void main(void)
    {
        gl_FragColor = (texture2D(uColorMap, _texCoord));
    }
    

    Links:
    Gitlab WebFrontend
    Lizenz
    Dokumentation (speichern unter)
    Zum Meinungs-Thread

    Downloads:
    git clone: gitlab@git.ccs-baumann.de:bitspace/ShaderFile.git
    Download lastest Source (as zip)
    libShaderFile (v1.0.0.4 i386 Linux)
    libShaderFile (v1.0.0.4 x86_64 Linux)
    libShaderFile (v1.0.0.4 i386 Win32)
    libShaderFile (v1.0.0.4 x86_64 Win64)

    MfG Bergmann89.



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum Projekte verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hey Leute,

    hab grad ein Update (v1.0.0.3) hochgeladen. Die neue Version enthält die Möglichkeit die Shader-Files über ein Callback bzw. ein Interface zu laden. Damit ist man nicht gezwungen den ShaderCode als Datei auf der Festplatte zu lagern, sondern könnte den Code auch aus einer Datenbank, Virtuellem Dateisystem oder ähnlichem laden.

    Diese Funktion war zwar im Code schon implementiert, aber noch nicht in der Bibliothek. Für diejenigen, die den Source direkt genutzt haben gibt es keine Änderungen.

    Download gibts wie immer im ersten Post.

    MfG Bergmann.



  • Hey Leute,

    hab grad ein Update (v1.0.0.4) mit ein paar kleinen BugFixes hochgeladen. Links wie immer im ersten Post. Über ein bischen mehr Feedback (auch negatives wenn euch was aufgefallen ist) würde ich mich freuen, oder nutzt das Ding einfach keiner?!

    MfG Bergmann.



  • ich nutze fuer sowas immer simple defines, einen kleinen #include parser dazu und alles ist abgedeckt. deswegen hab ich nicht so wirklich bedarf an deinem tool. kann dein tool etwas, was mit defines nicht ginge?

    das sollte dich nicht abhalten dran zu arbeiten, ich geb feedback damit du dich nicht ganz ignoriert vorkommst 😉



  • rapso schrieb:

    ich geb feedback damit du dich nicht ganz ignoriert vorkommst 😉

    Super, Danke 😃

    Wie schon gesagt kann das Tool den Shader-Code auch Klassen-orientiert verwalten und bringt damit Pseudo-Polymorphie mit ins Spiel. So kannst du Methoden um eine Funktionalität erweitern ohne den Code anfassen zu müssen. Wenn irgendwo noch Code rein muss, schreibst du dir einfach ne "virtuelle" Methode. Außerdem sollte es das ganze etwas übersichtlicher machen. Zugegeben durch den etwas abstrakten Syntax ist es fast noch schwieriger zu lesen, aber da hab ich auch schon ne Idee wie ich das besser umsetzen kann. Sofern es überhaupt jmd nutzen will...



  • ich glaube das sind keine wirklich vermissten features. ich hab verschiedene funktionen die schon polymorphism implementierne, indem ich sie in einzelne include dateien verteile. ist natuerlich nicht so elegant, aber macht was es soll.

    ich glaube dein tool haette eine chance, wenn es code fuer verschiedene platformen ausspucken wuerde. GLSL+HLSL+Metal und vielleicht sogar c++ (sowas zu schreiben war ich bisher zu faul, aber nett waere es z.b. fuer raytracer).

    ja, der syntax schaut ein wenig danach aus als wuerdest du dir das parsen einfacher machen wollen, was dann dem user ein wenig komisch vorkommt. wenn du ein wenig arbeit in den parser steckst, ist das sicherlich garnicht so schwierig. z.B. statt {$END} einfach nur } zu benutzen. am ende trackst du ja schon eine hierarchie, da musst du nur noch die interne hierarchy ignorieren.


Log in to reply