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:
Code:
{$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:
Code:
/* 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.1 i386 Linux)
libShaderFile (v1.0.0.1 x86_64 Linux)
libShaderFile (v1.0.0.1 i386 Win32)
libShaderFile (v1.0.0.1 x86_64 Win64)
MfG Bergmann89.