DGL https://delphigl.com/forum/ |
|
Fehler beim Linken des ProgramObjects https://delphigl.com/forum/viewtopic.php?f=20&t=9506 |
Seite 1 von 1 |
Autor: | Bergmann89 [ Fr Okt 01, 2010 15:50 ] |
Betreff des Beitrags: | Fehler beim Linken des ProgramObjects |
Hey, ich hab seit paar Tagen meinen neuen PC und hab heut mal wieder was mit Shadern zu tun gehabt. Beim linken des ProgrammObjects kommt jetzt immer ein Fehler: Code: Fragment shaders(s) failed to link, vertex shaders(s) failed to link. unexpected error. unexpected error. Am Code hab ich nix geändert und mit meinem alten PC hat er noch funktioniert. Jetz hab ich ne ATI Radeon HD 5970 und Win7 x64. Kann mir da jmd helfen? Wäre super. €: hab den Code ganz vergessen^^ Code: procedure TglShader.Load; var FShaderLen, VShaderLen: Integer; begin //Objekte erstellen fFShaderObj := glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); Log(GetInfoLog(fFShaderObj)); fVShaderObj := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); Log(GetInfoLog(fVShaderObj)); //Code an ShaderObjekte übergeben VShaderLen := Length(fVShaderCode); FShaderLen := Length(fFShaderCode); glShaderSourceARB(fVShaderObj, 1, @fVShaderCode, @VShaderLen); glShaderSourceARB(fFShaderObj, 1, @fFShaderCode, @FShaderLen); glCompileShaderARB(fVShaderObj); Log(GetInfoLog(fVShaderObj)); glCompileShaderARB(fFShaderObj); Log(GetInfoLog(fFShaderObj)); //ShaderObjekte an ProgrammObjekt binden glAttachObjectARB(fProgObj, fVShaderObj); glAttachObjectARB(fProgObj, fFShaderObj); //ShaderObjekte freigeben glDeleteObjectARB(fVShaderObj); glDeleteObjectARB(fFShaderObj); //Shader Linken glLinkProgramARB(fProgObj); Log(GetInfoLog(fProgObj)); end; das ProgrammObject wird beim erstellen des TglShader-Objekts mit angelegt MfG & Thx Bergmann. |
Autor: | Coolcat [ Fr Okt 01, 2010 16:01 ] |
Betreff des Beitrags: | Re: Fehler beim Linken der ProgrammObjects |
Also mich wundert irgendwie das du mit GetInfoLog sowohl Compiler- als auch Linker-Fehler abfragst. Dafür sind nämlich unterschiedliche OpenGL-Funktionen zuständig. |
Autor: | Bergmann89 [ Fr Okt 01, 2010 16:17 ] |
Betreff des Beitrags: | Re: Fehler beim Linken der ProgrammObjects |
Hey, jetz wo du das sagst wunder ich mich auch, ich hab das so aus dem Tutorial. So sieht das ganze aus: Code: function TglShader.GetInfoLog(glObject: GLHandleARB): String; var Msg: PChar; var bLen, sLen: Integer; begin glGetObjectParameterivARB(glObject, GL_OBJECT_INFO_LOG_LENGTH_ARB , @bLen); if bLen > 1 then begin GetMem(Msg, bLen * SizeOf(Char)); glGetInfoLogARB(glObject, bLen, sLen, Msg); result := PChar(Msg); Dispose(Msg); end; end; Aber ist das am Ende nicht das gleiche wie glGetProgramInfoLog bzw. glGetShaderInfoLog? €: also mit glGetProgramInfoLog bzw. glGetShaderInfoLog erhalte ich genau die gleichen Fehlermeldungen... MfG Bergmann. |
Autor: | Coolcat [ Fr Okt 01, 2010 16:39 ] |
Betreff des Beitrags: | Re: Fehler beim Linken der ProgrammObjects |
Ah, ich stelle gerade fest das du wahrscheinlich die Extension GL_ARB_shader_objects benutzt, richtig? Ich bin OpenGL 2.0 gewöhnt wo die Funktion dann für Shader und Programme aufgetrennt wurde. Sorry. Zitat: Aber ist das am Ende nicht das gleiche wie glGetProgramInfoLog bzw. glGetShaderInfoLog? Eben nicht! Niemals eine Extension mit Funktionen des OpenGL Kerns mischen! Das kann funktionieren, aber auch merkwürdigste Fehler verursachen. |
Autor: | Bergmann89 [ Fr Okt 01, 2010 17:23 ] |
Betreff des Beitrags: | Re: Fehler beim Linken der ProgrammObjects |
Okay, gut zu wissen. Ich hab grad nochma den Rest des Codes durchgearbietet und geguckt, ob ich irgendwo nicht die Funktion der Erweiterung benutze. Aber der Fehler kommt immer noch. Dann hab ich mir gedacht, das ich ja mal ein anderes Programm testen kann, was auch Shader benutzt. Also hab ich mir nochma schnell Geal gesaugt un getestet. Da funktionieren die Shader auch nicht... |
Autor: | Coolcat [ Fr Okt 01, 2010 17:28 ] |
Betreff des Beitrags: | Re: Fehler beim Linken der ProgrammObjects |
Ist die Extension den verfügbar? Bevor du eine Extension benutzt immer gucken ob die auch da ist. Gut möglich das ein neuer Treiber dieser uralte Extension nicht mehr kann. |
Autor: | Bergmann89 [ Fr Okt 01, 2010 17:45 ] |
Betreff des Beitrags: | Re: Fehler beim Linken der ProgrammObjects |
Ich hab auf GL_ARB_shader_objects geprüft, die müsste ja alle Funktionen enthalten die ich benutze und die is verfügbar. Oder muss ich auch noch auf GL_ARB_vertex_program, GL_ARB_vertex_shader, ... prüfen? €: es is aber vlt eh besser, wenn ich es auf die Funktionen vom OpenGL Kern umbau, oder? Ich hab auch grad ma noch den neusten Treiber geladen. Jetz schmiert er beim Linken mit ner Zugriffsverletzung ab -.- |
Autor: | Bergmann89 [ So Okt 03, 2010 01:17 ] |
Betreff des Beitrags: | Re: Fehler beim Linken des ProgramObjects |
Hat niemand eine Idee, wie ich den Fehler noch beheben könnte? Kann es sein, das es ein Fehler im Treiber ist.? Sollte ich mcih da evtl mal an ATI/AMD wenden? |
Autor: | Coolcat [ So Okt 03, 2010 08:34 ] |
Betreff des Beitrags: | Re: Fehler beim Linken des ProgramObjects |
Versuch es erst mal mit den Funktionen aus dem OpenGL-Kern. Wenn das nicht geht lass dir von irgendwem eine Anwendung geben die definitiv auf einer aktuellen ATI-Karte unter Win7 läuft. Wenn die auch nicht geht, dann frag mal ATI. |
Autor: | Bergmann89 [ So Okt 03, 2010 14:35 ] |
Betreff des Beitrags: | Re: Fehler beim Linken des ProgramObjects |
Hey, ich hab es ja schon mit den OpenGL-Funktionen probiert, die gehen auch nicht (hab ich oben vergessen zu schreiben). Da guck ich ma ob jmd ungefähr das selbe System wie ich hat. Wenn ich Neuigkeiten hab meld ich mich nochma. MfG & Thx Bergmann |
Autor: | Bergmann89 [ So Okt 03, 2010 18:45 ] |
Betreff des Beitrags: | Re: Fehler beim Linken des ProgramObjects |
Hey, ich hab grad festgestellt, das es am ShaderCode liegt. Ich hab zum test einfach mal einen Shader erstellt, der einfach nur Zeichnet und der funktioniert. Der Shader der jetzt nicht geht ist ein PerPixelLight-Shader. Seltsamerweiße ging der mit meinem alten System. Ich hab auch den Fehler gefunden, nur versteh ich es nicht. Wenn ich im Fragment-Shader auf lightvec mit einem festen Index zugreife funktioniert es. Wenn ich die Schleifenvariable benutze kommt der Fehler. Seltsamerweiße funktioniert der Zugriff im Vertex-Shader auch über die Schleifenvariable. Hier der Code: Code: //Vertex const int LIGHT_COUNT = 1; varying vec3 N; varying vec3 V; varying vec3 lightvec[LIGHT_COUNT]; void main(void) { gl_TexCoord[0] = gl_MultiTexCoord0; N = normalize(gl_NormalMatrix * gl_Normal); V = vec3(gl_ModelViewMatrix * gl_Vertex); for(int i = 0; i < LIGHT_COUNT; i++){ lightvec[i] = normalize(gl_LightSource[i].position.xyz - V); } gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; gl_FrontColor = gl_Color; } //end //Fragment const int LIGHT_COUNT = 1; const float PI = 3.14159265; varying vec3 N; varying vec3 V; varying vec3 lightvec[LIGHT_COUNT]; uniform sampler2D Texture0; void main(void){ vec3 Eye = normalize(-V); vec4 EndColor = vec4(0.0, 0.0, 0.0, 0.0); vec4 EndSpec = vec4(0.0, 0.0, 0.0, 0.0); for(int i = 0; i < LIGHT_COUNT; i++){ vec3 Reflected = normalize(reflect(-lightvec[0], N)); //HIER kommt der fehler wenn ich [i] benutze vec4 IAmbient = gl_LightSource[i].ambient * gl_FrontMaterial.ambient; vec4 IDiffuse = gl_LightSource[i].diffuse * gl_FrontMaterial.diffuse * max(dot(N, lightvec[0]), 0.0); vec4 ISpecular = gl_LightSource[i].specular * gl_FrontMaterial.specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess); EndColor += (IAmbient+IDiffuse); EndSpec += ISpecular; } EndColor += gl_FrontMaterial.emission; gl_FragColor = (gl_FrontLightModelProduct.sceneColor + EndColor); //* texture2D(Texture0, vec2(gl_TexCoord[0])); gl_FragColor += EndSpec; } //end MfG Bergmann. |
Autor: | Flash [ So Okt 03, 2010 19:56 ] |
Betreff des Beitrags: | Re: Fehler beim Linken des ProgramObjects |
Ist das reproduzierbar in einem Minimalshader? Wenn ja, dann Bugreport an ATI. |
Autor: | Bergmann89 [ So Okt 03, 2010 21:17 ] |
Betreff des Beitrags: | Re: Fehler beim Linken des ProgramObjects |
Hey, also das geht: Code: //Vertex const int COUNT = 8; varying vec3 vecarr[COUNT]; void main(void) { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; for (int i = 0; i < COUNT; i++){ vecarr[i] = vec3(i/COUNT, 1.0, 1-i/COUNT); } } //end //Fragment const int COUNT = 8; varying vec3 vecarr[COUNT]; void main(void){ gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); for(int i = 0; i < COUNT; i++){ gl_FragColor *= vec4(vecarr[i], 1.0); } } //end komisch... MfG Bergmann. |
Autor: | Coolcat [ So Okt 03, 2010 21:47 ] |
Betreff des Beitrags: | Re: Fehler beim Linken des ProgramObjects |
Könnte es etwas damit zu tun haben das du hier so komisch auskommentierst? Zitat: //* texture2D(Texture0, Meine Theorie ist das der dadurch das du das varying-Array benutzt auf eine andere GLSL-Version schaltet. (*) In dieser anderen Version nimmt der das als /* ... */ Kommentar...da aber kein */ kommt gibt's nen Error. (*) Ich glaub GLSL 1.0 kann das noch nich, müsste man mal checken, habe gerade die Spec nicht zur Hand. |
Autor: | Bergmann89 [ So Okt 03, 2010 22:34 ] |
Betreff des Beitrags: | Re: Fehler beim Linken des ProgramObjects |
ohne den Kommentar gehts auch nicht. Außerdem hat es ja mit meinem alten System funktioniert (auch mit dem Kommentar) Ich hab noch ne andere Idee, das check ich morgen mal, dann meld ich mich nochma. bis dahin gn8 |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |