LightingShader =
' struct materialParams {' + LineEnding +
' vec4 emission;' + LineEnding +
' vec4 ambient;' + LineEnding +
' vec4 diffuse;' + LineEnding +
' vec4 specular;' + LineEnding +
' float shininess; // Glanz' + LineEnding +
' };' + LineEnding +
' struct Lighting {' + LineEnding +
' vec4 position;' + LineEnding +
' vec4 ambient; // Umgebungslicht' + LineEnding +
' vec4 diffuse; // Lichtfarbe' + LineEnding +
' vec4 specular; // Spiegelnd' + LineEnding +
' };' + LineEnding +
' uniform materialParams m2aterial;' + LineEnding + // ?????
' uniform Lighting LightSource;' + LineEnding +
' vec4 Light(in vec3 Normal, in vec3 Position)' + LineEnding +
' {' + LineEnding +
' vec3 N = normalize(Normal);' + LineEnding +
' vec4 emissiv = m2aterial.emission;' + LineEnding +
' vec4 ambient = m2aterial.ambient * LightSource.ambient;' + LineEnding +
' vec3 L = vec3(0.0);' + LineEnding +
' vec3 H = vec3(0.0);' + LineEnding +
' L = normalize(vec3(LightSource.position) - Position);' + LineEnding +
' vec4 Pos_eye = vec4(0.0, 0.0, 1.0, 0.0);' + LineEnding +
' vec3 A = Pos_eye.xyz;' + LineEnding +
' H = normalize(L + A);' + LineEnding +
' vec4 diffuse = vec4(0.0, 0.0, 0.0, 1.0);' + LineEnding +
' vec4 specular = vec4(0.0, 0.0, 0.0, 1.0);' + LineEnding +
' float diffuseLight = max(dot(N, L), 0.0);' + LineEnding +
' if (diffuseLight > 0.0) {' + LineEnding +
' diffuse = diffuseLight * m2aterial.diffuse * LightSource.diffuse;' + LineEnding +
' float specLight = pow(max(dot(H, N), 0.0), m2aterial.shininess);' + LineEnding +
' specular = specLight * m2aterial.specular * LightSource.specular;' + LineEnding +
' }' + LineEnding +
' return emissiv + ambient + diffuse + specular;' + LineEnding +
' }';
var
i: integer;
begin
Lighting.Enabled := lightON;
for i := 0 to Length(AShader) - 1 do begin
if Lighting.Enabled then begin
AShader[i] := StringReplace(AShader[i], '$light.glsl', LightingShader, [rfReplaceAll, rfIgnoreCase]) + #0;
end else begin
AShader[i] := StringReplace(AShader[i], '$light.glsl', noLightingShader, [rfReplaceAll, rfIgnoreCase]) + #0;
end;
end;
inherited Create(AShader);
if Lighting.Enabled then begin
with Lighting.UniformID do begin
with Light do begin
position := UniformLocation('LightSource.position');
ambient := UniformLocation('LightSource.ambient');
diffuse := UniformLocation('LightSource.diffuse');
specular := UniformLocation('LightSource.specular');
end;
with Material do begin
emission := UniformLocation('m2aterial.emission');
ambient := UniformLocation('m2aterial.ambient');
diffuse := UniformLocation('m2aterial.diffuse');
specular := UniformLocation('m2aterial.specular');
shininess := UniformLocation('m2aterial.shininess');
end;
end;