Ich bastel grade fleißig an dem Shader-System meiner Engine und habe festgestellt: Ich brauche irgendeine Art von Markup-Sprache für die Shader (ähnlich Unitys Shaderlab).
Kurzinfo: OpenGL 4, .NET
Da meine Shader von der Engine dynamisch compiliert werden sollen je nach Anforderungen an den Shader (Deferred, Forward, Tiled Forward, ...), ich aber dem User immer noch Kontrolle über Custom-Shader geben möchte dachte ich mir folgendes:
Ein Shader besteht mindestens aus Vertex- und Fragment-Shader, Tesselation und Geometry ist ja optional. Ein Deferred-Renderer benötigt ja aber für Custom-Objekt-Shader mit Tesselation deren Vertex-Shader, Tesselation-Stage, aber nicht den Fragment-Shader.
Daher hat mein System die Möglichkeit, einen Shader zu selektieren. Die Selektion erfolgt nach Shader-Klasse (Der Name des Renderers) und einigen Override-Shadern (Obiges Beispiel: Fragment-Shader für Geometry-Stage).
Ich habe jetzt ein bisschen rumprobiert und bin zu dem Schluss gekommen, dass Lua eine schöne Möglichkeit für die Markup-Language wäre:
Code: Alles auswählen
-- We compile with GLSL Version 3.3
shader.version = "330"
-- Add a global shader source file that is accessible from all shaders:
shader.add
{
type = "global",
source =
[[
uniform mat4 matWorld;
uniform mat4 matView;
uniform mat4 matProjection;
uniform sampler2D meshDiffuseTexture;
]]
}
-- Add a vertex shader. The input variables and layout is specified by the input entry
shader.add
{
type = "vertex",
input = "mesh",
source =
[[
out vec2 uv;
void main()
{
vec4 pos = vec4(vertexPosition, 1);
gl_Position = matProjection * matView * matWorld * pos;
uv = vertexUV;
}
]]
}
-- Add a fragment shader. Simple alpha-testing shader.
shader.add
{
type = "fragment",
source =
[[
layout(location = 0) out vec4 color;
in vec2 uv;
void main()
{
color = texture(meshDiffuseTexture, uv);
if(color.a < 0.5f) discard;
}
]]
}
Was meint ihr? Kann man das so ohne Probleme nutzen oder stößt man dabei irgendwann auf unschöne Probleme?
Grüße
Felix