- constructor TKar_GLSlangShader.Create(FragmentShader, VertexShader:TStrings);
- var
- ShaderText : pchar;
- res : GLInt;
- VertexShaderObject : GLHandleARB;
- FragmentShaderObject : GLHandleARB;
- function GetInfo(shader:GLHandleARB):string;
- var
- blen,slen : GLInt;
- InfoLog : PGLCharARB;
- begin
- //Überprüft ob eine InfoLog vorliegt
- //Check if a infolog exist
- glGetObjectParameterivARB(shader, GL_OBJECT_INFO_LOG_LENGTH_ARB , @blen);
- //Wenn Informationen bereit liegen wird ein passender Speicher reserviert und die Informationen geladen
- //if a information exist then reserve enough memory and load the information
- if blen > 0 then
- begin
- GetMem(InfoLog, blen);
- //Wenn die Informationen abgeholt wurden, werden diese aus dem Log entfernt
- //If the informations read then the log will be clear
- glGetInfoLogARB(shader, blen, @slen, InfoLog);
- result:=string(infolog);
- Dispose(InfoLog);
- end;
- end;
- begin
- //Erstellt leere Shader- und Program-objekte
- VertexShaderObject := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
- FragmentShaderObject := glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
- //Lädt die Vertex- und Fragment-shader
- ShaderText:=pchar(VertexShader.Text);
- glShaderSourceARB(VertexShaderObject, 1, @ShaderText, nil);
- ShaderText:=pchar(FragmentShader.Text);
- glShaderSourceARB(FragmentShaderObject, 1, @ShaderText, nil);
- //Compiliert die Shaderobjekte und überprüft auf Probleme
- glCompileShaderARB(VertexShaderObject);
- {$IFDEF KARLOGGER}
- DebugMsg(GetInfo(VertexShaderObject));
- {$ELSE}
- WriteLn(GetInfo(VertexShaderObject));
- {$ENDIF}
- //Compiliert die Shaderobjekte und überprüft auf Probleme
- glCompileShaderARB(FragmentShaderObject);
- {$IFDEF KARLOGGER}
- DebugMsg(GetInfo(FragmentShaderObject));
- {$ELSE}
- WriteLn(GetInfo(FragmentShaderObject));
- {$ENDIF}
- FShader:=glCreateProgramObjectARB;
- //Fügt Vertex- und Fragment-Shader zu Shader zusammen
- glAttachObjectARB(FShader, VertexShaderObject);
- glAttachObjectARB(FShader, FragmentShaderObject);
- //Löscht den VS und FS
- glDeleteObjectARB(VertexShaderObject);
- glDeleteObjectARB(FragmentShaderObject);
- writeln(FShader);
- writeln(cardinal(@gllinkprogramARB));
- //Linkt die an Shader gebundenen Objekte zu einem Program
- glLinkProgramARB(FShader);
- writeln('geht');
- end;